GEMINI LABEN
OMNI — ネイティブマルチモーダルのGemini Omni FlashがAPIでパブリックプレビューとなり、独自の動画ワークフローを組み立てられるようになりましたNANO — Nano Banana 2 Liteが登場し、これまでで最速かつ最も低コストなGemini画像モデルとして提供されていますFLASH — Gemini 3.5 Flashが一般提供となり、エージェント処理やコーディングで持続的な高性能を発揮しますAGENTS — Managed AgentsがGemini APIでパブリックプレビューとなり、Googleが隔離管理するLinuxサンドボックスで自律・状態保持型エージェントを動かせますMEMORY — Memory BankのIngestEvents APIが一般提供となり、イベント取り込みとメモリ生成を分離して継続的にストリーミングできますTHROUGHPUT — プロビジョンドスループットで、同一モデル・同一リージョンに最大7件までの発注をまとめて申請できるようになりましたOMNI — ネイティブマルチモーダルのGemini Omni FlashがAPIでパブリックプレビューとなり、独自の動画ワークフローを組み立てられるようになりましたNANO — Nano Banana 2 Liteが登場し、これまでで最速かつ最も低コストなGemini画像モデルとして提供されていますFLASH — Gemini 3.5 Flashが一般提供となり、エージェント処理やコーディングで持続的な高性能を発揮しますAGENTS — Managed AgentsがGemini APIでパブリックプレビューとなり、Googleが隔離管理するLinuxサンドボックスで自律・状態保持型エージェントを動かせますMEMORY — Memory BankのIngestEvents APIが一般提供となり、イベント取り込みとメモリ生成を分離して継続的にストリーミングできますTHROUGHPUT — プロビジョンドスループットで、同一モデル・同一リージョンに最大7件までの発注をまとめて申請できるようになりました
記事一覧/API / SDK
API / SDK/2026-07-11上級

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

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

Gemini Live API6Live Translate2字幕リアルタイム5設計3

プレミアム記事

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

個人開発で癒し系のアプリを運用していて、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-07-05
アプリに会話翻訳を組み込む — Live API で音声から音声へ、遅延と切断に耐える設計
Gemini 3.5 Live Translate と Live API で、音声から音声への会話翻訳をアプリに組み込む設計をまとめました。セッション寿命・言語の自動切り替え・遅延バジェット・ストリーミング課金の勘所を、動くコードとともに整理しています。
API / SDK2026-06-16
Gemini Live API のセッションが切れるたびに会話が消える — 期限切れトークンの再取得とセッション再開の実装メモ
Gemini Live API の WebSocket が再接続するたびに会話履歴とユーザーの発話を取りこぼす問題を、エフェメラルトークンの単発消費・セッション再開ハンドル・goAway 予告の3点から実装で塞ぐ運用メモです。
API / SDK2026-06-04
AdMob レポートの判定は Gemini にやらせない — 構造化出力を「抽出」に限定する設計
AdMob レポートからフロア(eCPM 下限値)を決めるとき、Gemini に判定そのものをやらせるのは危険です。構造化出力は「乱れたレポートを型付きデータに抽出する」工程だけに限定し、しきい値判定は決定論的なコードに置く——その設計理由と実装を、実際の 42 グループ運用の判定ルールとともにまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →