なぜリアルタイム翻訳をやりたいか
NVIDIA の Jensen Huang の基調講演は、毎回ライブで見たい。だが英語のまま流れていくと、聞き取れなかった一文を巻き戻している間に次の発表が始まり、置いていかれる。日本語の同時字幕があれば、画面を見ながら内容を追える。
そこで今日、新しいプロジェクトを立ち上げた。英語の基調講演を YouTube で流しながら、その場で文字起こしして、英語の下に日本語訳を出す。Jensen が話した言葉が、画面の中で英語と日本語に二段で積まれていく状態を目指す。
ゼロから作らず、手元の文字起こしツールに足す
最初に確認したのは「今あるツールが翻訳にどこまで対応しているか」だった。手元には音声を文字起こしする即録くん(Electron アプリ)があるが、調べてもらうと現状の機能はこうだった。
- 音声 → テキスト: Deepgram の API で文字起こし
- 後処理: Gemini で誤字修正のみ(プロンプトに「絶対に翻訳しないこと」と明記されていた)
翻訳機能はゼロ。ただYouTubeのシステム音声を拾う基盤と、Deepgramの言語を en に切り替えるだけで動く英語文字起こしは既にあった。ここまで揃っているなら、ゼロから組み直すより既存ツールに「英→日翻訳」を一本足すほうが圧倒的に速い。既存ツールへの追加で進める方針にした。
音声は Deepgram、翻訳は Gemini という役割分担
構成はシンプルに二段で分けた。
YouTube(英語音声)
↓ システム音声キャプチャ
Deepgram API … 音声 → 英語テキスト(従量課金・残高が減る)
↓ 文字起こし結果(final)
Gemini API … 英語 → 日本語(無料枠で運用)
↓
画面: 英語 + 日本語訳を二段表示
音声認識は Deepgram に任せる。ここはお金がかかる前提のところで、残高から実費が引かれていく(今日のテストで 187.54 → 187.49、約 $0.05 消費した)。翻訳は Gemini(gemini-2.0-flash)に任せる。
ここでひとつ確認しておきたかったのが課金だった。Gemini は Google AI Studio の無料ティアで呼べる方式になっていて、残高が減る従量課金とは別物。つまりお金がかかるのは Deepgram だけ、Gemini は無料枠で回せるという整理になった。
Gemini を無料枠で安定運用するための設計判断
ただ無料枠には壁がある。Gemini 無料ティアは 15 リクエスト/分の制限がある。Deepgram は発話を細切れの確定結果(final)でどんどん吐き出してくるので、その一つひとつをそのまま Gemini に投げると、講演を連続翻訳した途端に 15 RPM を超える。超えた分の翻訳は返ってこず、日本語訳が歯抜けになる。
そこで「無料枠で安定運用したい。Gemini のリクエストを可能な限り減らす」という方針を決めた。レスポンスを取りこぼしてでも、リクエスト数を絞ることを優先する。
決めた設計はバッチ翻訳。Deepgram の細切れの final をそのまま送らず、発話の切れ目までためて、1回のリクエストにまとめて翻訳する。
- 細切れを1件ずつ送る → リクエストが膨大、すぐ 15 RPM 超過
- 発話の切れ目までためて1回送る → リクエストが数分の1〜十分の1に減る
リクエストが減るだけでなく、ひとまとまりの文を渡すので訳の質も上がる。短い断片を訳すより、文脈のある一文を訳すほうが日本語が自然になる。一石二鳥だった。
今日やったこと
- 既存ツールの翻訳対応状況を確認(翻訳機能なし、音声基盤と英語文字起こしは既にあると判明)
- 音声=Deepgram / 翻訳=Gemini の役割分担を決定
- 英→日の対訳字幕機能を実装(英語の下に日本語訳を二段表示)
- Gemini が無料枠で動く方式だと確認(課金されるのは Deepgram のみ)
- 15 RPM 対策として、発話の切れ目までためるバッチ翻訳に変更
- dev で起動確認(Deepgram 接続済み、HMR でバッチ翻訳が反映)
次にやること
- 実際に Jensen の基調講演を流して、訳の歯抜けが起きないか1本通しで確認する
- 発話の切れ目の判定が早すぎ/遅すぎないか、ためる長さを調整する
- 講演1本ぶんを通したときの Deepgram の実費を計測する
立ち上げ初日としては、音声と翻訳の役割分担を決めて、無料枠に収める設計まで固められた。あとは本番の講演で流して、歯抜けが出ないかを自分の目で見るところからだ。