音声のリサンプリング手法とリアルタイムに向けた実装の紹介
Parakeet株式会社でResearcherをしている金子(nadare)です。CPUのみで動作するリアルタイムAIボイスチェンジャーのParavoの研究開発をしております。
本記事ではリアルタイムアプリケーションにおけるリサンプリングの課題と、Paravoアプリにおける「Rubato」ライブラリを用いたリサンプリングの実装の紹介をします。
対象読者
- 音声処理のアプリケーションに興味のある方
- Rubatoの設定のコツを知りたい方
リサンプリング手法の必要性
サンプリングレートとは
音声は本来アナログの波形ですが、コンピューター上で扱う際は一定時間ごとに区切ってデジタル表現に量子化します。音声を区切る単位は1秒間に何分割するか(サンプリングレート)で、よく用いられるのは48000Hz、44100Hz、24000Hz、16000Hzなどがあります。
Paravoは音声を内部で24000Hzで扱っています。そのため、入力の音声を24000Hzに変換して処理し、処理した音声を24000Hzから出力機器の周波数へ変換する必要があります。
リサンプリング時に生じるノイズ
しかし、この音声のリサンプリングには工夫が必要です。サンプリングレートがXHzの場合、その半分の周波数であるX/2Hz(ナイキスト周波数)まで正確に表現可能です。そのため、サンプリングレート24000Hzの音声を48000Hzに変換する際、元のナイキスト周波数の12000Hzの成分までしか入っていないことが理想です。
実際にJVSデータセットの音声を24Hz→48Hzへリサンプルした際のノイズをスペクトログラムでみてみましょう。横軸が時間で、縦軸が周波数ごとの成分の強さ(対数スケール)です。画像左では多項式補間(cubic)で補完したため、元のナイキスト周波数の12000Hz以上に基準に鏡像のような成分が発生しています。これは実際に音声を確認するとジリジリとした雑音として聞こえます。
ノイズ軽減のためのフィルタと遅延
ノイズを軽減するためリサンプリング時はフィルタを併用することがあります。例えば波形の前後256点を参照するフィルタを使うと、画像右のように12000Hz以上にあるノイズを大きく軽減できます。しかし、これをリアルタイムに適用するには、今回の設定では約5.3msほどの遅延を許容する必要があります。
Paravoでの実装
リアルタイムリサンプリングライブラリ、Rubato
ParavoはバックエンドをRustで実装しています。そのうち、リアルタイムのリサンプリングには「Rubato」というライブラリを採用しています。このライブラリによって変換ごとに過去の音声をバッファで保持する、CPUアーキを踏まえて高速化するといった実装等の手間を省くことができます。
2つのリサンプリング手法: Fast系とSinc系
rubatoではいくつかのサンプリング手法を行うクラスを提供していますが、ParavoではFastFixedOut、FastFixedIn、SincFixedInを利用しています。それぞれについて見ていきましょう。
Fast系の手法はフィルタを使わず多項式補完で行うリサンプリングです。前後の数点のみを見る多項式補完を使ってリサンプリングを行います。エイリアシングノイズは発生してしまうものの、フィルタ適用時に比べて遅延は極めて小さいです。
Sinc系の手法はフィルターを使うリサンプリングです。Rubatoでは途中で変換対象のサンプリングレートが変わっても良いよう、多項式補完とフィルターを使う補完を組み合わせています。
種類 | 補間方法 | 遅延 | 品質 | 用途 |
---|---|---|---|---|
FastFixed | 多項式補間 | 極小 | ノイズややあり | 入力音声処理 |
SincFixed | FIR補間 | 数ms程度 | 高品質 | 出力音声処理 |
Paravoでの設定
入力側の設定
入力側ではFastFixedOutのみを使用しています。Fast系を利用する理由として、ここで発生するノイズについては音声変換モデルの内部で吸収できる分、低遅延を優先したいからです。また、リサンプリング後の点数を固定するため、FastFixedOutを採用しました。
出力側の設定
出力側ではFastFixedInを「軽量・低遅延」のフィルタ、SincFixedInを「高品質」のフィルタとして提供しています。また、SincFixedInを利用時、Paravoではアプリで起動中はデバイス変更を出来ないように実装することで多項式補間をNearestを設定して省略する設定にし、負荷の軽減を実施しています。
設定 | フィルタ | 特徴 | 理由/備考 |
---|---|---|---|
入力側 | FastFixedOut | 軽量・低遅延 | ノイズは音声変換モデル内で吸収可能なため、遅延を最小化。リサンプリング後の点数が固定。 |
出力側 1 | FastFixedIn | 軽量・低遅延 | 変換音声のモニター用など品質より応答速度を優先するのに向いた設定。 |
出力側 2 | SincFixedIn | 高品質 | アプリ起動中はデバイス変更を禁止し、併用する多項式補完の設定をNearestに設定して負荷を軽減。 |
まとめ
Paravoで実装しているリサンプリングについて紹介しました。PyTorchでのresampleに興味がある方はこちらの公式ドキュメントがエイリアシングノイズの影響もわかりオススメです。今後もParavoに実装している音響技術やAIについて紹介していきますので、よろしくお願いいたします。
Discussion