「AI英会話は感情を扱えるのか」という問いは、1つの問いに見えて、実は2つの別々の問いが混ざっている。
1つめはAIが感情を「出す」側の話だ。相手の声が嬉しそうに聞こえる、落ち着いて聞こえる、急にきつく聞こえる——あれは何で決まっているのか。
2つめはAIがこちらの感情を「読む」側の話だ。こちらがイライラしている、自信がない、言いよどんでいる——それはAIに届いているのか。
この2つは、まったく別の仕様の上に乗っている。片方はドキュメントに属性名まで書いてあり、もう片方は項目そのものが存在しない。
だから「感情がある/ない」と一言で言うと、必ずどちらかが間違いになる。
この記事では、AIの部品を売っている会社が公開している開発者向けドキュメントの記述だけを材料にして、その2つを分けて開けていく。
サービスの順位づけはしない。仕組みの話だけをする。
【結論】AI英会話の感情は、出す側だけが仕様になっている
先に答えを置く。
AI英会話で感情が関係する場所は、次の2か所しかない。
| 方向 | 担当する部品 | ドキュメントにある名前 | 扱えるか |
|---|---|---|---|
| AIが出す側(あなたが聞く声) | 音声合成(Text to Speech) | mstts:express-as の style / styledegree / role、OpenAIの instructions | ◎ 属性と値まで決まっている |
| AIが読む側(あなたが出す声) | 音声認識(Speech to Text) | 該当する出力項目が見当たらない | ✕ 返ってくるのはテキストとスコア |
⇒ AI英会話の「感情」は、演出としては細かく設計できるが、診断としては返ってこない。
実際、Microsoftの音声合成ドキュメントには「感情」という語が何度も出てくる。SSMLを使用した音声とサウンドには「mstts:express-as 要素を使用して、明るさ、共感、落ち着きなどの感情を表現します」と書かれている。
いっぽう、同じMicrosoftの音声テキスト変換、発音評価、グーグルのCloud Speech-to-Text、OpenAIのSpeech to textの各ドキュメント本文を「感情」「emotion」「sentiment」で検索しても、認識結果として返る項目の中にその語は出てこない。
同じ会社の、同じ音声サービスの中で、出す側にだけ語彙があって読む側には無い。
これは性能の差ではなく、そもそも作られている機能が違うということだ。
AI英会話の感情表現①|style属性が話し方そのものを切り替える
出す側の中心にあるのが、SSMLという読み上げ用のマークアップだ。
SSMLは音声合成マークアップ言語(SSML)の概要で定義されているXMLベースの記法で、読ませたいテキストにタグを付けて渡すと、その通りに読み方が変わる。
そのSSMLの中に、Microsoft独自の mstts:express-as という要素がある。
この要素が受け取る属性は3つで、役割がきれいに分かれている。
| 属性 | 何を決めるか | 必須か |
|---|---|---|
style | 話し方のスタイル(怒り・明るさ・ささやき等) | 必須 |
styledegree | そのスタイルの強さ | オプション |
role | 演じる年齢と性別 | オプション |
実際に指定できる style の値は、公式ドキュメントに一覧表として載っている。英会話練習で意味を持ちそうなものを抜き出すと、こうなる。
| 値 | 公式ドキュメントの説明(抜粋) |
|---|---|
style="cheerful" | ポジティブで幸せなトーンを表現します。 |
style="calm" | 話すときにクールで落ち着いた態度を表現します。 |
style="chat" | カジュアルでリラックスしたトーンを表現。 |
style="customerservice" | カスタマー サポートのフレンドリーで役に立つトーンを表します。 |
style="empathetic" | 思いやりと理解感を表現します。 |
style="newscast-formal" | ニュース配信のための正式で自信のある、権威あるトーンを表します。 |
style="whispering" | 静かで優しい音を作ろうとしている柔らかいトーンを表現します。 |
style="unfriendly" | 冷たくて無関心なトーンを表現します。 |
一覧にはほかにも angry sad fearful excited gentle serious shouting terrified documentary-narration sports_commentary といった値が並んでいる。
つまり「AIが感情的に話す」のは偶然でも創発でもなく、開発者がどれか1語を選んで書いた結果だ。
そして重要な但し書きがある。ドキュメントには「スタイルが見つからないか、音声でサポートされていない場合」に要素全体が無視され、既定のニュートラル音声になる、という趣旨の記述がある。
⇒ スタイルは「全部の声に全部ある」ものではない。声ごとに対応表が違う。
AI英会話の感情の強さは、styledegreeで0.01から2まで刻める
感情が「あるかないか」ではなく「どれくらいか」を指定できるのが styledegree だ。
公式の説明はこうなっている。受け入れられる値の範囲は 0.01 から 2 まで。既定値は 1 で、これは定義済みのスタイルの強度を意味する。
最小単位は 0.01 で、その結果ターゲット スタイルの傾向はわずかになる。2 を指定すると、既定のスタイルの強度が2倍になる。
ドキュメントに載っている例は、そのまま読むと分かりやすい。
<mstts:express-as style="cheerful" styledegree="2">
That'd be just amazing!
</mstts:express-as>
<mstts:express-as style="my-custom-style" styledegree="0.01">
What's next?
</mstts:express-as>
同じ文でも、この数字ひとつで「テンションの高い先生」にも「淡々とした先生」にもなる。
AI英会話アプリで講師の性格を選ばせるUIがあるとしたら、その裏側でこの手の数値が切り替わっていると考えると筋が通る。
ここも但し書きは同じで、「スタイルの次数が見つからないか、音声でサポートされていない場合、この属性は無視されます」と明記されている。
AI英会話の声色は、role属性で年齢と性別を演じ分けている
感情の隣にあって、よく混同されるのが「誰が話しているように聞こえるか」だ。
これは role 属性が担当している。公式の説明は「話すロールプレイ。音声は異なる年齢と性別を模倣できますが、音声名は変更されません」だ。
具体例として「男性の声はピッチを上げてイントネーションを変更して女性の声を模倣できますが、音声名は変更されません」と書かれている。
指定できる値は次の8つ。
role="Girl"/role="Boy"——声は女の子・男の子を模倣する。role="YoungAdultFemale"/role="YoungAdultMale"——若い大人を模倣する。role="OlderAdultFemale"/role="OlderAdultMale"——年上の大人を模倣する。role="SeniorFemale"/role="SeniorMale"——さらに上の年代を模倣する。
⇒ 1つの声のデータから、ピッチとイントネーションの操作で複数の人物を作っている。
ここで押さえておきたいのは、role は感情ではないということだ。感情の種類は style、感情の強さは styledegree、話者の見た目に相当するものが roleと、3つは別々の軸として設計されている。
AI英会話の抑揚と間は、prosodyとbreakで数値になっている
スタイルを使わずに、もっと素朴に「声の表情」を作る道具もある。
それが <prosody> と <emphasis> で、こちらはMicrosoftにもグーグルにも共通で存在する。
<prosody> はピッチ・速度・音量を直接いじる要素だ。グーグルのSSMLリファレンスには <prosody rate="slow" pitch="-2st">Can you hear me now?</prosody> という例が載っている。「2半音下げて、ゆっくり話す」という指定だ。
Microsoft側には pitch="+80Hz" pitch="-2st" rate="+30.00%" volume="+20.00%" のような書き方に加えて、contour という属性まである。
<prosody contour="(60%,-60%) (100%,+80%)"> のように書くと、1文の中のどの位置でピッチをどう動かすかを折れ線で指定できる。
英語の「上げ調子で終わる疑問文」のような抑揚は、この座標の集まりとして扱われている。
もう一方の <emphasis> は、グーグルのリファレンスによれば「<prosody> と同じように音声を変えるが、個々の属性を設定する必要がない」要素で、level 属性に strong moderate none reduced の4つを取る。
ただし注意書きもあり、「<emphasis> タグは文全体を囲むときにだけ使うべきで、文中の単語を囲むと意図しないポーズが生じることがある」とされている。
⇒ 強調は「その語を強く読む」機能ではなく、囲んだ範囲の読み方を寄せる機能だ。
そして「間」も、同じように数値で指定されている。
人間の会話では、間は意味を持つ。言いよどみ、ためらい、含み——そういうものが沈黙に乗る。
音声合成の側では、間は完全に時間の量として扱われている。
SSMLドキュメントの構造とイベントには、間を作る要素が2つ書かれている。
1つめが <break> で、<break time="750ms" /> や <break strength="medium" /> のように書く。
2つめが <mstts:silence> で、こちらは挿入できる場所が決まっている。公式は両者の違いを「break 要素はテキスト内の任意の場所に挿入できる」のに対し、無音は「入力テキストの先頭または末尾、または隣接する2つの文の境界でのみ機能します」と書いている。
<mstts:silence> の type に指定できる値は、場所そのものの名前になっている。
Leading/Leading-exact——テキストの先頭の無音。Tailing/Tailing-exact——テキストの末尾の無音。Sentenceboundary/Sentenceboundary-exact——隣接する文の間の無音。Comma-exact/Semicolon-exact/Enumerationcomma-exact——句読点の位置の無音。
value は秒(2s)かミリ秒(500ms)で、有効な値の範囲は0から20000ミリ秒。それより大きい値を設定した場合、サービスは 20000ms を使う。
⇒ 間に意味は入っていない。入っているのは長さだけだ。
これは「AIの相づちが不自然に感じる」ときの正体でもある。人間は間の長さを状況で変えるが、合成側は設定した値をそのまま出す。
AI英会話でOpenAIは、instructionsに話し方を文章で書かせる
同じ「感情を出す」でも、OpenAIのやり方はMicrosoftとかなり違う。
属性名と値の表ではなく、自然文の指示で渡す。
Text to speechのガイドには、instructions: "Speak in a cheerful and positive tone." という指定例が、JavaScript・Python・Go・Java・C#・curlのすべてのサンプルで繰り返し出てくる。
そして gpt-4o-mini-tts について、「you can prompt the model to control aspects of speech」として制御できる項目が列挙されている。
- Accent(アクセント)
- Emotional range(感情の幅)
- Intonation(イントネーション)
- Impressions(ものまね)
- Speed of speech(話す速度)
- Tone(トーン)
- Whispering(ささやき)
Microsoftの style 一覧と見比べると、扱っている領域はほぼ同じだ。違うのは決められた値から選ぶか、文章で書くかという入口の形だけである。
リアルタイム音声の側でも同じ考え方が続いている。Live promptingのガイドは「The live prompt controls speaking behavior, including tone, pace, backchannels, and interruptions」と書き、プロンプトのひな形として「Speak warmly and naturally, at an unhurried pace. Be clear and direct, not overly cheerful.」という文を挙げている。
同じひな形には「If the user is frustrated, acknowledge it briefly and focus on the next helpful step.」という行もある。
ここは読み違えやすいところだ。これはAIがこちらの苛立ちを検出する機能ではなく、苛立ちが会話に出てきたときの振る舞いを開発者が文章で決めているにすぎない。
AI英会話が読む側|声から感情を取り出す出力項目が見当たらない
ここからが後半、つまり「こちらの感情は届いているのか」という話だ。
音声認識が返すものを確認すると、答えははっきりする。
Microsoftの音声テキスト変換が返すのはテキストと、そのテキストに付随する情報だ。グーグルのCloud Speech-to-Textも、OpenAIのSpeech to textも同じで、返ってくるのは書き起こされた文字列である。
今回材料にしたSTT側のドキュメント本文を「感情」「emotion」「sentiment」で検索した範囲では、これらの語は1度も現れない。いっぽう同じ会社のTTS側のドキュメントでは、「感情」も Emotional range も普通に出てくる。
⇒ 語彙が片側にしか無い。これは実装の粗さではなく、製品の守備範囲の境界線だ。
ただし1点だけ、丁寧に扱うべき例外がある。
OpenAIのRealtime conversationsには、音声を文字に落とさず直接やりとりする方式について「gives the model more data to work with around the tone and inflection of voice input」と書かれている。
声のトーンや抑揚が、テキストに潰される前にモデルへ渡る方式は存在する。
ただしこの記述は「モデルが扱えるデータが増える」と言っているだけで、感情のラベルやスコアが結果として返ってくるとは書かれていない。
だから利用者側から見た正確な言い方はこうなる。感情の手がかりが入力として渡る経路はあるが、感情が測られて返ってくる出力は用意されていない。
AI英会話のProsodyScoreが測っているのは、自然さであって感情ではない
ここがいちばん誤解されやすい。
発音評価には ProsodyScore という点数がある。プロソディ=韻律という語の響きから、「気持ちの込め方を採点している」と受け取られがちだ。
公式の定義を読むと、そうではない。
| 項目 | 公式ドキュメントの説明 | 粒度 |
|---|---|---|
AccuracyScore | 音素がネイティブ スピーカーの発音とどの程度一致するかを示す | 音素・音節・単語・全文 |
FluencyScore | 単語間のサイレント区切りの使い方がネイティブ スピーカーにどの程度近づくか | 全文 |
CompletenessScore | 入力参照テキストに対する発音された単語の比率 | 全文 |
ProsodyScore | ストレス、イントネーション、話す速度、リズムなど、与えられたスピーチがいかに自然であるかを示す | 全文 |
測っているのは「自然さ」であって「感情」ではない。
評価を有効にする EnableProsodyAssessment メソッドの説明も同じで、「ストレス、イントネーション、話す速度、リズムなどの側面を評価します」「音声の自然性と表現力に関する分析情報を提供します」と書かれている。
単語レベルで返る ErrorType の値を見ると、扱っている対象がさらにはっきりする。
使える値は None Omission Insertion Mispronunciation UnexpectedBreak MissingBreak Monotone だ。
⇒ 「単調(Monotone)」は拾うが、「悲しそう」「怒っている」は項目として存在しない。
さらに条件も付く。公式は「プロソディ評価は en-US ロケールでのみ利用可能です」と明記し、SDKのバージョン1.35.0以降が必要だとも書いている。
総合点の PronScore は AccuracyScore FluencyScore CompletenessScore と重み付きの ProsodyScore から計算され、使用できないスコアは計算に入らないとされている。
AI英会話が沈黙をどう扱うかは、VADの設定値で決まる
こちらが黙ったとき、AIが割り込んでくるか待ってくれるか。あれも感情の読み取りではなく、数値の設定だ。
担当しているのはVAD(Voice activity detection)という機能で、Voice activity detectionのガイドに仕様が書かれている。
既定の server_vad モードでは、調整できるプロパティが3つ挙げられている。
threshold——反応の起動しきい値(0〜1)。高くすると、より大きな音でないと反応しない。prefix_padding_ms——検出した発話の前に含める音声の長さ(ミリ秒)。silence_duration_ms——発話の終わりと判定する無音の長さ(ミリ秒)。短くするほど早く切られる。
ガイドに載っている設定例では threshold が 0.5、prefix_padding_ms が 300、silence_duration_ms が 500 になっている。
⇒ 考えている沈黙と、話し終わった沈黙は、区別されていない。区別しているのは長さだけだ。
もう1つの semantic_vad モードは、ここに一歩踏み込む。公式は「uses a semantic classifier to detect when the user has finished speaking, based on the words they have uttered」と説明している。
例として「user audio that trails off with an “ummm…” would result in a longer timeout than a definitive statement」と書かれている。
つまり「ええと」で言いよどんだら待ってくれる。ただし判定の根拠は発した語(the words)であって、声の震えでも表情でもない。
eagerness には low medium high auto が設定できる、とも書かれている。待ちの長さは、感情の読み取りではなくダイヤルで決まる。
AI英会話 感情のよくある質問
Q. AI英会話の相手は、こちらが落ち込んでいることに気づいてくれるか。 A. 音声認識が返すのはテキストで、今回確認したSTT側のドキュメントには感情を表す出力項目が出てこない。気づいたように見えるときは、言葉として「I’m tired」などと書き起こされた内容に、言語モデルが反応している。
Q. AIの声が感情的に聞こえるのは、AIが感情を持っているからか。 A. 違う。mstts:express-as の style にどの語を書いたか、OpenAIなら instructions に何と書いたかで決まる。公式の一覧から1語選ぶ操作だ。
Q. 感情を込めて読む練習は、AIで採点してもらえるか。 A. ProsodyScore は返るが、その定義は「与えられたスピーチがいかに自然であるか」であって、感情の当たり外れではない。また en-US ロケールのみと明記されている。
Q. 棒読みを直したい。AIは指摘してくれるか。 A. 単語レベルの ErrorType に Monotone という値があり、単調さは項目として存在する。そのほか UnexpectedBreak(不適切な区切り)MissingBreak(区切りの欠落)も返る。
Q. AIが話をかぶせてくるのが不快だ。直せるか。 A. アプリ側の設定しだいだが、仕様としては silence_duration_ms と eagerness が待ち時間を決めている。つまり「空気を読まない」のではなく「待つ長さが短く設定されている」ということだ。
まとめ|AI英会話の感情は、演じられる側と測られない側に分かれる
もう一度整理する。
- 出す側は仕様になっている。
mstts:express-asのstyleで種類、styledegree(0.01〜2)で強さ、roleで年齢と性別を指定する。 - 抑揚と間も数値だ。
<prosody>のピッチ・速度・音量・contour、<break>と<mstts:silence>のミリ秒指定(0〜20000ミリ秒)で作られている。 - OpenAIは自然文で渡す。
instructionsで Accent・Emotional range・Intonation・Tone などを制御できる、と公式が列挙している。 - 読む側には出力が無い。今回確認したSTT側のドキュメントには感情を表す項目が出てこない。音声そのものがモデルへ渡る方式はあるが、感情のスコアが返るとは書かれていない。
ProsodyScoreは自然さの点数だ。ストレス・イントネーション・速度・リズムの自然さを見るもので、en-USのみ。感情の採点ではない。
⇒ AI英会話で感情を練習したいなら、「AIに感情を読ませる」ではなく「感情のついた声を相手に、こちらが反応する」という使い方に寄せたほうが、仕組みと噛み合う。
相手の style は設計されている。こちらの気持ちは、まだどこにも数えられていない。
そこを分けて見れば、「AIは感情を分かってくれない」という感想は、失望ではなく仕様の理解に変わる。
※本記事の一次ソースはすべて2026-09-11に各公式ドキュメントで確認した。仕様は更新されるため、最新は各公式ドキュメントで確認してほしい。
Comments