
AI英会話をスピーカーで使ってAIが急に黙るとき、裏ではエコーキャンセルという処理が関わっていることがあります。
こちらは何も言っていないのに、割り込まれたように止まる。
原因の1つが、スピーカーから出たAIの声をマイクがもう一度拾う「エコー」です。
エコーキャンセルは、拾い直したその音をマイクの音から引き算する処理です。
- エコーがどの経路で起きているか
- エコーキャンセルが何を引き算しているか
- ブラウザ・iOS・Androidのどこにスイッチがあるか
- イヤホンのほうが起きにくい理由
根拠はW3C・Apple・Android・OpenAIの公式ドキュメントだけです。
特定のアプリの挙動を約束する記事ではありません。
どの処理を入れているかは、アプリの作りによります。
【結論】AI英会話のエコーキャンセルはAI自身の声をマイクの音から消している
先に結論を置きます。
| 音の行き先 | エコーキャンセルが無いと | エコーキャンセルが働くと |
|---|---|---|
| AIの声がスピーカーから出る | 部屋に広がる | 部屋に広がる(ここは同じ) |
| その声がマイクに戻る | あなたの声と混ざって送られる | 鳴らした分が差し引かれる |
| AIが入ってきた音を聞く | 自分の声を「話し始め」と数えうる | あなたの声だけが残りやすい |
消しているのは、雑音一般ではありません。
消しているのは端末が自分で鳴らしている音です。
W3CのMedia Capture and Streamsの仕様は、これをエコーキャンセルと呼んでいます。
再生中の音を、マイクが録った音から取り除こうとする処理という定義です。
- 消す対象=端末がいま鳴らしているAIの声
- 消す場所=マイクの音が外へ出る前
- 消し方=「取り除こうとする」処理で、残ることもある
3つ目が大事です。
エコーキャンセルは完全に消す約束ではない。
だから残った分を、使い方の側で減らす意味があります。
AI英会話のエコーキャンセルが引き算している音の中身
エコーはスピーカーからマイクへの一周
AIの声は、スピーカーから空気を通って部屋に出ます。
同じ端末のマイクは、その空気の振動も一緒に拾う。
拾った音はあなたの発話と一緒に、AIの側へ送られます。
AIから見ると、自分の声が少し遅れて返ってくる形です。
| 段 | 起きていること | 誰が関わるか |
|---|---|---|
| 1 | AIの声を端末が鳴らす | 端末のスピーカー |
| 2 | 声が部屋の空気を伝わる | 部屋の広さや壁 |
| 3 | マイクが声を拾い直す | 端末のマイク |
| 4 | 拾った音がAIへ送られる | アプリの作り |
エコーキャンセルが手を入れるのは、3段目と4段目の間です。
1段目と2段目は、使い方でしか変えられません。
引き算の材料は端末がいま鳴らしている音
端末は、自分がいま何を鳴らしているかを知っています。
だからマイクの音から、その分だけを差し引ける。
Androidの開発者向け資料も、相手から届いた信号の寄与を録った音から取り除く処理だと説明しています。
引き算の材料は相手の声のデータであって、部屋の雑音ではありません。
- 部屋のエアコンや車の音
- 隣の人の話し声
- 別の端末が鳴らしている音
3つとも、端末が自分で鳴らした音ではありません。
こうした音を減らすのは、ノイズ抑制という別の処理です。
ブラウザ・iOS・Androidでスイッチの場所が違う
同じエコーキャンセルでも、入れる場所は端末の種類ごとに違います。
| 動く場所 | スイッチの名前 | 公式資料にある中身 |
|---|---|---|
| ブラウザ | getUserMediaのechoCancellation | true・false・all・remote-onlyの4つの値 |
| iOS | voice processing I/O | エコーキャンセルと自動音量補正をまとめて行う |
| Android | AcousticEchoCanceler | API レベル16から使える部品 |
どれも、アプリを作る側が選んで入れる部品です。
利用者が直接触る設定とは限りません。
AI英会話のエコーキャンセルを端末ごとに見る
ブラウザはechoCancellationの4つの値
ブラウザでマイクを開くときは、getUserMediaという仕組みを使います。
そのときに、echoCancellationという制約を付けられます。
MDNによると、この制約は2020年1月から主要ブラウザで広く使える状態です。
| 値 | 取り除く音 |
|---|---|
| false | 何も取り除かない |
| true | 取り除く範囲をブラウザが決める |
| all | 端末が鳴らす音を全部取り除こうとする |
| remote-only | 通話相手から届く音だけを取り除こうとする |
allは、通知音や画面の読み上げまで外へ送らないための値です。
remote-onlyの対象は、WebRTCの通話の仕組みで届いた音に限られます。
AIの声がその仕組みで届いていないと、remote-onlyでは消えない。
trueは、少なくともremote-onlyの範囲を消そうとし、allの範囲まで消すよう努める値です。
ブラウザが細かい種類に対応していない場合は、trueかfalseしか選べません。
どの値で開いているかは、アプリの作りで決まります。
iOSはvoice processing I/Oを通すかどうか
iOSでは、音声通話向けのモードと、音声処理の部品が別々にあります。
モードは音声・ビデオ・ゲームの3つのチャット用が用意されています。
- モード=声に合わせた音質の調整と、使える出力先の絞り込み
- voice processing I/O=エコーキャンセルや自動音量補正を行う部品
Appleの資料は、ここを分けて説明しています。
チャット用モードにしただけではエコーキャンセルはかからない。
voice processing I/Oか、AVAudioEngineの音声処理をオンにして初めて入ります。
入れない場合は、再生の音量も低めになるとされています。
AndroidはAcousticEchoCancelerがあるか
Androidでは、AcousticEchoCancelerという部品を録音の流れに付けます。
この部品はAPI レベル16から用意されています。
| 確かめること | 使う呼び出し | 分かること |
|---|---|---|
| 端末が部品を持っているか | isAvailable | 持っていなければfalse |
| 録音に付けられたか | create | 持っていなければnullが返る |
| 最初からオンか | getEnable | 端末が既定で入れている場合がある |
表の1行目がfalseの端末では、この部品は使えません。
3行目のとおり、録音の種類によっては端末が最初から入れていることもあります。
だから同じアプリでも、端末によって残り方が変わりえます。
AI英会話でエコーキャンセルが外れたときの止まり方
外れたときに目立つのは、AIが自分の声で止まる現象です。
OpenAIのRealtime APIを例に、中で起きる順番を並べます。
| 順番 | 中で起きること |
|---|---|
| 1 | AIの声がスピーカーから出る |
| 2 | マイクがその声を拾い直して送る |
| 3 | 音声区間検出(VAD)が「話し始め」と判定する |
| 4 | 進行中の応答が取り消される |
| 5 | AIが話の途中で黙る |
OpenAIの資料では、VADがオンのときに利用者の発話を検出すると、進行中の応答を取り消します。
拾い直した声が発話と数えられれば、同じ流れに乗ります。
つまりAIが自分の声に割り込まれる形です。
話し始めた瞬間にAIの声が止まる仕組みそのものは、割り込みの記事にまとめました。↓

