◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-07-11上級

字幕が踊るのを止める — Live Translate の途中結果を確定と揺れに分けて描く

Gemini 3.5 Live Translate の途中結果をそのまま画面に貼ると字幕がちらついて読めません。確定した接頭辞と揺れる末尾を分離し、後方書き換えを許さない安定化ロジックを、実測値と動くコードでまとめました。

Gemini Live API6Live Translate字幕リアルタイム5設計4

✦ プレミアム記事

音声翻訳の遅延ばかり気にしていて、肝心の「読めるかどうか」を後回しにしていた時期があります。

個人開発で癒し系のアプリを運用していて、Live API で音声から音声への会話翻訳を組み込む設計を試したことがありました。音声は思ったより素直に返ってきたのですが、同じ翻訳結果を画面に字幕として重ねた瞬間、文字が小刻みに書き換わって、目で追えなくなりました。話者が一文を言い終える前に、末尾の単語が「light」から「lights」へ、語順ごと入れ替わる。ユーザーの視線は、確定したはずの文頭にまで引き戻されてしまいます。

この記事は、音声ではなく「文字をどう出すか」に絞った運用メモです。Live Translate の途中結果(interim results)を、そのまま最新文字列として貼らずに、確定した部分と揺れている部分に分けて描く。その一点だけで、字幕の読みやすさは大きく変わりました。

なぜ最新文字列をそのまま貼ると読めないのか

Live Translate はストリーミングで訳文を返します。厄介なのは、返ってくるのが「増えていく確定文」ではなく、「そのつど作り直される仮説(hypothesis)」だという点です。新しい音声が届くたびに、モデルは末尾を書き換え、ときには少し前の語まで訳し直します。

素朴に実装すると、メッセージを受けるたびに訳文の全文を字幕コンポーネントへ流し込むことになります。

session.on("message", (msg) => {
  const text = msg.translation?.text ?? "";
  setCaption(text); // 毎回、全文を貼り直す
});

これだと、末尾が一文字変わるだけで字幕全体が再レイアウトされます。私の手元では、途中結果は毎秒およそ15〜25回届いていました。つまり字幕は1秒間に十数回、丸ごと組み直されている計算です。文頭は本来もう変わらないのに、リフローのたびに位置が微妙にずれ、視線が定まりません。これが「字幕が踊る」正体でした。

確定した接頭辞と、揺れる末尾を分ける

発想を変えます。訳文を1本の文字列として扱うのをやめ、もう動かない接頭辞(committed)と、まだ揺れている末尾(volatile)の2つに分けて持ちます。

領域性質描き方
committed一度確定したら二度と後戻りさせない通常のスタイルで固定表示
volatile音声が届くたびに書き換わりうる淡い色・下線などで「暫定」を示す

committed は追記しかしません。volatile だけが毎フレーム作り直されます。こうすると、リフローが起きるのは末尾の狭い範囲だけになり、読み手の視線は確定済みの文頭に安定して留まります。仮に末尾が「light」から「lights」へ直っても、その訂正はまだ volatile の中で起きているので、確定表示は一度も間違った語を見せません。

問題は「どこまでを確定と見なすか」です。早く確定させればリフローは減りますが、あとで訂正が来ると確定を巻き戻すことになります。遅らせれば安全ですが、字幕がなかなか固まらず遅く感じます。ここに折り合いが要ります。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦確定接頭辞と揺れる末尾を分離する CaptionStabilizer の動くコード(後方書き換えゼロを検証済み)
✦空白のない日本語への翻訳で単語境界が使えないときの、末尾ウィンドウ方式の実装
✦1秒あたりの更新数と保持時間の実測から、ちらつきと遅延の折り合いをつける調整指針
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ API / SDK2026-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。
◈ API / SDK2026-10-14
config に「Extra inputs are not permitted」が出たら、キーの綴りを一つずつ疑います
google-genai SDK で config を渡した途端に pydantic の ValidationError(extra_forbidden)が出る原因は、ほぼ綴りの一字違いです。手元で再現した出力と、呼び出し前に怪しいキーを洗う関数、text が None になる場合の見分け方を書き残します。
◈ API / SDK2026-10-08
停止日のない非推奨をどう扱うか — 画像モデルの移行先を、3つの条件で選び直す
10月6日に gemini-nano-banana-2.1 が GA になり、gemini-3.1-flash-image は停止日の書かれないまま非推奨になりました。解像度・参照画像・検索の3条件で移行先を選ぶ表と、確認用の短いスクリプトをまとめます。