AIノイズ除去で、なんで声が金属っぽくなるの?

AIノイズ除去で、なんで声が金属っぽくなるの?
目次

会議で、声だけが別物になる

オンライン会議のAIノイズ除去を強くすると、キーボード音やエアコンの音はきれいに消えたのに、相手の声まで金属っぽくなることないですか?

声の輪郭が細くなったり、水中から話しているように揺れたりして、雑音があったときより聞き取りにくいことさえあります。ノイズを消した量が多すぎた、と言えば話は終わりそうです。

消しすぎただけでは説明しきれない

ノイズ除去は、音声に混ざった不要な成分を見つけて弱める処理です。強くかければ声の一部まで削ることがあるわけですが、不思議なのはその崩れ方です。全体として同じ音量まで弱まっていても、単に音が小さくなるだけのときと、金属的な質感に変わってしまうときがあります。

まず効いているのは、周波数ごとの削られ方の偏りです。ノイズ除去はすべての周波数を一様に弱めるのではなく、ある帯域を強く削り、別の帯域を残します。すると全体の音量を戻しても、母音の厚みや子音の鋭さを作る成分の強さの分布は元に戻らず、声が細くなったり金属的に響いたりします。

では、周波数ごとの強さの分布さえ丁寧に整えれば、元の声は取り戻せるのでしょうか。ところが実際には、強さをそろえたつもりでも違和感が残ることがあります。残った成分の強さだけでは、まだ何かが足りないようです。

音を短い波の束として置いてみる

音声は時間とともに形が変わります。そこで長い音声を数十ミリ秒ほどの短い区間に切り、各区間を高さの違う波へ分ける短時間フーリエ変換という方法で解釈できるか試してみます。

低い波は声の基本的な高さに、高い波は子音の鋭さや声の質感に関わります。ただし、各波がどれほど強いかだけでは足りません。波がその区間のどこから始まるかという位相も必要です。位相は、波の山と谷が時間軸のどこに来るかを表す値です。

この「強さと位相を一組で持つ」ために複素数が使われます。実数部と虚数部という二つの数を持つことで、一つの係数に強さと角度を入れられます。

複素数を「長さと角度を持つ数」として捉える流れは、こちらの記事でも図から辿れます。

強さが同じでも、波形は変わる

二つの音を考えてみます。どちらにも振幅1の基本波と振幅0.6の2倍波が含まれているとします。含まれる周波数とそれぞれの強さは同じです。

片方だけ2倍波の位相を半周ずらすと、成分表だけは変わらないのに、合成後の波形は別の形になります。図では青と金の線が、同じ二つの強さから作った波です。違うのは位相だけです。

振幅1の基本波と振幅0.6の2倍波を合成。成分の強さは同じでも、2倍波の位相をπずらすと合成波形が変わる。
振幅1の基本波と振幅0.6の2倍波を合成。成分の強さは同じでも、2倍波の位相をπずらすと合成波形が変わる。

この図は、位相を変えると合成波形の形が変わることだけを確かめる単純な例です。ただし、一定に続く周期音では、成分の位相だけを変えても聞こえ方はほとんど変わらないとされます(オームの音響法則)。人の声で位相が効いてくるのは、声が時間とともに変わり、短い区間を重ねてつなぎ直すからです。区間ごとの位相関係がそろわないと、境目で波形が滑らかにつながらず、子音の立ち上がりや余韻の形が崩れます。ここではじめて、全体の音量を戻しても元の声にならない理由の一部を位相から説明できます。

同じことは、スマートフォンの夜景モードで写真を重ねる場面にもあります。各写真の明るさをそろえても、手ぶれで位置が少しずれたまま重ねれば、輪郭が二重になったり細部が溶けたりします。音声の位相も、波の山と谷をどこで重ねるかという位置合わせです。成分の量だけでなく、隣り合う位置や時刻とのつながりが自然さを決める点は共通しています。

一つの係数に、強さとタイミングを入れる

短時間フーリエ変換の係数を $X_{m,k}$ とすると、次の形で書けます。

$$ X_{m,k}=\sum_{n=0}^{N-1}x[n+mH]w[n]e^{-i2\pi kn/N} $$

$m$ は何番目の短い区間か、$k$ はどの高さの波かを示します。$N$ は一つの区間に含める音の記録点の総数、$n$ はその区間内で何番目の記録点かを示します。$x$ は元の音声、$w$ は切り出した区間の端を滑らかにする窓、$H$ は区間をずらす幅です。指数の中の $i$ は $i^2=-1$ を満たす虚数単位で、各時点の音を回転として足し合わせる役目を持ちます。

得られた係数は、より読みやすく次のようにも書けます。

$$ X_{m,k}=|X_{m,k}|e^{i\phi_{m,k}} $$

$|X_{m,k}|$ はその波の強さ、$\phi_{m,k}$ は位相です。同じ $|X_{m,k}|$ でも、$\phi_{m,k}$ が違えば、時間へ戻した波形は同じになりません。

ノイズ除去では、AIが各区間と周波数について、どれをどれだけ残すかを推定します。実装によっては強さを表すマスクを掛け、観測した音の位相を再利用します。別の実装では複素数の係数そのものを推定します。どちらでも推定誤差や区間間の不連続が大きければ、声が細くなったり金属的な残響が出たりする可能性があります。金属音には強さ側の欠落など複数の原因があり、位相だけが原因だと断定はできません。それでも、強さだけ整えれば十分とは限らないことは、この式から読めます。

声を戻すには、何を残すべきか

ノイズ除去の強さを上げるほど、雑音が減る方向には進みます。しかし、自然な声へ近づくかどうかは別の軸です。周波数ごとの量を整えるだけでなく、波が時間の中でどうつながるかまで保てて初めて、声らしさが残ります。

そう考えると、会議アプリの「ノイズ除去レベル」は、消す量を決めるつまみというより、雑音と声の時間構造をどこまで取り替えるかを選ぶつまみなのかもしれません。もしAIが音の強さだけでなく位相のつながりまで安定して復元できたら、雑音を消すほど声が不自然になるという交換条件そのものを、崩せるでしょうか?

よかったらシェアしてね!
  • URLをコピーしました!
目次