- threshold=0.5(0から1の間で決める)
- prefix_padding_ms=300ミリ秒
- silence_duration_ms=500ミリ秒
thresholdを高くすると、より大きな音でないと話し始めと見なされません。
OpenAIの資料は、騒がしい場所で高くする使い方を挙げています。
ただしこれは、拾い直した声を消す処理ではありません。
判定の基準を厳しくして、反応しにくくしているだけです。
取り消しそのものを止める設定として、interrupt_responseもあります。
どの値を使うかは、アプリの作りによります。
AI英会話のエコーキャンセルで間違えやすい3点
- エコーキャンセルとノイズ抑制を同じものだと思っている
- iOSでチャット用モードにすればかかると思っている
- オンにすれば必ずゼロになると思っている
3つはどれも別の話です。
W3Cの仕様は、エコーキャンセル・自動音量補正・ノイズ抑制を別々の項目として並べています。
Androidの資料も、エコーキャンセルはノイズ抑制と組み合わせて使われることが多いと書き分けています。
| 思い込み | 実際 | 根拠の場所 |
|---|---|---|
| ノイズ抑制と同じ | 消す対象が違う別の処理 | W3Cの制約の一覧 |
| チャット用モードでかかる | 音声処理の部品を通して初めて入る | AppleのvoiceChatの説明 |
| 必ずゼロになる | 取り除こうとする処理で、残ることがある | W3Cの定義とGoogle Meetのヘルプ |
OpenAIのRealtime APIにも、入力の雑音を減らすnoise_reductionという設定があります。
これはVADやモデルに渡す前に音をこす処理で、2種類から選びます。
名前はノイズ低減で、エコーキャンセルとは呼ばれていません。
雑音や反響が認識をどこまで崩すかは、ノイズの記事にまとめました。↓

