こんにちは、クラスター株式会社の Software Engineer のとびゃです。 Cluster Conference 2022 で発表があった「音声ノーマライズ &ノイズキャンセリング」がリリースされましたね。
この 2 つはメタバース研究所の satomi さんがオープンソースの C# 移植や論文の内容を実装し、私が Unity でのパフォーマンス最適化をしました。そこで今回は satomi さんに音声ノーマライズ(リリース時には「音量の自動調整」という名前になりました)の解説をしてもらい、 cluster x メタバース研究所の協力の成果をお見せしたいと思います!
cluster で声がサーバーに送信されるまで
本題に入る前に、 cluster での音声処理の全体像を掴めるように軽く説明します。 cluster では音声の変換処理を送信側に寄せていて、以下の順番で音声を変更してサーバーに送信しています。
- マイクで録音する
- ノイズの抑制をする
- RNNoise というオープンソースのライブラリを C# に移植して使用しています
- 音量の自動調整をする
- 音量の自動調整はそのままだとノイズの音も自動調整で大きくなってしまうため、ノイズの抑制がオンでないと使えないようにしています
- Opus に圧縮する
- サーバーに音声を送信する前に Opus というフォーマットに圧縮しています
- アバターの表情で使用するリップシンクのデータはこの時につけています
- サーバーに送信する
以上が cluster で音声がサーバーに送信されるまでの流れです。ここからは実装を担当した satomi さんに 3 の音量の自動調整の中身を解説してもらいます。
音量の自動調整の技術的な詳細
メタバース研究所のリサーチエンジニアとして、主にclusterの音響周りの改善・R&Dを担当している satomi です。ここからは、今回実装した「音声ノーマライズ &ノイズキャンセリング」を支えている技術的背景を紹介したいと思います。
デジタル化された音声情報について、その音量を人間の可聴特性を考慮して定量化する方法として、国際電気通信連合(ITU)が標準化した”Algorithms to measure audio programme loudness and true-peak audio level” (ITU-R BS.1770)方法がデジタル放送でも採用されており、clusterでもこの技術を採用して音量の自動調整を行っています(仕様書はここより無料でダウンロード可能)。
この音量レベルを計算する全体像を表したのがFIGURE1 (BS.1770より引用)になります。
1. K特性フィルタによる周波数特性の重み付け
まず、人間の可聴特性に応じたフィルタ(K特性フィルタ)を適用して補正を行います(下図)。人間の耳の感度は周波数によって異なります。これらの特性を模擬したものがK特性です。
技術的には、2次のIIR(無限インパルス応答)フィルターを2段階に組み合わせた信号処理になります。実際に実装する時には、デジタル信号処理の方法を用いて実装するのですが、デジタルフィルターの係数が周波数によって決まる為、入力音声信号のサンプリング周波数に応じて適切な係数を動的に設定する処理が必要になります。
2. 二重平均処理とセグメント化
次に、400ミリ秒幅のセグメント(ゲーティングブロック)を75%オーバーラップしながら作成します。このセグメントに対して、信号のパワーを求めるために、二乗平均処理を行った後に、 セグメント毎に音量レベルを計算していきます。
3. 瞬時ラウドネス値の計算
複数チャンネルがある場合には各チャンネルを合算し、それをデシベル(dB)へ変換して瞬時ラウドネス値を求めます(次式)。単位は、LKFSと決められています。式中の定数-0.691 は、K特性フィルタの利得を補正する値です。1[kHz]の正弦波( ステレオ信号 1[dBFS])を入力したときに1[LKFS]が得られるように決められています。
4. ゲーティング処理
人間の感覚は、音の大きな部分の音量に支配される傾向があります。そのため、測定区間に無音部分や音の小さい部分が含まれると、計算される平均ラウドネス値が、人間が実際に感じる主観ラウドネス値と比べて小さくなってしまいます。そこで、平均ラウドネス値をより人間の聴感に近づけるために、無音部分や音の小さい部分を取り除く「ゲーティング」と呼ぶ処理を行います。ゲーティング処理は、無音部分を取り除く絶対ゲーティングと、音の小さい部分を取り除く相対ゲーティングからなります。絶対ゲーティングでは、瞬時ラウドネスが規定の閾値(BS.1770-2では、-70[LKFS])以下であるものを取り除く処理を行います。相対ゲーティングでは、絶対ゲーティング後の平均値を求め、その平均値から10[dB]以上低い部分を取り除く処理を行います。
5. 平均ラウドネス値の計算
ゲーティング処理の後のセグメントに対して、再度3.のラウドネスの計算式を適用することで平均ラウドネス値を計算します。
clusterでは、以上の処理で計算した音量レベルが一定値になるように調整を行う事によって様々なユーザ環境で異なるマイク特性を自動的に調整する処理を行っています。
おわりに
ということで、今回は cluster とメタバース研究所が協力して、専門性が高い機能を実装できた例を紹介しました!これからもメタバース研究所との協力で機能開発を加速していきますが、クラスター株式会社にはそれにチャレンジする面白さがあることを伝えられていたら嬉しいです。
そして、クラスター株式会社では Software Engineer として一緒に戦ってくれる仲間や、それ以外にも様々な業種の方を積極採用中です!この記事を読んで興味が湧いた方はぜひお話だけでも聞きにきてください!