感情表現のある音声合成とは、場面に応じて、うれしそうに、心配そうに、申し訳なさそうに、あるいは苛立たしげに聞こえる合成音声のことです。すべてを同じ丁寧で平板な調子で読み上げるのとは違います。現在のモデルは、その多くを自分で行います。文を読み、どう聞こえるべきかを判断します。上から加える制御は微調整のためのもので、感情なく書かれた文を救うためのものではありません。
この順序がこのガイドの要点です。音声エージェントやアプリを作る場合、聞こえる感情の質の大部分は、システムが書く言葉と選んだ声から生まれます。タグやパラメータはその残りを調整します。以下では、それぞれの方法の仕組み、主要APIでの扱い、CartesiaのSonicで動くコード、そして結果の良し悪しを判断する方法を説明します。
TTSの感情はどこから来るのか
1つの文に、正しい読み方が1つだけあるわけではありません。「I can’t believe it」は、喜びにも、怒りにも、悲しみにも、皮肉にもなります。私たちの研究チームは音声合成を一対多の問題と呼んでいます。モデルは、どこで間を取るか、どの単語を強調するか、どの速さで話すか、どんな感情を込めるかを、多くの場合それを書いていないテキストから選ばなければなりません。
モデルがこの選択をする方法は4つあります。
- テキストから推定する。 周囲の言葉と句読点を読んで読み方を選びます。現在のすべてのモデルの既定の動作で、最も重要な方法です。
- 名前で指定する。 パラメータやタグで
angryやcalmと指定します。モデルは無理のない範囲でその方向に寄せます。 - スタイルを選ぶ。 一部の声には、カスタマーサービス調やニュース調のような名前付きの話し方があり、それぞれが別の演技として収録または学習されています。
- 言葉で説明する。 「友人を安心させるように、温かく言って」といった自然言語のプロンプトを書き、モデルがそれを解釈します。
どのAPIもこれらを組み合わせています。違いは、どれを主な制御として扱うかです。
主要APIでの感情の指示方法
2026年10月12日時点の各社ドキュメントによる比較です。
| API | 感情の指示方法 | 知っておきたいこと |
|---|---|---|
| Cartesia Sonic 3.6 | 既定ではテキストから推定。リクエストごとの generation_config.emotion、またはインラインの <emotion value="..."/> タグ。笑い声は [laughter]。 | 58の値、うち6つが主要な値。タグはベータ版で英語のみ。どの言語でも、Sonicはテキストから感情を読み取ります。タグが言葉と一致するときに効きます。ストリーミング中に感情を変えられます。 |
| ElevenLabs v4・v3 | テキスト内の角括弧の音声タグ。例:[sarcastic]、[whispers]、[laughs]。 | タグは自由記述の指示で、固定の一覧ではありません。v4とv3はSSMLのbreakタグに対応していません。 |
| Azure Speech | SSMLの <mstts:express-as style="..."> と、0.01〜2の styledegree。HD音声は [whispering] のようなスタイルマーカーも使えます。 | ニューラル音声のスタイルは一部の声にしかありません。スタイルを前提に設計する前に声を確認してください。 |
| Gemini TTS | テキストと並べて書く自然言語の prompt フィールドと、[laughs] や [sigh] などのインラインタグ。 | 2.5と3.1のプレビュー版TTSモデルは、早ければ2026年11月17日にGemini APIから外れます。 |
| OpenAI gpt-4o-mini-tts | instructions 文字列。例:「Speak in a cheerful and positive tone.」 | 非推奨。OpenAIは2027年1月6日に音声エンドポイントの全モデルを削除します。 |
| Amazon Polly | 感情タグはなし。一部のニューラル音声にニュースキャスター調のスタイルがあります。 | 読み方は主に声とテキストで決まります。 |
自然言語の演技指示を受け付けていたHumeのOctaveも、少し前までこの表に入っていました。Humeは2026年11月13日にTTSとEVIのAPIを終了します。移行する場合は、Humeの代替ガイドで先に保存すべきものを確認してください。
本番環境で重要な点が1つあります。プロンプト型の制御(Geminiや、提供終了予定のOpenAIモデル)は自由記述なので、テストできる固定の語彙がありません。同じ読み方を再現するには、指示の文言をそのまま保存し、変更するたびにテストし直す必要があります。名前付きの値(Sonicの感情一覧やAzureのスタイル)は、バージョン管理、テスト、ロールバックができる設定です。1日に10,000件の通話が同じエージェントを通るなら、必要なのはこちらです。
まず言葉に感情を書く
多くのチームが飛ばしてしまう手順で、最も効果があるのもこの手順です。
Sonic 3.6は、タグなしでテキストの感情的な文脈に合わせて速さと抑揚を変えます。米国英語での1対1のブラインドテストでは、聞き手がEleven v3よりSonic 3.6を92%の割合で選びました。理由は、より良い抑揚と、文脈に沿った感情でした。つまり、モデルはすでにあなたの言葉を聞いています。聞く価値のある言葉を渡してください。
音声エージェントでは、感情はLLMのプロンプトの中にあるということです。共感的な口調にしたいなら、LLMが共感的な文を書く必要があります。注文が遅れている顧客への2つの返答を比べてみましょう。
- 「ご注文は遅延しています。新しいお届け日は木曜日です。」
- 「申し訳ありません、楽しみにしていらっしゃいましたよね。木曜日にお届けします。」
どんなタグを付けても、1つ目は申し訳なさそうには聞こえません。2つ目はタグなしで申し訳なさそうに聞こえます。音声AIモデルの選び方ガイドも、反対側から同じことを述べています。Sonicはテキストに沿って感情を表し、テキストと矛盾する設定は無視します。
どのモデルにも効く書き方の習慣をいくつか挙げます。
- 普通の句読点を残す。 疑問符、「でも」の前の読点、感嘆符には、読み方の情報が含まれています。LLMの出力を「きれいにする」ために句読点を消すと、声が平板になります。
- 人が言いよどむところで、エージェントにも言いよどませる。 Sonicは「えーと」「うーん」のような言いよどみを、自然に考えている間として読みます。調べた数字の前や難しい質問の後など、控えめに使い、すべての文には入れないでください。
- 感情を説明しない。 「彼女は怒って言った」は読み上げられてしまいます。怒りは、彼女が言う言葉の中に入れてください。
気質の合う声を選ぶ
声には既定の雰囲気があります。何でも明るく解決する人として作られた声は、どんなタグを付けても信頼できる相談相手のようには聞こえません。まず仕事に合う声を選び、それから調整します。
Cartesiaのボイスライブラリでは、表現力の高い声にEmotiveタグが付いており、感情の制御はこれらの声で最もよく反応します。ドキュメントでは、感情の幅が最も広い声としてLeo、Jace、Kyle、Gavin、Maya、Tessa、Dana、Marianが挙げられています。声をクローンする場合、クローンは元の録音の話し方を引き継ぐので、エージェントに持たせたい雰囲気でサンプルを録音してください。
Sonicで感情を制御する
言葉と声が整ったら、次の方法で演技をさらに後押しできます。以下の例では、CartesiaのPython SDK バージョン4.2.0と sonic-3.6 を使います。先に環境変数 CARTESIA_API_KEY を設定し、ストリーミングの例のために cartesia[websockets] をインストールしてください。セットアップはPython音声合成チュートリアルで説明しています。
リクエスト全体に1つの感情を指定する
import os
from cartesia import Cartesia
with Cartesia(api_key=os.environ["CARTESIA_API_KEY"]) as client:
response = client.tts.generate(
model_id="sonic-3.6",
transcript="I'm sorry, I know you were counting on this. It's now arriving Thursday.",
voice="6ccbfb76-1fc6-48f7-b71d-91ac6298247b", # Tessa, an Emotive voice
language="en",
output_format={"container": "wav", "encoding": "pcm_s16le", "sample_rate": 44100},
generation_config={"emotion": "sympathetic", "speed": 0.95},
)
response.write_to_file("apology.wav")
generation_config はそのリクエストにだけ適用され、アカウント全体の設定はありません。speed は0.6〜1.5、volume は0.5〜2.0です。Sonicはこの3つを厳密な倍率ではなく目安として扱い、話し方の自然さを保ちます。はっきり聞き取れる変化が欲しい場合は、0.9ではなく0.7のように大きめに調整してください。
テキストの途中で感情を変える
transcript = (
'<emotion value="calm"/> I can help with that. '
'<emotion value="excited"/> Good news, your refund went through this morning!'
)
インラインタグは、はっきりした転換のある台本付きのセリフに便利です。テキスト途中での切り替えはこの機能で最も実験的な部分なので、変化が重要な場合は、それぞれの部分を別の生成コンテキストで送ってください。
ストリーミング中に感情を変える
WebSocket APIでは、送るテキストの断片ごとに設定を持たせられます。LLMのトークンを届いた順に音声に変えるエージェントでは、次のような形になります。
with client.tts.websocket_connect() as ws:
ctx = ws.context(
model_id="sonic-3.6",
voice="6ccbfb76-1fc6-48f7-b71d-91ac6298247b",
output_format={"container": "raw", "encoding": "pcm_s16le", "sample_rate": 44100},
language="en",
)
ctx.push("Well, maybe if you just ")
ctx.push("loosen up a little!", generation_config={"emotion": "angry"})
ctx.no_more_inputs()
for response in ctx.receive():
if response.type == "chunk" and response.audio:
... # play or buffer the audio
この例はドキュメントのWebSocketでの感情制御の例から取っています。笑い声はテキストに [laughter] を入れます。正確な間が必要なら <break time="1s"/> を使いますが、たいていは読点や句点のほうが自然な間になります。
どの値を選ぶか
まず6つの主要な感情から始めてください。neutral、calm、angry、content、sad、scared で、学習データが最も多い値です。残りの52(sympathetic、apologetic、curious、skeptical、determined、sarcastic など)は全一覧にあり、主要な値では近いけれど少し違うときに試す価値があります。多くのサポートエージェントは3つで足ります。既定は calm、悪い知らせには sympathetic、問題が解決したら content です。
感情が合っているかを確かめる方法
感情は、TTSの品質のうち指標では捉えられない部分です。単語誤り率のような文字起こしベースのチェックは、「お待たせしました」を激怒した調子で読んでも満点を付けます。聞く必要があり、しかも状況を念頭に置いて聞く必要があります。
- 聞き手に場面を伝える。 「サポート担当者が顧客にフライトの欠航を伝えている」と伝えれば、役に立つ判断が得られます。「このクリップを評価して」では、声そのものへの判断になります。
- 1文ではなく会話全体でテストする。 あるターンに合う感情が、3ターン後には不自然に聞こえることがあります。通話の途中で声の雰囲気がずれていくのは、文脈の中でしか聞こえない不具合です。
- 聞き手の意見が分かれることを前提にする。 表現豊かなエージェントを好む人もいれば、同じ演技を大げさで疲れると感じる人もいます。平均でならさず、意見の分かれ方を報告してください。MOS(平均オピニオン評点)のガイドでは、1つの数値がそれを隠してしまう理由を説明しています。
- 実際のストリーミング経路で聞く。 最初の音声チャンクで間違った感情を選んだモデルは、立て直せないことがあります。これはオフラインのレンダリングでは聞こえません。
Cartesiaの位置づけ
Sonicはリアルタイムの音声のために作られています。音声エージェント、電話、話して応えるアプリです。既定では感情はテキストから決まり、制御はストリーミング中にも使え、感情の設定はエージェントのほかの部分と同じようにテストとバージョン管理ができる名前付きの値です。電話エージェントを作るときに音声認識、LLM、TTSを自分でつなぎたくない場合は、Managed AgentsがSonicを声としてループ全体を動かします。
オーディオブックや動画のナレーションを制作し、タイムライン上で1行ずつ演技を編集したい場合は、APIよりスタジオ型のエディターが向いています。ElevenLabsの代替ガイドでいくつか紹介しています。
違いを自分の耳で確かめるには、プレイグラウンドを開き、Emotiveの声を選んで、同じ文を calm と sympathetic で読ませてみてください。次に、タグなしで申し訳なさそうに聞こえるように文を書き直してみてください。たいていは、2つ目の実験のほうが学ぶことが多くあります。