Amazon Chime SDKで音声からノイズを除去する

公開:2021/02/16
更新:2021/03/01
6 min読了の目安(約5700字TECH技術記事

この記事は、こちらの記事を改変したものになります。
https://cloud.flect.co.jp/entry/2021/02/16/113455

はじめに

前回の記事では、Amazon Chime SDK for JS[1]のVideo Processing APIを使い映像を加工して仮想背景を実現する方法をご紹介しました(参照)。今回は、音声を加工するについてご紹介します。Amazon Chime SDK for JSは、入力された音声からノイズを除去するVoice Focusという機能を提供しています。今回はこの効果を見ていきたいと思います。

こちらの動画は実際にVoice Focusを適用したものです(00:11~)。かなりきれいにノイズを抑えることができてますね。

https://www.youtube.com/watch?v=8lV4wkGrWj4

Voice Focus

Voice Focus は、Amazon Chime(アプリケーション)では昨年の8月ごろから使えていたようですが、SDKとしては昨年の11月に使えるようになった機能です(参照)。公式のドキュメントの書きっぷりからすると以前からノイズ除去機能(noise suppression)は入っていたようで、これをディープラーニング/機械学習により、風、ファン、水、芝刈り機、犬の吠える声、タイピングの音、紙をめくる音などのノイズを除去できるように強化したもののようです。個人的には、以前のバージョンはノイズ除去をしていないのではないかと思うくらい、ほとんどノイズ除去できていなかった記憶があるのですが、そこはあまり追求しないようにします。なぜなら、記憶違いかもしれないし、過去のことだし、なによりこのVoice Focusの性能はかなり良いから。

公式でのドキュメントに記載されている通り、状況によっては環境音を聞かせたいというユースケースがあるかもしれません。また、それなりにCPUに負荷がかかりますので、使用するPCのスペックに応じては使用が適さない場合があります。このため、デフォルトではVoice Focusは有効になっていませんので、使用する場合は開発者がその意図をもって有効にする必要があります。以下、有効にする方法を簡単に説明して、その効果と実際どの程度の負荷がかかるのかを見ていきたいと思います。

なお、iOS Safariはサポートされていないなど一部使用できない環境があります。サポート範囲は公式ドキュメントを参照してください。

Voice Focusのスペック

Voice Focusではノイズ除去のスペックをパラメータで設定できます。
基本はデフォルトでいいと思いますが、用途に応じて変えることができます。
代表的なパラメータは次のようなものになります。

  • usagePreference
    ユーザ操作によるタブの切り替えなど、ノイズ除去以外のブラウザの処理による影響の受け方を選択できます。'interactivity'はより影響を受けずらくスムースなアウトプットを生成できます。'quality'は、処理が途切れる(glitching)リスクを許容してより品質の高い処理を行います。デフォルトは'interactivity'になっています。

  • variant
    アウトプットの品質を選択できます。'C100', 'C50', 'C20', 'C10', 'auto'があり、'C100'が最も品質が高いですが処理コストも高くなります。'C10'が最も品質が低いですが処理コストが低くなります。'auto'はSDKが自動で選択してくれます。デフォルトは'auto'です。

そのほか、SIMDを使用するかを選択できたり、webworkerを使用するかを選択できたりします。

使用方法

Voice Focusを使用するまでの設定処理の流れは下図のようなものとなります。
image

Amazon Chime SDKでは、音声入力のソースとしてマイクのDeviceIDやHTML5のMediaStreamなどを指定できます(chooseAudioInputDevice)が、Voice Focusを使う場合はVoiceFocusTransformDeviceを指定します。このVoiceFocusTransformDeviceは、マイクやMediaStreamで入力された音声からノイズを除去したものを出力する仮想音声入力デバイスです。VoiceFocusTransformDeviceは、VoiceFocusDeviceTransformerのインスタンスから生成します。VoiceFocusDeviceTransformerは上述のスペックを入力としてインスタンスを生成します。

なお、使用する前にはVoice Focusが使用できるかを確認します。この確認は次の2段階で実施する必要があります。

  • (1) 使用できる環境かといくつかの初期化処理ができるかを確認
  • (2) スペックなどを含めより詳細に希望の処理ができるかを確認

コードとしては下記のような形になると思います。(a)のところで(1)の確認を行い、その後、(b)でノイズ除去VoiceFocusDeivceTransformerのインスタンスをスペック情報を入力として生成します。その後(c))でそのインスタンスがサポートされているかを確認します。

