[最適化ふり返り]YouDub 翻訳モジュールはこの丸一日で何をしたのか、どの方向が効いて、どれがすでに反証されたのか
この日の主戦場は実は TTS ではなく、翻訳モジュールだった。
理由は単純だ。ボイスオーバー(配音)モジュールは後段で、目標の声質により近い方式へ差し替え可能になってきた。一方で完成動画における最も目立つ短板は、依然として字幕翻訳そのものが B 站の成熟した完成品っぽくないこと、特に次の点だ:
- rolling caption の場面で、前の一文が次の一文の情報を食ってしまう。
- 英語の元字幕は断片的で、中国語は逐文で硬く訳すと長くてぎこちない。
- 「文を補完する」ことを追いすぎると、後の punchline(punchline)・名詞・動作を前倒しで漏らしてしまう。
- 「断片の境界を保つ」ことを追いすぎると、中国語が細切れになりすぎて、実際の完成字幕っぽくなくなる。
なので今回の最適化は、「ある一本の動画を直す」から「汎用化できる翻訳評価・反復フレームワークを作る」へ重点を切り替えた。
この日具体的にやったこと
1. まずベンチマーク体系を組み、感覚調整をやめた
単一動画を一行ずつ直し続けるのではなく、C:\\Users\\1\\bili_yt_export\\bili_youtube_first100.csv に入っている 90 以上の B 站/YouTube 対照サンプルでベンチマークを直接作った。
それに対応してやったことは2つ:
scripts/benchmark_translation.pyを拡張scripts/analyze_translation_artifact.pyを新規追加
前者は翻訳+切句+吹替用台本リライトのフルチェーンを一括実行し、各 case の指標と中間生成物を出力する。
後者は各 case を分解して見る担当で、特に以下の層を見る:
source_rowsprepared_source_rowstranslated_rows_pre_splitpredicted_rowsreference_rows
ここが非常に重要だった。というのも、後続の後処理が原因ではなく、LLM が translated_rows_pre_split の時点で既に後続内容を借りてきている問題が多いからだ。
2. コア問題を明確に特定:rolling-caption が後文を借りる
この日の最大の収穫は、ある指標が急上昇したことではなく、主問題を正確に特定できたことだ。
YouTube の自動字幕/公式字幕には rolling-caption 構造が大量にあり、多くの行が元々「半文」「残句」「行を跨いで継続する文」になっている。
ここでモデルに「逐句で自然に訳して」とやると、未来の1〜2行分の情報を現行に借り込む傾向が強くなる。結果として中国語はスムーズに見えるが、タイムライン上では前倒しのネタバレになる。
この問題は zwIqbrD6JX4 と o2V-JJpJH_I の2つの hard case で最も顕著だった。
3. fragment_guard をデフォルト主線に昇格
上の発見に基づき、fragment_guard をデフォルトで有効にした。
核となる発想は「中国語を無理やり欠けさせる」ことではなく、モデルに明確な制約を課すこと:
- 現在の id は、現在の元行に既に出現した意味だけを表現する。
- 元行が rolling-caption の未完断片だと明らかな場合、中国語が多少オープンでもよいが、未来内容を前倒しで補完しない。
これは現時点で「安定して有効と証明でき」、かつ主線のデフォルト値として入れる意思がある唯一の変更だ。
現時点で有効と確認できた結果
主線設定
現在の安定主線は概ね:
- provider:
openai_context - api base:
http://192.168.10.88:8317/v1 - model:
gpt-5.4-mini - prompt profile:
auto_hybrid - temperature:
0 - fewshot:
8 fragment_guard=on- その他の実験スイッチはデフォルトでオフ
確認済みの改善データ
fragment_guard は局所実験から中規模サンプルまで、いずれも正の効果:
- 4 case 比較:
52.432 -> 53.322 - 8 case 比較:
55.958 -> 56.058
現行 8 case 主線レポート:
- composite:
56.058 - chrF:
0.3707 - char F1:
0.7729 - density MAE ratio:
0.4272
少なくとも現行主線は、以前の版より「後文を前倒しで借りる」ことが起きにくく、全体のリズムも B 站完成字幕の分布に近づいている。
この日でほぼ反証できた方向
1. fragment_hints の全局オン
まったく無意味ではなく、むしろ一部の case では強い。
例えば:
zwIqbrD6JX4は hard2 で54.439から57.980へ上昇VT6rLcVKhzgも明確に改善
だが問題は不安定なこと。
8 case に載せると全体は 56.058 から 55.296 に落ちた。
つまりこれは「特定構造に効く強い薬」であって、現時点でデフォルトオンにできる主線戦略ではない。
2. auto_hybrid_v2
より攻めた profile 自動選択ロジックを作り、動画ごとに literal_context / bilibili_dub / bilibili_pacing を自動で切り替えようとした。
結果は 8 case で 54.375 まで落ち、現行主線 56.058 に負けた。
結論は単純:ゲーティング(門控)ロジックがまだ正確でなく、現段階で主線には載せられない。
3. 全文翻訳レンジを無理に拡大
2方向試した:
- full-context の閾値を上げ、より多くの動画を全文一発翻訳へ
- chunk を小窓から一気に拡大
見た目は「全文理解してから翻訳」に近づくが、安定した増益はなかった。
理由は、文脈が増えるほどモデルが id を跨いで借用しやすくなり、タイムラインがむしろ乱れやすいからだ。
4. chunk 粒度を極端に細かくする
例えば chunk_max_items=2 のような発想。直感的には串刺し(串句)を減らせそうだが、実際の効果は悪く、速度も明確に遅くなった。
hard2 の結果は品質改善につながらず、遅延だけが大幅に増えた。特に o2V-JJpJH_I が重い。
5. 「B 站風」プロンプトを盛り切る
以下をテストした:
literal_contextbilibili_dubbilibili_pacingauto_hybrid
mixed4 では auto_hybrid が最良、literal_context が次点で、他の「強スタイル」寄り profile はむしろ悪かった。
つまり今は「プロンプトが B 站っぽいほど良い」ではなく、まず文脈境界・断片文・timing アラインメントを解決してから、スタイル表現を語るべきだ。
この日で最も重要だった認知の変化
当初は最大問題が「訳文が地道でない」ことだと思っていたが、違った。
より根本の問題は実は:
- 先験入力そのものが断片的
- 断片間の重なりが大きい
- 中国語を自然にするには、適度な語気・構造補完が必要
- しかし補完しすぎると、未来内容の前倒し漏洩になる
ゆえに翻訳モジュールで最も難しいのは、単なる「中訳英」や「英訳中」ではなく:
時間境界を越えない 前提で、断片英語を 本当の完成字幕のような中国語リズム に整理すること。
これは普通の機械翻訳(MT)とは別問題だ。
まだ解けていない点
主線は以前より安定したが、目標にはまだ遠い。特に、あなたが提示した B 站ケースの完成度には達していない。
現状、明確に未解決な点:
- 一部 hard case は依然として後文を借りる
- 一部 case で中国語がまだ「翻訳調」
- 切句後の長さマッチがまだ不安定
fragment_hintsの安定したゲーティング条件が未発見- few-shot の数量とサンプル選定がまだ最適化できていない
次に最も追う価値がある方向
現時点で追うべきは、玄学(玄学)っぽい prompt を増やすことではなく、この3つ:
1. fragment_hints を全局スイッチではなく特徴量ゲーティングにする
特定 case で強く効くことは既に分かっている。
次は以下特徴でゲートすべき:
- fragmentary source ratio
- overlap ratio
- punctuated source ratio
- short/tiny line ratio
つまり「高断片・高 rolling-caption」動画だけで有効化し、全局一刀切りにしない。
2. few-shot 数の検証を継続
今日の最後に出た小さなシグナル:fewshot=4 が hard2 で初めて小幅の純増益を出した:
- baseline hard2:
50.454 - fewshot=4 hard2:
50.600
増益は大きくないが方向は正。
mixed4 と mid8 でも維持できるなら、現行 8 の few-shot はノイズが多すぎる可能性がある。
3. 「文脈だけ渡して、翻訳権限は渡さない」chunk context を継続
chunk の前後文ウィンドウ版は追加したが、まだ実験段階。
この方向の価値は:
- モデルに段落レベルの理解能力を与える
- 同時に、出力はターゲット chunk の id のみに要求する
単に chunk を拡大するより、理論上「全文理解はするが越境しない」翻訳に適している。
この日の結論
一言でまとめるなら:
この日の最大成果は翻訳モジュールを完成させたことではなく、「なぜ難しいのか/今の主ボトルネックはどこか/どの方向が効くか/どれがもう時間を燃やす価値がないか」という認知をクリアにしたことだ。
少なくとも今は明確:
- このプロジェクトの翻訳問題は、本質的に普通の MT ではない
- rolling-caption の境界が主矛盾
fragment_guardは現時点で唯一の安定した正の効果fragment_hintsはポテンシャルがあるが、必ずゲートが必要- few-shot と文脈戦略はまだ掘る価値がある
このツールを本当に「世界で一番の外語動画翻訳吹替」方向へ磨くなら、翻訳モジュールはもう思いつきで prompt をいじるだけではだめで、ベンチマーク駆動・case 帰因・小刻み A/B の道を引き続き進む必要がある。
今日は少なくとも、その道を敷けた。