GEMINI LABEN
ROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応していますROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応しています
記事一覧/開発ツール
開発ツール/2026-07-14上級

TTS の継ぎ目を耳に残さない — 長文ナレーションの抑揚と無音境界を整える設計

長文を文単位で割って合成すると、文の変わり目で抑揚がリセットされ継ぎ目が耳につきます。文脈プライミング・ゼロクロス整合・句読点別の適応的無音・冪等なシーム台帳の四層で、繋ぎ目を聞こえなくする設計を実装ごとまとめます。

Gemini TTS2音声合成3ナレーション個人開発111

プレミアム記事

個人開発で癒し系アプリの案内音声を Gemini の TTS で用意していたときのことです。文単位で合成して繋いだ一本を、はじめて通しで聴きました。そして手が止まりました。

文と文の変わり目で、声の主が一瞬だけ別人に入れ替わるように聞こえるのです。一文ごとの音は綺麗なのに、繋ぐと落ち着かない。眠りに寄り添うはずの声が、境目でわずかに緊張していました。App Store と Google Play に出しているアプリで、毎日耳を傾けてくれる人がいると思うと、この小さな緊張を見過ごせませんでした。

原因はひとつではありませんでした。抑揚のリセット、PCM の継ぎ目に走る小さなクリック音、そして間の不揃い。三つが重なって「継ぎ目のある音声」になっていたのです。私自身、はじめは素朴に繋いでいて、その粗さに気づいていませんでした。以下では、その三つを切り分けて、それぞれに効く対処を実装ごとまとめます。単に割って繋ぐのではなく、繋いだあとに耳が止まらないところまで持っていく設計です。

なぜ継ぎ目は耳につくのか

長文をひとつのリクエストで音声化することはできません。合成できる分量に上限があり、数千字を丸ごと渡せば途中で切れます。だから文で割ります。ここまでは避けられません。

問題は、割った音を繋いだときに何が起きるかです。私の手元で起きていた不連続は、性質の違う三種類でした。

継ぎ目の症状耳に届くもの効く層
抑揚のリセット文頭ごとに読み直したような硬さ文脈プライミング
境界のクリック「プチッ」という短い異音ゼロクロス整合と端フェード
間の不揃い文と文がぶつかる/間延びする句読点別の適応的無音

素朴に「文で割って、固定長の無音を挟んで、PCM をそのまま連結する」だけでは、抑揚のリセットとクリックが残ります。無音の長さを一定にすると、間の不揃いも消えません。ここから、層ごとに潰していきます。

ひとつ補足があります。継ぎ目は再生環境で聞こえ方が変わります。私自身、開発中はイヤホンで確認していて気づけず、スマートフォンのスピーカーで通して聴いたときに初めて粗が耳につきました。仕上げの確認は、聴き手が実際に使う経路でも一度通すことをお勧めします。

前の文の読み終わりを次へ渡す(文脈プライミング)

いちばん耳につくのは、文頭で抑揚がまっさらに戻ることです。前の文がどんな流れで終わったかを、モデルは次のリクエストで知りません。だから毎回「はじめまして」の声で入ってきます。

そこで、直前の文の末尾を短く添えて、同じ調子で続けるよう促します。読み上げさせるのは今の一文だけ。前の文はあくまで抑揚を引き継ぐための手がかりです。

from google import genai
from google.genai import types
 
client = genai.Client()
MODEL = "gemini-3.1-flash-tts-preview"
VOICE = "Kore"
STYLE = "落ち着いた低めの声で、一定のテンポでゆっくり読んでください。"
 
def build_prompt(text: str, prev_tail: str) -> str:
    if prev_tail:
        return (
            f"{STYLE}\n"
            f"直前はこう読み終えました:「{prev_tail}」。声色と抑揚の流れを保ってください。\n"
            f"次の一文だけを読み上げてください:\n{text}"
        )
    return f"{STYLE}\n次の一文を読み上げてください:\n{text}"
 
def synth(text: str, prev_tail: str = "") -> bytes:
    resp = client.models.generate_content(
        model=MODEL,
        contents=build_prompt(text, prev_tail),
        config=types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=types.SpeechConfig(
                voice_config=types.VoiceConfig(
                    prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name=VOICE)
                )
            ),
        ),
    )
    cand = resp.candidates[0]
    if cand.finish_reason and cand.finish_reason.name != "STOP":
        raise RuntimeError(f"想定外の finish_reason: {cand.finish_reason.name}")
    return cand.content.parts[0].inline_data.data  # 24kHz 16bit mono PCM

完全に揃うわけではありません。プライミングは指示であって保証ではないからです。それでも、手元では文頭の硬さが目に見えて減りました。前文の末尾は 20〜24 字ほどに留めています。長く渡すと、稀にその内容まで読み上げに混ざるためです。手がかりは短く、あくまで流れを伝える程度に。

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

この記事の続きを読む

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

この記事で得られること
文の変わり目で抑揚が途切れる原因を三種類に切り分け、それぞれに効く対処を実装コードごと持ち帰れます
前の文の読み終わりを次の合成に伝える文脈プライミングと、ゼロクロス整合の端フェードで、継ぎ目のクリック音と抑揚のリセットを抑えられます
一チャンクだけ焼き直しても全体が壊れない冪等なシーム台帳を、JSON 構造と再生成コードごと手に入れられます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-08-30
モデル廃止日をまたぐ古い端末に、読み替えではなく拒否を返す設計
モデルが止まっても、配布済みのアプリは止まりません。後継へ黙って差し替えるか、明示的に断るか。出力契約を軸に廃止台帳を作り、残存曲線から自分の締切日を逆算するまでの実装と計測をまとめました。
開発ツール2026-08-24
Gemini の訳文で %1$s が消えても、レビューでは気づけません。文字列リソースへ戻す前の検査
Gemini に訳させたアプリの文字列から書式指定子が抜けたり全角になったりする事象を、実運用の中で拾い続けています。壊れ方を4種類に整理し、生成時に守らせる書き方と、受け取った直後に弾く短い検査を紹介します。
開発ツール2026-08-22
段階公開を止める判断だけは、Gemini に渡さないことにしました
段階公開の初日に見えるクラッシュ率には、良し悪しを判定できるだけの母数がありません。止める・進める・まだ言えないの3状態に分け、Gemini にはレビュー本文の帰属判定だけを任せた配線を残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →