はじめに
今回、Google の Gemini 2.5 Flash Preview TTS モデルを使って、感情豊かなボイスチャットアプリを作ってみました。
このモデルの面白いところは、プロンプトで音声の読み方(トーン・感情)を指定できるという点。従来の TTS は「テキストを読み上げる」だけでしたが、Gemini TTS では「笑いながら読んで」「怒って読んで」といった演技指導ができます。
めちゃめちゃ怒られました。ほんとすみませんでした。
本記事では、実際にボイスチャットアプリを構築しながら、この「演技指導」機能を検証した結果をお伝えします。
gemini-2.5-flash-preview-tts とは
gemini-2.5-flash-preview-tts は、Google が提供する Text-to-Speech モデルです。
従来の TTS との違い
| 項目 | OpenAI TTS (gpt-4o-mini-tts) | Gemini 2.5 Flash Preview TTS |
|---|---|---|
| 感情表現 | プロンプトで指定可能だが限定的 | プロンプトで指定可能 |
| カスタマイズ | instructions パラメータで指示 | テキスト冒頭に演技指示を記述 |
| 音声プリセット | 13 種類 | 30 種類(男性 16 種/女性 14 種) |
| 出力形式 | mp3, opus, aac, flac, wav, pcm | PCM (24kHz/16bit mono) |
| 最大入力長 | 4,096 文字 | 制限なし(実用上 500 文字推奨) |
利用可能なボイス
男性・女性それぞれ多様なキャラクターの声が用意されています。
- 男性ボイス(16 種類): Puck, Charon, Fenrir, Achird, Zubenelgenubi, Algieba, Alnilam, Orus, Enceladus, Iapetus, Umbriel, Algenib, Rasalgethi, Schedar, Sadachbia, Sadaltager
- 女性ボイス(14 種類): Zephyr, Kore, Leda, Aoede, Callirrhoe, Autonoe, Despina, Erinome, Gacrux, Laomedeia, Achernar, Pulcherrima, Vindemiatrix, Sulafat
30 種類もあるのはありがたいですね。今回は男性ボイスの Zubenelgenubi(カジュアル、リラックス)を使用しました。
アーキテクチャ全体像
今回構築したボイスチャットアプリのアーキテクチャは以下の通りです。
処理フロー
- 音声入力: ユーザーの発話を Web Speech API で認識・テキスト化
-
テキスト生成:
gemini-3-flash-previewでトーンを加味した応答文を生成 -
音声合成:
gemini-2.5-flash-preview-ttsでトーンを加味した音声を生成 - 音声再生: WebAudio API で PCM データを再生
シンプルな構成ですが、ポイントは「テキスト生成」と「音声合成」の両方でトーンを制御しているところです。
実装のポイント
TTS API の呼び出し方
Gemini TTS API を呼び出す際のポイントは以下の 2 点です。
-
responseModalities: ['AUDIO']を指定してオーディオ出力を要求 -
speechConfigでボイスを指定
const response = await ai.models.generateContent({
model: "gemini-2.5-flash-preview-tts",
contents: [{ parts: [{ text: "読み上げてほしいテキスト" }] }],
config: {
responseModalities: ["AUDIO"],
speechConfig: {
voiceConfig: {
prebuiltVoiceConfig: { voiceName: "Zubenelgenubi" },
},
},
},
});
レスポンスは Base64 エンコードされた 24kHz/16bit mono の PCM データで返ってきます。
トーン(感情)制御の二段構え
今回のアプリでは、テキスト生成時と音声生成時の両方でトーンを制御しています。
なぜ二段構えなのか?
- テキスト生成時: 文章の語尾や表現をトーンに合わせて調整(日本語)
- 音声生成時: 実際の読み方・声色をトーンに合わせて調整(英語プロンプト)
この二段構えにより、テキストの内容と音声の表現が一貫した感情表現になります。TTS への指示だけだと「文章は普通なのに声だけ怒ってる」みたいな違和感が出てしまいます。
使用しているプロンプト
テキスト生成用プロンプト(日本語)
| トーン | プロンプト |
|---|---|
| default |
# 話し方のスタイル- 温かみのある親しみやすい口調で話してください
|
| happy |
# 話し方のスタイル- 明るく楽しそうな口調で話してください- 文末に「!」を使って元気さを出してください
|
| sad |
# 話し方のスタイル- 悲しそうな口調で話してください- 文末に「...」を使って余韻を出してください
|
| angry |
# 話し方のスタイル- 怒りを込めた強い口調で話してください- 文末に「!」を使って語気の強さを出してください
|
| sarcastic |
# 話し方のスタイル- 皮肉っぽく嫌味な口調で話してください- 見下すようなニュアンスを語尾に込めてください
|
音声生成用プロンプト(英語)
| トーン | プロンプト |
|---|---|
| default | Read aloud in a warm and friendly tone: |
| happy | Read aloud in a very cheerful, laughing, and joyful voice as if you are extremely happy and cannot contain your laughter: |
| sad | Read aloud in a very sad, tearful, and sobbing voice as if you are crying deeply: |
| angry | Read aloud in a very angry, frustrated, and aggressive voice as if you are furious and shouting: |
| sarcastic | Read aloud in a condescending, sarcastic, and snide voice with a mocking tone as if you think you are better than everyone else: |
こんな感じで、テキスト生成では日本語で口調を指示し、TTS では英語で読み方を詳細に指示しています。
工夫した点・ハマった点
工夫した点
1. 原稿作成からトーンを加味
前述の通り、TTS への演技指導だけでなく、テキスト生成の段階からトーンを反映させました。
例えば「悲しんでいる」トーンを選択すると:
- テキスト生成時: 文末に「...」を使った余韻のある文章を生成
- 音声生成時: 泣きそうな声で読み上げ
これにより、文章の内容と声のトーンが一致し、より自然な感情表現が実現できました。
2. プッシュ・トゥ・トーク方式の採用
常時マイクをオンにする方式ではなく、スペースキー長押しで発話するプッシュ・トゥ・トーク方式を採用しました。
理由は以下の通りです:
- ノイズの誤検知防止: 環境音や独り言を拾ってしまう問題を回避
- 意図しない会話の防止: ユーザーが明示的に話しかけたい時だけ認識
- レイテンシの体感改善: 発話終了のタイミングが明確になり、待ち時間が気になりにくい
常時リスニングだと、環境音や自身の発生を拾って勝手に応答し始めてしまいました、、。それを防ぐためにプッシュ・トゥ・トークにしました。
3. テキスト長の制限
TTS API の安定性向上のため、テキストを 500 文字に制限しています。長すぎるテキストは途中で切り、「...」を付加して自然に聞こえるようにしました。
ハマった点
日本語プロンプトでの精度問題
当初、TTS API への演技指導も日本語で行っていました。
❌ 「笑いながら楽しそうに読んでください」
しかし、日本語プロンプトでは思ったようなトーン制御ができませんでした。感情の変化が薄かったり、指示が無視されることがあって、なかなか安定しませんでした。
解決策: 英語プロンプトに切り替え
✅ "Read aloud in a very cheerful, laughing, and joyful voice as if you are extremely happy and cannot contain your laughter:"
英語で詳細に指示することで、期待通りの感情表現が得られるようになりました。特に as if you are... のように具体的なシチュエーションを描写すると効果的でした。
まとめ
Gemini 2.5 Flash Preview TTS を使って、感情表現が可能なボイスチャットアプリを構築しました。
検証結果
- 演技指導は有効: 英語プロンプトで詳細に指示すれば、笑い声や怒り声など、様々なトーンで読み上げてくれる
- 二段構えが効果的: テキスト生成と音声生成の両方でトーンを制御することで、一貫した感情表現が可能
- 日本語プロンプトは課題あり: 現時点では英語プロンプトの方が精度が高い
今後の可能性
- キャラクター AI との組み合わせ(喜怒哀楽のある対話)
- ナレーション・朗読アプリ(場面に応じた感情表現)
- 教育コンテンツ(感情を込めた説明)
Gemini TTS の「演技指導」機能は、従来の TTS にはない表現力を持っています。まだ Preview 版ですが、今後の進化が楽しみです 🙏