if (await VoiceFocusDeviceTransformer.isSupported() === false) { // <------ (a)
    console.log("Voice Focus is not supported in this browser.")
    return
}
this.voiceFocusDeviceTransformer = await VoiceFocusDeviceTransformer.create(suppressionSpec) // <----- (b)
if (this.voiceFocusDeviceTransformer.isSupported(spec) === false) { // <------ (c)
    console.log("The input spce of Voice Focus is not supported in this browser.")
    return
}

後は、VoiceFocusTransformDeviceを生成してあげて、chooseAudioInputDeviceに指定すれば完了です。

this.voiceFocusTransformDevice = await this.voiceFocusDeviceTransformer.createTransformDevice(device)
this.meetingSession.audioVideo.chooseAudioInputDevice(this.voiceFocusTransformDevice)

とても簡単ですね。

ノイズ除去の効果

それでは、ノイズ除去の効果を見てみましょう。
下図のように、実際に使用されるアプリケーションを想定して、送信側と受信側にそれぞれAmazon Chime SDKで作成したクライアントを設置します。そして、送信側では動画を映像入力、音声入力として用い、受信側で受信データを録画しました。
image

次の動画は時間ごとにvariantを変えてノイズ除去を行ったものです。その他のパラメータはデフォルト値のままです。今回テストに用いた動画はYoutubeからお借りしました。(オリジナルの動画についてはAcknowledgmentsを参照)

https://www.youtube.com/watch?v=8lV4wkGrWj4

Timeline

  • 00:00​~00:11​ original
  • 00:11​~00:20​ applying Voice Focus (C10)
  • 00:20​~00:35​ applying Voice Focus (C20)
  • 00:35​~00:44​ applying Voice Focus (C50)
  • 00:44​~00:54​ applying Voice Focus (C100)

最初の11秒はオリジナルの音声です。雨の音がすごいですね。その後約10秒ごとにvariantを'C10', 'C20', 'C50', 'C100'と変えています。低品質のC10でほとんど雨の音は聞こえなくなりますね。少し声に機械音が混ざっているように聞こえますがビデオ会議には全然問題が出ないレベルだと思います。'C20'以降は正直私には違いが判らないです。まぁ、少しづつ良くなっているのだろうとは思いますが。いずれにせよ、とても高いレベルでノイズ除去をしてくれることがわかりました。

CPU負荷の確認

Voice Focusの品質とCPU負荷はトレードオフということなので、それぞれ品質を変えたときにCPU負荷を見てみたいと思います。今回の評価にはThinkPad(corei5 8350U 1.7GH)を用いました。

image

上から順に'C100', 'C50', 'C20', 'C10', 'None(未使用)'の時のChormeのCPU使用率です[2]。'C100'と'C10'では5%くらいの違いが出るようです。今回はThinkpad(notePC)での評価で5%の差でしたが、よりCPU性能が限られているスマホではより大きな違いになるかもしれません。上記の品質と併せて考えると、スマホ向けには'C10'でも良いのではないかと思います。

以上です。 Voice Focusを使ってみた結果をまとめます。

  • Voice Focusによるノイズ除去はかなり強力だった。
  • 品質のパラメータを変えても大きな違いが感じられなかった。
  • 一方、CPU使用率については明確な違いが出た。(CPU使用率だけ定量評価したからだけど。)
  • 基本は最低品質の'C10'で十分有用そう。

もちろん、より繊細に音を聞き分けられる方が聞いたら品質に大きな違いに気づくかもしれませんし、ユースケースに応じて品質のパラメータは調整すべきだと思いますので、ご自身でご確認いただくのが良いと思います。

リポジトリ

今回評価に用いたデモのソースコードは次のリポジトリにおいてあります。

https://github.com/w-okada/flect-chime-sdk-demo

まとめ

今回は、Amazon Chime SDK のVoice Focus 機能を用いて音声のノイズ除去を試してみました。かなりしっかりとノイズを除去してくれることがわかりました。また、高品質モードはそれなりにCPU負荷があるので一律で高品質モード('c100')で動かすのは危険そうです。おそらく、基本は低品質モード('C10')で動かして、ユースケースに応じて高品質モードを使うのが良いのではないかと思います。

Acknowledgments

デモはこちらの "クリエイティブ・コモンズ表示ライセンス(再利用を許可する)" の映像を使用させて頂きました。

https://www.youtube.com/watch?v=6gBtE-n8j2E
脚注
  1. Amazon Chime SDK for JSはAmazonが提供するビデオ会議システムをWebアプリに組み込むためのSDK。 ↩︎

  2. ある瞬間のスナップショットです。タイミングによって多少変動します。 ↩︎