AI英会話のエコーキャンセルを助ける見直しの手順
エコーキャンセルは、アプリの側の部品です。
利用者にできるのは、拾い直す音そのものを減らすことです。
Google Meetのヘルプは、反響音を抑える操作として3つを挙げています。
| 見直す順 | やること | 減るもの |
|---|---|---|
| 1 | ヘッドフォンかイヤホンにする | スピーカーから部屋に出る音 |
| 2 | スピーカーの音量を下げる | マイクに戻る音の大きさ |
| 3 | 話さないときはミュートにする | AIへ送られる余計な音 |
| 4 | 別のアプリやタブの音を止める | 端末が鳴らす別の音 |
1行目がいちばん大きく変わります。
イヤホンならAIの声が部屋に出ない。
スピーカーとマイクの間の空気の経路が、ほとんどなくなるからです。
OpenAIのnoise_reductionも、ヘッドホンのような近接マイク用と、ノートパソコンのような離れたマイク用を分けています。
マイクと口の距離が違えば、拾う音の性質も違うという整理です。
4行目は、Google Meetのパソコン向けヘルプが挙げている話です。
他のタブやアプリの音が相手に聞こえる場合は、ヘッドフォンで避けるよう勧めています。
- 音量は聞き取れる最小まで下げる
- 端末をできるだけ自分の口の近くに置く
それでも止まるなら、イヤホンに替えるのが近道です。
なおGoogle Meetは、反響音を検出するとメニューに赤い丸を出します。
この赤い丸は、問題が残っていても1日1回しか出ない作りです。
AI英会話のエコーキャンセルによくある質問
スピーカーのままでも使えるのか
エコーキャンセルが入っている作りなら、スピーカーでも会話はできます。
残った分で止まるときは、音量を下げるかイヤホンに替えるのが手早い。
入っているかどうかは、アプリの作りによります。
利用者が自分でオンにできるのか
スイッチは、ブラウザの制約やiOS・Androidの部品の側にあります。
- どの値で開くかを決めるのはアプリの作り
- 利用者向けの設定画面に出すかどうかも作り次第
パソコンのブラウザとスマホのアプリで違うのか
引き算をしている部品が別なので、残り方は違いえます。
ブラウザはechoCancellationの値、スマホは端末の音声処理の部品が担います。
押して話す形なら起きにくいのか
OpenAIの資料には、VADを使わずにボタンで話す形の手順もあります。
この形では、話し始めを決めるのが音ではなくボタンです。
拾い直した声で応答が取り消される流れには乗りにくくなります。
まとめ|AI英会話のエコーキャンセルで押さえる3点
最後に3点だけ残します。
- 消しているのは端末が鳴らしたAIの声=雑音とは別
- スイッチはブラウザ・iOS・Androidで場所が違い、入れるのはアプリの作り
- 残った分はイヤホン・音量・ミュートで減らせる
この3つが分かっていれば、AIが急に黙る理由の見当がつきます。
どの部品を入れているかは作りごとに違い、変わることもあります。
迷ったら、まずイヤホンに替えて同じ会話を試してください。
細かい仕様は、必ず各社の公式ドキュメントで確かめてください。
\3分で読める/
AIが会話の切れ目をどこで決めているかが分かる
あわせて読みたい記事も置いておきます。
会話の切れ目をAIがどう決めているかは、ターン検出の記事にまとめました。↓

参考文献も以下にまとめます。
参考文献
- MediaTrackConstraints: echoCancellation property(MDN Web Docs 公式サイト)
- voiceChat(Apple Developer 公式サイト)
- AcousticEchoCanceler(Android Developers 公式サイト)
- Realtime conversations(OpenAI 公式サイト)
Comments