AI英会話で「まだ話している途中なのに返事が始まった」と感じたことがあるなら、そこで動いているのはターン検出という仕組みだ。
ターン検出とは、あなたが話し終えたかどうかを機械が判定して、会話の順番を入れ替える処理のことだ。
人間同士の会話なら、相手の表情や声の下がり方や文の形で「もう言い終わったな」と分かる。
だが機械に届いているのは音の波だけなので、判定の材料はかなり限られている。
この記事では、AIの部品を売っている会社の開発者向け公式ドキュメントの記述だけを材料にして、ターン検出が何を見ているのかを1つずつ開けていく。
サービスの順位づけはしない。仕組みの話だけをする。
【結論】ターン検出は「沈黙の長さ」か「言い終わりらしさ」のどちらかで切っている
先に答えを置く。
OpenAI の Voice activity detection (VAD) のガイドには、ターン検出のモードは2つだと書かれている。
| モード名 | 何を見て切るか | 公式の記述 |
|---|---|---|
server_vad | 沈黙の続いた時間 | Automatically chunks the audio based on periods of silence. |
semantic_vad | 話した言葉の中身 | Chunks the audio when the model believes based on the words said by the user that they have completed their utterance. |
そして「VADに対応しているセッションとモデルでは、既定値は server_vad」とも明記されている。
⇒ 何も設定していないAI英会話のターン検出は、ほぼ確実に「沈黙の秒数」で切っている。
ここが分かると、AI英会話で起きる「待ってくれない」「逆にいつまでも返ってこない」の両方が、同じ1つのつまみの表と裏だと見えてくる。
ターン検出の正体|VADが出しているのは2つのイベントだけ
ターン検出は「会話を理解する機能」ではなく、2つの合図を出すだけの機能だ。
公式ガイドは、VADが有効なとき音声は自動的にチャンク(かたまり)に区切られ、サーバーが次のイベントを送ると書いている。
input_audio_buffer.speech_started=発話ターンの開始。input_audio_buffer.speech_stopped=発話ターンの終了。
この2つしかない。
つまりターン検出の段階では、あなたが英語で何を言ったかは1文字も使われていない(server_vad の場合)。
「音が始まった」「音が止まった」という2点だけで、会話の切れ目が決まっている。
設定の場所も公式に書かれている。Realtime conversations のガイドによると、クライアントが session.update イベントを送り、session.audio.input.turn_detection を書き換えることで設定する。
ターン検出の既定値|server_vadは沈黙の時間で会話を切る
既定のターン検出は、音が途切れてからの経過時間だけを数えている。
公式ガイドは server_vad を「speech-to-speech セッションの既定モードであり、沈黙の期間を使って音声を自動的に区切る」と説明している。
ここで起きることを、英会話の場面に置き換えると分かりやすい。
| あなたの動き | ターン検出の解釈 | 結果 |
|---|---|---|
| 単語を思い出そうとして黙る | 沈黙=発話の終了 | まだ途中なのに返事が始まる |
| 「えーと」と声を出し続ける | 音がある=発話の継続 | 返事が始まらない |
| 後ろでテレビが鳴っている | 音がある=発話の継続 | ターンが終わらない |
| 小さい声で話す | しきい値未満=音なし | 発話として拾われない |
⇒ 英語を考えるための沈黙と、言い終わったことを示す沈黙を、この方式は区別していない。
これは性能の良し悪しではなく、材料が音の大小と時間しかないという構造の話だ。
ターン検出の3つのつまみ|threshold・prefix_padding_ms・silence_duration_ms
server_vad で調整できる項目は、公式ガイドに3つ挙げられている。
| 項目 | 公式の説明 | 会話でどう効くか |
|---|---|---|
threshold | Activation threshold (0 to 1)。値を高くするほど大きな音でないと反応せず、騒がしい環境で有利になる場合がある | 小声だと拾われない/雑音を拾いにくくなる |
prefix_padding_ms | VADが発話を検出した手前に含める音声の量(ミリ秒) | 言い出しの1音目が欠けるのを防ぐ |
silence_duration_ms | 発話停止と判定するまでの沈黙の長さ(ミリ秒)。値が短いほどターンが速く検出される | 考える間をどれだけ許すかそのもの |
公式ガイドが載せている設定例では、threshold が 0.5、prefix_padding_ms が 300、silence_duration_ms が 500 になっている。
この例の数値をそのまま読むと、0.5秒の沈黙で「言い終わった」と判定される計算になる。
ただしこれはドキュメントに載っている設定例であって、各サービスが同じ値を使っているとは書かれていない。
同じ例には create_response と interrupt_response も並んでいるが、公式は「この2つは speech-to-speech の会話でのみ使われる」「transcription セッションではVADは音声の区切り方だけを制御する」と注記している。
⇒ 同じターン検出でも、会話モードと文字起こしモードでは役割が違う。
ターン検出のもう1つのやり方|semantic_vadは言葉の中身で判定する
沈黙だけで切る方式の弱点をふさぐために用意されているのが semantic_vad だ。
公式ガイドは semantic_vad を「ユーザーが発した言葉に基づいて、話し終えたかどうかを検出するセマンティック分類器を使う新しいモード」と説明している。
この分類器は、入力音声に対してユーザーが話し終えている確率をスコアとして付ける。
- 確率が低いとき=モデルはタイムアウトまで待つ。
- 確率が高いとき=待つ必要がないと判断する。
公式が挙げている例がそのまま英語学習者の話に効く。「ummm…」と語尾が消えていく音声は、言い切った文よりも長いタイムアウトになる、と書かれている。
つまり「えーと」で伸ばしている間は、言い終わっていないと見なされやすい。
そして公式は、このモードでは「モデルがユーザーの発話を途中で遮る可能性が下がる」とも書いている。
設定は session.audio.input.turn_detection.type を semantic_vad にするだけだ。
ターン検出の待ち時間を決めるeagerness|low・medium・highの差
semantic_vad には eagerness という任意のつまみがあり、これが「どれだけ食い気味に切るか」を決めている。
公式ガイドは eagerness を「モデルがユーザーを遮りたがる度合いを制御し、最大待機タイムアウトを調整する方法」と説明している。
| 値 | 公式の説明 | 英会話練習での意味 |
|---|---|---|
auto | 既定値。medium と同等 | 指定しなければこれ |
low | ユーザーが時間をかけて話せるようにする | 考える間を長く取れる |
high | できるだけ早く音声を区切る | テンポは速いが遮られやすい |
公式は使い分けも書いている。会話モードでモデルにもっと頻繁に返させたいなら high、ユーザーに遮られず話させたいなら low だ。
⇒ AI英会話が「食い気味」か「待ってくれる」かは、性格ではなく設定値の話である場合がある。
なおターン検出まわりは文字起こし専用セッションでも条件が違う。
公式ガイドは「transcription セッションでは、ターン検出の対応は文字起こしモデル次第」「VADに対応するモデルは server_vad が既定になり、gpt-realtime-whisper はターン検出を省略するか null にする必要がある」と明記している(Realtime transcription)。
ターン検出を切るとどうなるか|push-to-talkという別の設計
ターン検出は必須ではなく、オフにできると公式に書かれている。
VADは speech-to-speech の Realtime セッションでは既定で有効だが、「optional であり、オフにできる」と明記されている。
切り方は turn_detection を null にするだけだ。
ただし切ると、これまでターン検出が代わりにやっていた仕事がアプリ側に降りてくる。
input_audio_buffer.commitを手で送る(新しいユーザー入力アイテムが作られる)。response.createを手で送って、音声の返答を起こす。- 新しい入力の前に
input_audio_buffer.clearを送る。
これがいわゆる押している間だけ話す方式で、公式は push-to-talk と呼んでいる。
公式の評価も具体的だ。「ユーザーに操作の主導権を与え、VADの失敗を避けられ、VADのタイムアウトを待たないのできびきび感じる」と書かれている。
中間のやり方も用意されている。VADは有効のままにして turn_detection.interrupt_response と turn_detection.create_response を false にすると、ターン検出の挙動は残しつつ、返答の生成タイミングだけを手元で決められる。
ターン検出が英会話の練習で起こす3つのつまずき
ここまでの仕様から、学習者が感じる違和感の出どころが説明できる。
1つめは「考える沈黙」が終了合図として読まれることだ。
silence_duration_ms は沈黙の長さしか見ておらず、その沈黙が母語話者の息継ぎなのか、学習者が単語を探している時間なのかを区別する材料を持っていない。
2つめは声の大きさで拾われ方が変わることだ。
threshold は0から1の作動しきい値で、値を上げるほど大きな音が必要になると公式が書いている。自信がなくて小さい声になるほど、ターン検出の入口で不利になりうる。
3つめは周囲の音がターンを終わらせないことだ。
ターン検出が見ているのは「音があるか」なので、音の主があなたかどうかは、この層では判定されていない。
OpenAI の Voice agents ガイドは、音声エージェントの評価軸として「unwanted silence(不要な沈黙)」「overlap(重なり)」「yielding to interruptions(割り込みへの譲り方)」を独立に測れと書いている。
⇒ これらは作り手側でも「起きるもの」として計測対象になっている現象だ。
ターン検出を言葉で補正する|プロンプト側でできること
ターン検出の数値とは別に、モデルへの指示文で挙動を寄せる方法も公式に載っている。
Prompting voice models のガイドには、沈黙と背景音への対処として、そのまま貼れる指示文が例示されている。
Keep listening while the user pauses to think.(ユーザーが考えるために止まっている間も聞き続ける)Do not treat a cough, music, or nearby conversation as a new request.(咳・音楽・近くの会話を新しい要求として扱わない)
公式はこの指示文を「テストの結果、アシスタントが間や無関係な音に反応してしまう場合に使う」ものとして紹介している。
⇒ ターン検出の問題は、数値の調整と指示文の2か所から触れる。
同じガイドは割り込みの扱いについても、「ユーザーが割り込んだら、アシスタントは答えをやめて聞くべきだ」と書いている。
そして「短い相づちと、ユーザーのターンを奪うことは別物だ」とわざわざ区別している。
ターン検出と割り込み処理は、Interruption and Truncation の節にあるとおり同じ配線でつながっている。VADが有効なとき、Realtime API はユーザーの発話を検出して進行中の応答をキャンセルし、新しい応答を始める。
ターン検出に関するよくある質問
Q. ターン検出は何秒の沈黙で切れるのか。 A. 秒数は設定項目なのでサービスによって違う。公式ガイドが載せている設定例では silence_duration_ms が 500 になっているが、これは例として示された値で、各サービスの値が同じだとは書かれていない。
Q. 言い終わる前に返事が始まるのを止められるか。 A. 仕様のうえでは方法が2つある。silence_duration_ms を長くする方向と、semantic_vad に切り替えて eagerness を low にする方向だ。どちらもアプリ側の設定なので、学習者が画面から触れるかどうかは各サービスの作り次第になる。
Q. ターン検出は自分の英語が下手だから誤作動するのか。 A. server_vad が見ているのは音の大きさと沈黙の長さで、発音の良し悪しや文法は材料に入っていない。区切りの判定と、英語の出来は別の層で動いている。
Q. ターン検出をオフにできるAI英会話はあるのか。 A. API側にはオフにする手段があり、turn_detection を null にする。その場合は input_audio_buffer.commit と response.create をアプリが送る設計になる。画面に「話す」ボタンがあるタイプは、この押している間だけ話す方式に近い作りだ。
Q. 会話が長くなるとターン検出の調子が変わるのか。 A. ターン検出の設定そのものは会話の長さで変わらない。ただし Realtime conversations は「Realtime セッションの最大継続時間は60分」と明記しているので、長時間の連続利用には別の上限がある。
まとめ|ターン検出は「沈黙の秒数」と「言い終わりらしさ」で決まっている
もう一度整理する。
- ターン検出のモードは
server_vadとsemantic_vadの2つで、既定はserver_vad。前者は沈黙の期間で、後者は話した言葉の中身で音声を区切る。 - ターン検出が出しているイベントは
input_audio_buffer.speech_startedとinput_audio_buffer.speech_stoppedの2つだけ。 - つまみは
threshold(作動しきい値0〜1)、prefix_padding_ms(検出の手前に含める音声)、silence_duration_ms(発話停止と判定する沈黙の長さ)の3つ。短いほどターンは速く検出されると公式が書いている。 semantic_vadのeagernessはauto/low/highで待ち方が変わる。autoはmediumと同等、lowはユーザーに時間をかけさせる。- ターン検出はオフにできる。
turn_detectionをnullにすると、区切りの判断はアプリ側の操作に移る。
⇒ AI英会話で「待ってくれない」と感じたとき、そこで起きているのは英語力の判定ではなく、沈黙の長さを数えているタイマーの満了だ。
仕組みが分かっていれば、間を置きたいときは声を出したまま考える、といった対処が選べる。
※本記事の一次ソースはすべて2026-09-16に各公式ドキュメントで確認した。仕様は更新されるため、最新は各公式ドキュメントで確認してほしい。
Comments