開発nvidia-ces

なぜリアルタイム翻訳をやりたいか

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 の実費を計測する

立ち上げ初日としては、音声と翻訳の役割分担を決めて、無料枠に収める設計まで固められた。あとは本番の講演で流して、歯抜けが出ないかを自分の目で見るところからだ。