- StarCraft: Brood Warの高度な戦略談義は長年にわたり韓国語の動画や配信に集中しており、非韓国語圏コミュニティは戦略知識を追うのが難しかった
- 既存の翻訳は、韓国語話者による手作業やGoogle Translateに頼るしかなく、ビルドオーダーやコミュニティのスラングが直訳されて文脈がしばしば崩れていた
- 新しい流れでは、
yt-dlp、Whisper、Google Colab、LLM、TeamLiquid用語辞典を組み合わせ、韓国語音声を文字起こしし、Brood Warプレイヤーが理解できる英語字幕へ変換する
- 字幕配布はYouTubeの所有者権限に妨げられないよう、TamperMonkey UserScript、Pastebin、Google Sheets、Apps ScriptをつないだBWKT Clientで処理する
- 約2週間で作ったハック的なプロジェクトだが、約30米ドルと無料ツールの組み合わせだけで1日あたり約7本の動画を翻訳でき、多言語対応のような拡張余地も残っている
韓国語のBrood War知識にアクセスしにくい理由
- StarCraft: Brood Warは1998年発売の競技RTSで、今も活発なコミュニティがある
- ハイレベルなBrood Warの生態系は、事実上韓国中心で動いている
- プロ選手、チーム、大会の大半が韓国に基盤を置いている
- 熱心な視聴者やコミュニティもかなりの部分が韓国にある
- 非韓国人のコミュニティ構成員は自分たちを“foreigners”と呼ぶ
- Brood Warでは、チェスのように長年蓄積された対戦記録と戦略研究が重要である
- 高いレベルでは、ゲームをプレイするのと同じくらい学ぶことも重要である
- 現代の議論の多くは、プロBrood Warプレイヤーの動画やライブ配信で行われている
- チェスの“Sicilian defense”や“Najdorf variation”のように、Brood Warにもコミュニティが作ったドメイン特化言語がある
- こうした用語はルールブックの表現ではなく、長期間の研究と分析を圧縮して伝えるための言語である
Foreigner Knowledge問題
- 非韓国語圏コミュニティで韓国語を流暢に話せる人は非常に少ない
- 韓国語を流暢に使えるなら、より限定的で質の低い非韓国語圏の資料に留まる理由はあまりない
- コミュニティは、韓国語ができる人のために資金を集めてYouTube字幕の翻訳を依頼してきた
- 翻訳作業は大変で遅い
- 報酬も客観的に見て良いとは言えない
- それでもこの方法で、年間数十本ほどの動画が翻訳されてきた
- Google Translateのような機械翻訳は日常文には役立つが、Brood Warの専門用語にはあまり適していない
- ツールが触れていないスラングやビルド用語が多い
- 直訳はむしろ文脈を壊してしまう
直訳が失敗するポイント
- 韓国語のチュートリアルには、
12 앞마당、11 스포닝풀、10가스、투해처리、3해처리、안 3해처리のようなBrood Warのビルド用語が含まれる
- Google Translateはこれを
12 courtyard、two-processing、3-point processingのように、ゲーム文脈に合わない表現へ変えてしまう
- Brood Warに“courtyard”は存在しない
- “starting off the most affluently”は、“economic opener/build”を不自然で冗長に置き換えた表現である
- “3-point processing”はBrood Warプレイヤーにとっても意味をなさない
- 一部の単語は判別できる
Toss、build、fast gas、moderately fast tech-tree、Terranなどは残る
- しかし大半が直訳ノイズのため、判別できる単語の文脈までぼやけてしまう
- 低品質な自動字幕と直訳された専門用語が重なることで、非韓国語圏コミュニティは韓国コミュニティより数十年遅れている状態になったと見ている
新しい翻訳プロセス
- 新しいプロセスでは、同じ字幕を
12 Natural、economic opener、Protoss、two-Hatchery build、11 Spawning Pool、10 Gas、third Hatcheryのように、Brood Warプレイヤーが理解できる表現へ置き換える
- 翻訳は完璧ではないが、動画の主題がすぐ伝わるほど信号対雑音比が大きく改善する
- これまでは年間数十本の動画翻訳が限界だったが、新方式では1人が余暇時間で1日あたり約7本の動画を翻訳している
字幕生成パイプライン
-
yt-dlpとWhisper
- 当初は
yt-dlpでYouTubeの自動韓国語字幕をダウンロードして翻訳しようとしたが、自動字幕の品質は実用的ではなかった
- その代わりに、
yt-dlpで動画の音声トラックをダウンロードし、Whisperで直接文字起こしした
- YouTube字幕よりもクリーンで完全な結果が得られ、ゲーム内の音やマウスクリックのようなノイズもよりうまく無視できるようだった
- 初期はWhisperをローカルで動かし、約10GB VRAMを使用していた
- WindowsでPython、venv、CUDA、gitなどを入れる必要があり、他の協力者が使うには制約が大きかった
-
Google Colab
- WhisperはPythonの
pipでインストールでき、Google Colabは無料のJupyterノートブックサービスと無料GPUを提供する
- Colab GPUはWhisperを動かすのに十分なVRAMを備えている
- パラメータ化された読み取り専用ノートブックを共有する方式が配布モデルとして適していた
- 非技術ユーザーでもハードウェアに関係なく実行でき、ノートブックの更新だけで最新機能を受け取れる
- git cloneや繰り返しのダウンロードは不要である
- ノートブックはYouTube URLを1つ受け取り、韓国語SRTファイルを生成してダウンロードできるようにする
-
LLMと韓国語スラング辞書
- TeamLiquidは古くからある非韓国語圏のBrood Warコミュニティである
- 約15年前、TeamLiquidメンバーのkonadoraが「BW実況者が使う韓国語用語」辞書のフォーラム投稿を作成した
- この投稿を
KoreanSlang.txtというMarkdownファイルにコピーしてLLMへ渡した
- プロンプトでは、韓国語字幕を英語へ翻訳しつつ、
KoreanSlang.txtとStarCraft: Brood Warの文脈を参照するよう指定した
- 直訳より明確さを優先し、タイムスタンプとファイル形式は維持させる
- 重複字幕や明白な誤りは修正してよく、必要なら短い翻訳者ノートを字幕に入れられるようにした
- 聞き取れない箇所は
(unintelligible)に置き換え、コピーしやすいようコードブロックで出力させる
- ProアカウントのChatGPTにWhisperが作成した韓国語字幕を入力し、翻訳を依頼する形で使っている
字幕消費パイプライン
-
YouTube字幕の制約とBWKT Client
- YouTube標準の字幕機能では、動画所有者だけが字幕を設定または更新できる
- 動画をダウンロードして再アップロードし、その後で字幕を設定する流れを避けるため、別のクライアントを作った
- UserScriptはYouTube動画にボタンを追加し、対応する翻訳字幕があればそれをダウンロードする
- SRTとVTTファイルをパースし、YouTubeプレイヤーの下にある小さなコンテナへ字幕を表示する
- このクライアントの名前はBWKT Clientである
-
Pastebin、Google Sheets、Apps Script
- 字幕はテキストファイルなので、素早く共有できる保存先としてPastebinを使っている
- シンプルで、すでにプレミアムアカウントがあり、トラフィックが問題になるとは考えていない
- マッピングデータに必要なのは
YouTube URLとSubtitle URLの2列だけである
- 将来的には
Language列を追加できる
- Google Sheetsをデータベースのように使うと、手動チェックや更新がしやすく、他の人と共有するのも簡単である
- Apps ScriptはGoogle WorkspaceにアクセスできるJavaScriptランタイムで、組み込みWebサーバーも提供する
function doGet(req) { /* ... */ }の形でYouTube動画IDを受け取り、対応するPastebin URLを返す
- 公開読み取り専用データベースはGoogle Sitesページで提供している
改善の余地とテスト
- プロジェクトは約2週間で作ったハック的な構成物で、予算は約30米ドルだった
- ChatGPTとColabの追加GPU時間に費用を支払った
- どちらも厳密には必須ではないが、あると便利だった
- 拡張候補として多言語対応がある
- 非韓国語圏コミュニティには米国のプレイヤーだけでなく、メキシコ、ポーランド、ルーマニア、中国、台湾のプレイヤーもいる
- 数十言語へ翻訳でき、作業量もそれほど大きくないと見ている
- 技術的な改善点も残っている
- 現在のBWKT Clientは、字幕のないYouTube動画にもボタンを表示してしまう
- Apps ScriptのWebサーバーに翻訳済み動画インデックスを返すエンドポイントを追加すれば、ボタン表示の有無を制御できる
- 何人かのBrood Warユーザーと一緒に13分の動画を見ながら字幕をテストした
- 約5分後には字幕品質の評価を忘れ、動画を見ながら議論し、短いクリップを巻き戻して見返し、一時停止して話していた
- 字幕はテストを通過した
プロジェクトの性格
- 性能、拡張性、レイテンシはこのプロジェクトの中核的な問題ではなかった
- 大部分は既存ツールをつなぐグルーコードだった
- ユーザースクリプトとColabノートブックのPythonコードは短く、保守しやすい
- Webサーバーは単純な本番CRUDシステムに近く、複雑化する大きな理由はない
- 制作者はこのプロジェクトを、自分が公開したものの中で最もjankyなプロジェクトだと見なしつつも気に入っている
1件のコメント
Hacker Newsのコメント
韓国人のBrood Warプレイヤーであり音声認識研究者として、楽しく読んだ。
そもそもの韓国語の文字起こしにもかなり誤りが多く、後段の大規模言語モデルがそれをかなり見事に修正したように見える。たとえば
12 안마당 빌드は実際には12 앞마당 빌드だった可能性が高く、Brood Warプレイヤーにはずっと理解しやすかったはず。同様に투에처리 빌드は意味をなさず、투해처리 빌드、つまり 2ハッチェリービルドとして文字起こしされるべきだった。そのため、俗語辞書をWhisperの推論過程に直接入れる**文脈バイアス(contextual biasing)**も役立つかもしれない。方法は多いが、最も単純にはWhisperの最終予測層で、辞書にある俗語トークンの確率を定数倍だけ上げるやり方が可能。HuggingFaceライブラリでも比較的簡単に実装できる: https://huggingface.co/docs/transformers/en/internal/generat...
courtyardやfrontyardが何を意味するのかはまったく分からない。ただ英語圏では、建物、ユニット、技術、戦略名を激しく略して呼ぶことがよくある。韓国語でもそうなのだろう。12バラックビルドは普通
12 rax、2ハッチェリーミュータリスクビルドは2 hatch muta、3ハッチェリーヒドラリスクのタイミング攻撃/オールインは3 hatch hydra bustのように呼ぶ。ctranslate2に同じ機能を実装するPRがあり、これを通じてfaster-whisperにも公開される可能性がある: https://github.com/OpenNMT/CTranslate2/pull/1789
記憶では、その建物はハッチェリーでザーグリングや他のユニットを作れるようにし、アップグレード研究も可能にする用途だった。1つ建てればすべてのハッチェリーで該当ユニットが解禁され、自身でユニットを生産するわけでもないので、複数建ててもユニット生産量は増えない。
理論上はアップグレードを並列で研究するために複数建てることはできるが、可能なアップグレードも3つ程度しかないので、12個建てる理由はなさそうだ。敵にいくつか壊されてもザーグリング生産を続けるための予備なら別だが、それでも12個は多すぎる。
なので、正確にはどんな動機だったのか気になる。昔のことなので、的外れかもしれない。
タイトルにだまされてはいけない。この記事は、StarCraftの実況解説を翻訳し、よりアクセスしやすくする作業に対する非常に徹底的で創造的なアプローチだ。
著者が正しく指摘しているように、27年のあいだにゲーム解説は韓国語でも英語でもなく、ひとつのドメイン特化言語になってしまった。自動スクリプトと人工知能を使って、おおよそ何を言っているのかを把握し、それを一貫した文章にするやり方は本当に素晴らしい。
英語が母語でない立場から見ると、この記事はさまざまな分野の翻訳、とくにコンピュータ関連の文章やソフトウェア開発の翻訳で直面する問題とまったく同じに見えた。
翻訳しにくい用語が非常に多い。shardingやhashのような単語がそうで、唯一現実的な解決策は、時間をかけて各言語にある程度合わせて借用していくことだけだと思う。ただしそのためには、2つの言語のあいだの隔たりをある程度越えられるコミュニティが必要で、この場合は英語を学ぶことも含まれる。
スペイン語が母語だが、スペイン語でソフトウェア開発について話すと、英語由来の用語が次々に出てくる。これをうまく処理する確実な方法はなさそうで、自動翻訳がどう扱うのか興味深い。結局、社会的に2つの言語が混ざる過程を経て、その中でどの用語が生き残るのかを見る必要がある。
記事で述べられている基準でいえば、韓国語に堪能ではなくてもある程度分かる人と、当然ながらゲーム自体を知っている人が必要になる。
debugにかなりよく対応する既存のスペイン語depurarを習ったが、多くのスペイン語話者は英語をそのまま借りてdebuguearと言う。コンピュータやソフトウェアの性能を語るとき、メキシコでは
desempeñoと習ったが、アルゼンチンでは同じ意味でel performanceと言うのも聞いた。既存のスペイン語の単語を探すより、英語の借用語をそのまま使う場合が最も多いように思う。shardingと言えばいい。本当に翻訳がほとんど不可能なのは日常語だ。ドイツ語の
Brotは、英国人がbreadと呼ぶひどいものとはかなり違う含意を持つが、より良い単語があるわけでもなく、そのまま借用すると多くの文脈でかなり不自然に聞こえる。技術的文脈でshardingを借りるより、はるかに不自然だ。時間をかけて言語に合わせて借用される良い例は、ドイツ語の鉄道用語に見られる。最初は技術を英国から導入したため全部英語だったが、時間が経つにつれて大半はドイツ語らしい単語に変わった。
Lokomotiveのように英語と同じギリシャ語・ラテン語からの借用を作り直したものもあるが、stationは今ではBahnhof、trainはZugになっている。翻訳に関する記事で、著者が信号対雑音比を完全に逆に使っているのは少し面白い。信号対雑音比が高い、たとえば9000を超えるというのは、とても良いという意味
信号が多く、雑音が非常に少ないという意味なので、信号対雑音比が低くなるというのは雑音が増えるという意味
jargonと言うべきところで、ドメイン特化言語とも書いているように思うGoogle Translate 版も十分理解できたが、Brood War とザーグの12ハッチェリー・オープニングの細部をとてもよく知っていたから可能だった
ChatGPT と Claude は韓国語テキストを驚くほど上手に翻訳していた:
Today I'll teach you about the 12 Hatchery build. I'll explain the types of 12 Hatchery builds, their advantages and disadvantages, and the build orders in a simple but detailed way. Against Protoss, this is the build you use when you want to start with the most economic advantage. Against Terran, there are several builds you can do with 12 Hatchery, so I'll explain some of the most commonly used builds. The first is the two-hatchery build that starts with 12 Hatchery: 12 Hatchery 11 Spawning Pool 10 Gas This build uses early gas, and it's often used when you want to quickly transition into a three-hatchery build with three gas bases. The second build is: 12 Hatchery 12 Pool 12 Gas This build allows for moderately fast tech tree and moderately fast three-hatchery expansion. This build is commonly known as the "safe three-hatchery" build, and you can think of it as a build that enables both quick Mutalisks and quick third base.著者が見るなら: yt-dlp で帯域幅を節約するために低画質版の動画を取得できる
yt-dlp -f "bv[height<=720]"ここに URL や動画 ID を入れると、最大 720p 品質でダウンロードする
子どもの頃に資源マップだけ遊んだことがある人間の間抜けな質問だけど、建物の前の数字は何を意味しているのか?
12 Hatcheries と言うと、ハッチェリーを12個建てることも理論上は可能だが、現実的ではなさそうに見える。スポーニングプール12個は当然役に立たない。なので、ビルド順リストでの位置なのかと思った
ところが
12 Hatch, 12 Pool, 12 Gasのようなビルドも出てくるので、その解釈ではあまり筋が通らない。単なるリストではなさそうで、ツリーだから12がその建物の深さなのかとも思ったが、ガスの前に建物を11個建てるのは想像しにくいし遅すぎるように見える。ユニットも含むのか、それともドローン/オーバーロードだけを数えるのか気になる4-poolingから始まった用法。ザーグでワーカーが4体しかいない時点でスポーニングプールを建て、4体目のワーカーを作り直してからザーグリングを生産し、序盤攻撃、つまりラッシュをするやり方すると相手がありとあらゆる罵倒をして、性的指向まで疑ってくる
スポーニングプール12個は当然役に立たないという話に関連して、Husky の動画の中に、実際にスポーニングプールを9個建てて 9 pool をやったものがあったのをかすかに覚えている数字はその構造物を建てるときに到達しているべきサプライ数を意味する。だから
12 hatch 12 pool 12 gasは、ワーカー12体まで行った後、資源がそろい次第その3つの建物を順番に建てるという意味ザーグはワーカーが実際に建物に変化するので、12に到達してハッチェリーを建て、ワーカーを1体追加で作ってからスポーニングプールを建て、さらにワーカーを1体作ってからガス精製所を建てる流れなのだと思う
Google Translate がかなり良くなった時期でも、囲碁関連の中国語・日本語テキストを効果的に翻訳するのは難しかった。この記事で出てきたのと似た問題があった
中国語と日本語の多くの単語は、囲碁の文脈では非常に特定の意味を持つが、一般文脈では普通の意味もある。たとえば
koは囲碁では特定のルール上の状況だが、一般にはrobberyのような意味なので、Google Translate が一般的な方法で翻訳して全体が理解不能になっていた最新の大規模言語モデルには今では、
中国語の囲碁図解を翻訳する。翻訳は自然であるべきで、囲碁専門用語の使用を避けてはならない。たとえば 拆 = extension, 夹 = pincer, 刺 と 觑 = peepのような指示を前に付けられ、結果は素晴らしい。事実上、読みたい資料をほぼ全部読めるほど。学習データに囲碁資料が十分あったようで、さらに特別な作業が必要なかったのは運が良かったチェス関連で著者が見るなら、いくつか修正がある。チェスの序盤の手順は英語で
openersではなく openings と呼ぶ。白専用と黒専用のオープニングが別々にあるわけでもなく、もちろん個々のプレイヤーが片方の視点から特定のオープニングを研究することはできる。オープニング研究は、最高レベルに行くほどむしろより根本的なものと見なされる。そして該当するシシリアンの変化はNajdorkではなく Najdorfこの記事はよかった。以前、World Cyber Games の米国地域予選の試合を何度かやってみようとしたことがあったが、ほかの人たちがどれほど速いのかにいつも驚かされた。
後に韓国で生中継されているのを見て、プレイ速度に完全に圧倒された。戦略の観点では、Protoss の Zealot が Zergling を3発ではなく2発で倒せるようになる計算を、あるブログで紹介していたとき、自分が見落としていたゲームのごく基本的な部分に気づいた。そのとき、これはチェスのようなゲームなのだと理解し、のめり込んだ。
誤訳なのは分かっているが、
natural expansionを courtyard と訳した表現はかなり気に入っている。front yardも気に入っている。最近のマップの一部に裏庭ベースがある SC2 では筋が通る。こうした裏庭ベースはチームマップでもよく登場し、どのプレイヤーが前側を取るかを決めるのが戦略になる。Protoss と Terran はシールドバッテリーやバンカーを一緒に建てられるが、Zerg はクリープ上で強化効果を受け、はるかに速く前方へ広げられる。