MENU

エコーキャンセルはAI英会話で何を消しているのか。自分の声が返ってくる仕組みを公式仕様から分解した

エコーキャンセルはAI英会話で何を消しているのか。自分の声が返ってくる仕組みを公式仕様から分解した

AI英会話をスピーカーで使ってAIが急に黙るとき、裏ではエコーキャンセルという処理が関わっていることがあります。

こちらは何も言っていないのに、割り込まれたように止まる。

原因の1つが、スピーカーから出たAIの声をマイクがもう一度拾う「エコー」です。

エコーキャンセルは、拾い直したその音をマイクの音から引き算する処理です。

この記事で分けること
  • エコーがどの経路で起きているか
  • エコーキャンセルが何を引き算しているか
  • ブラウザ・iOS・Androidのどこにスイッチがあるか
  • イヤホンのほうが起きにくい理由

根拠はW3C・Apple・Android・OpenAIの公式ドキュメントだけです。

特定のアプリの挙動を約束する記事ではありません。

どの処理を入れているかは、アプリの作りによります。

TOC

【結論】AI英会話のエコーキャンセルはAI自身の声をマイクの音から消している

先に結論を置きます。

音の行き先エコーキャンセルが無いとエコーキャンセルが働くと
AIの声がスピーカーから出る部屋に広がる部屋に広がる(ここは同じ)
その声がマイクに戻るあなたの声と混ざって送られる鳴らした分が差し引かれる
AIが入ってきた音を聞く自分の声を「話し始め」と数えうるあなたの声だけが残りやすい

消しているのは、雑音一般ではありません。

消しているのは端末が自分で鳴らしている音です。

W3CのMedia Capture and Streamsの仕様は、これをエコーキャンセルと呼んでいます。

再生中の音を、マイクが録った音から取り除こうとする処理という定義です。

  • 消す対象=端末がいま鳴らしているAIの声
  • 消す場所=マイクの音が外へ出る前
  • 消し方=「取り除こうとする」処理で、残ることもある

3つ目が大事です。

エコーキャンセルは完全に消す約束ではない。

だから残った分を、使い方の側で減らす意味があります。

AI英会話のエコーキャンセルが引き算している音の中身

エコーはスピーカーからマイクへの一周

AIの声は、スピーカーから空気を通って部屋に出ます。

同じ端末のマイクは、その空気の振動も一緒に拾う。

拾った音はあなたの発話と一緒に、AIの側へ送られます。

AIから見ると、自分の声が少し遅れて返ってくる形です。

段起きていること誰が関わるか
1AIの声を端末が鳴らす端末のスピーカー
2声が部屋の空気を伝わる部屋の広さや壁
3マイクが声を拾い直す端末のマイク
4拾った音がAIへ送られるアプリの作り

エコーキャンセルが手を入れるのは、3段目と4段目の間です。

1段目と2段目は、使い方でしか変えられません。

引き算の材料は端末がいま鳴らしている音

端末は、自分がいま何を鳴らしているかを知っています。

だからマイクの音から、その分だけを差し引ける。

Androidの開発者向け資料も、相手から届いた信号の寄与を録った音から取り除く処理だと説明しています。

引き算の材料は相手の声のデータであって、部屋の雑音ではありません。

引き算の対象にならない音
  • 部屋のエアコンや車の音
  • 隣の人の話し声
  • 別の端末が鳴らしている音

3つとも、端末が自分で鳴らした音ではありません。

こうした音を減らすのは、ノイズ抑制という別の処理です。

ブラウザ・iOS・Androidでスイッチの場所が違う

同じエコーキャンセルでも、入れる場所は端末の種類ごとに違います。

動く場所スイッチの名前公式資料にある中身
ブラウザgetUserMediaのechoCancellationtrue・false・all・remote-onlyの4つの値
iOSvoice processing I/Oエコーキャンセルと自動音量補正をまとめて行う
AndroidAcousticEchoCancelerAPI レベル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を例に、中で起きる順番を並べます。

順番中で起きること
1AIの声がスピーカーから出る
2マイクがその声を拾い直して送る
3音声区間検出(VAD)が「話し始め」と判定する
4進行中の応答が取り消される
5AIが話の途中で黙る

OpenAIの資料では、VADがオンのときに利用者の発話を検出すると、進行中の応答を取り消します。

拾い直した声が発話と数えられれば、同じ流れに乗ります。

つまりAIが自分の声に割り込まれる形です。

話し始めた瞬間にAIの声が止まる仕組みそのものは、割り込みの記事にまとめました。↓

VADの設定例に出てくる値
  • 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のパソコン向けヘルプが挙げている話です。

他のタブやアプリの音が相手に聞こえる場合は、ヘッドフォンで避けるよう勧めています。

スピーカーで続けたいときに残す2つ
  • 音量は聞き取れる最小まで下げる
  • 端末をできるだけ自分の口の近くに置く

それでも止まるなら、イヤホンに替えるのが近道です。

なおGoogle Meetは、反響音を検出するとメニューに赤い丸を出します。

この赤い丸は、問題が残っていても1日1回しか出ない作りです。

AI英会話のエコーキャンセルによくある質問

スピーカーのままでも使えるのか

エコーキャンセルが入っている作りなら、スピーカーでも会話はできます。

残った分で止まるときは、音量を下げるかイヤホンに替えるのが手早い。

入っているかどうかは、アプリの作りによります。

利用者が自分でオンにできるのか

スイッチは、ブラウザの制約やiOS・Androidの部品の側にあります。

  • どの値で開くかを決めるのはアプリの作り
  • 利用者向けの設定画面に出すかどうかも作り次第

パソコンのブラウザとスマホのアプリで違うのか

引き算をしている部品が別なので、残り方は違いえます。

ブラウザはechoCancellationの値、スマホは端末の音声処理の部品が担います。

押して話す形なら起きにくいのか

OpenAIの資料には、VADを使わずにボタンで話す形の手順もあります。

この形では、話し始めを決めるのが音ではなくボタンです。

拾い直した声で応答が取り消される流れには乗りにくくなります。

まとめ|AI英会話のエコーキャンセルで押さえる3点

最後に3点だけ残します。

  • 消しているのは端末が鳴らしたAIの声=雑音とは別
  • スイッチはブラウザ・iOS・Androidで場所が違い、入れるのはアプリの作り
  • 残った分はイヤホン・音量・ミュートで減らせる

この3つが分かっていれば、AIが急に黙る理由の見当がつきます。

どの部品を入れているかは作りごとに違い、変わることもあります。

迷ったら、まずイヤホンに替えて同じ会話を試してください。

細かい仕様は、必ず各社の公式ドキュメントで確かめてください。

\3分で読める/

AIが会話の切れ目をどこで決めているかが分かる

⇧目次に戻る⇧

あわせて読みたい記事も置いておきます。

会話の切れ目をAIがどう決めているかは、ターン検出の記事にまとめました。↓

参考文献も以下にまとめます。

参考文献

Let's share this post !

Author of this article

Comments

To comment

TOC