rnnoise を使って展示会の録音ファイルから音声以外のノイズを消してしまおう

音声処理
Table of Content

テレビ会議は議事録をとる代わりに録音

他の記事でも散々書いておりますように、筆者は議事録をとる代わりに全ての会議を録音することを推奨しております。普通の会議では合意事項として「要点」と「次のアクション」をそれぞれ3行くらいずつ残しておけば十分だと思っていますし、それ以上が必要であれば、議事録をとるより資料と録音をきっちり残す方が正確かつ時間の節約になります。
筆者は個人的にこれを実践するため、ZOOMなどのオンライン会議で投影資料のスクショと音声録音をAIが自動で取得してくれるSummary Shotsというソフトウェアを開発し、1日5~7回に達する様々な会議の記録をとっています。このソフトウェアは外販もしていますので、ご関心があればこちらのページから無料サンプルをダウンロードください。
Summary Shots無料ダウンロードページへ

展示会のような立ち話の録音は可能か?

さて、議事録をとらないことに完全に慣れてしまった筆者は価値ある情報を得られる全ての場で録音したくなってしまいました。一番の候補は展示会です。展示会では自分の知らない世界の人の話を詳しく聞くことができますが、惜しむらくはメモをとりにくい。猛烈なスピードで会話のキャッチボールが交わされるため、ブースを離れた時には大事な話を結構忘れています。いちおう手帳に要点だけメモをしますが、多数のブースを回って疲れたところでオフィスに戻っても書き起こす気になれません。翌日に見直すころにはすっかり忘れていて、筆者好みの簡潔極まるメモが出来上がりますが、展示会の場合、会議と違って情報収集が目的なので、細部が重要なんですよね。簡潔なメモでは意味がないのです。

やはりここは録音に限る・・・のですが、残念ながら展示会の場は騒音がひどい。ひどすぎる。隣のブースから大音響の音楽が鳴り響き、日雇いのコンパニオンが客引き合戦をしています。説明員の話を直接聞き取ることさえ苦労します。「さすがに録音は無駄であろう」とあきらめておりました。

しかし、ある展示会で意を決してスマホの録音アプリをONにして、ジャケット外側の胸ポケットに入れた状態で説明員と会話をしてみることにしました。

その時の説明員の音声(の一部分)が以下になります。
(音がでます)

【説明員と対面で会話しているケース】

【説明員が他の人と話しているのを立ち聞きしているケース】

うむ? 何とか聞こえるぞ? スマホすごい。

ただし、立ち聞きしているケースは周囲の騒音が小さくて、かつ位置関係が良ければ上のようにギリギリ声が拾えるかどうか・・というくらいですね。

展示会の音声録音ファイルからノイズを消したい

今回やりたいこと

展示会の会話の録音をしてみてわかったことが、外部の騒音を拾ってはいるものの説明員の声は何とか聞こえるということです。
しかし、予想通り騒音がひどいです。この騒音の部分だけ除去してしまう方法はないのか? というのが今回のテーマです。以下のようなプロセスでrnnoiseというオープンソースを活用して音声ファイルからノイズを除去します。

今回のフロー

rnnoise について

ノイズキャンセリングイヤホンなどノイズキャンセリング自体は身近なものになっています。しかし、ノイズキャンセリングイヤホンは、外から入ってくる音(ノイズ)を消すもので、元の音源データにノイズが混じっている状態からノイズを消すことはできませんので、まったく別の技術です。

音源データ内のノイズを除去ないし軽減する技術は70年代から研究されていましたが、ここでもディープラーニングを使った手法が大きな効果を生んでいます。
今回利用するのはrnnoise というディープラーニングを利用したノイズ除去アルゴリズムです。

rnnoiseのダイアグラム  出所:https://arxiv.org/pdf/1709.08243.pdf


rnnoise はディープラーニングを使った手法の中でも非常に有名でノイズ除去の効果も高く、ソースコード、学習済みのモデルファイルごと提供されており、さらには商用利用可能なライセンス形態で提供されています。このため近年(2021年時点)rnnoiseは色々なアプリケーションの中に組み込まれるようになっています。rnnoiseの動作原理に興味がある人はこちらの論文を見てください。それにしても、rnnoiseの論文が公開されたのは2018年と結構古いのですね。

rnnoiseを動作させる環境を準備しよう

Ubuntuでサーバを立てる

Windows環境では難しいようなので、Linux環境で上記の作業を実施します。Linuxの中でもAIといえばUbuntuなので、Ubuntuでサーバを立てましょう。今回はAWSのEC2でUbuntuサーバを立てる前提で実験します。EC2でUbuntuサーバを立てる方法はこちらの記事などをご参照ください。
今回はAMIの検索で Ubuntuと入力し「Ubuntu Server 20.04 LTS (HVM), SSD Volume Type」を選択し「t2-micro」型のサーバを立ててください。(なんとrnnoiseは メモリわずか1GiBのt2-micro でも軽快に動作します。実験はしていませんが、Raspberry Pi 4 にUbuntu を入れても動作すると思います。Raspberry Pi 4 にUbuntuを入れる方法はこちらをご覧ください)

ffmpeg をUbuntuサーバにインストールする

今回利用するrnnoiseは16bit, モノラル,サンプリングレート48kHz の.raw 形式のファイルしか受け付けませんので、wavやmp3 などの音源データを利用する場合はデータ形式を変換する必要があります。Windows PCの上でフリーウェアなどを利用して変換してもよいですが、Ubuntu上のffmpegのコマンドラインで変換した方が手っ取り早いため、ffmpeg をインストールします。

sudo apt update
sudo apt upgrade
sudo apt install ffmpeg

rnnoise を git clone する

github 上にソースコードが公開されていますので(https://github.com/xiph/rnnoise)ここからgit clone します。実行する場所は、どこでもよいですが、例えばホームディレクトリ(/home/ubuntu/)で以下のコマンドを実行してください。

git clone https://github.com/xiph/rnnoise.git

rnnoise のセットアップ

/home/ubuntu/rnnoise/ というフォルダが出来たと思いますので、この中に入ってソースファイルをコンパイルします。なお、使うだけなら気にする必要はありませんが、rnnoise の大部分のコードは python ではなくC言語で書かれています。

コンパイルに入る前にまだCコンパイラやautoconf やlibtoolがないとエラーになるので以下のコマンドを実行しインストールしておきます。

sudo apt-get install autoconf
sudo apt install build-essential
sudo apt-get install -y libtool

ようやくコンパイルに入ります。

./autogen.sh
./configure
make

これで準備が整いました。

rnnoiseを利用してノイジーな音源ファイルからノイズを除去(軽減)しよう

まずSFTPソフトなどを使って、ノイジーな音源ファイル(ここでは hogehoge.mp3とします)をUbuntuサーバの/home/ubuntu/rnnoise/ の中に入れます。

ffmpeg を使って音源ファイルを変換しよう

ノイズ交じりの音声を含むmp3ファイルをrnnoiseで変換する場合、上述したように、16bit, モノラル,サンプリングレート48kHz の.raw 形式のファイルに変換する必要があります。 hogehoge.mp3 というファイルを hogehoge.raw というファイルに変換する場合、以下のようなコマンドを入力します。

ffmpeg -i hogehoge.mp3 -ac 1 -ar 48000 -f s16le -acodec pcm_s16le hogehoge.raw

簡単に解説しますと
-i hogehoge.mp3 の部分は入力ファイルとして hogehoge.mp3 を使う指示
-ac 1 の部分は出力のチャンネル数を1(モノラル)にする指示
-ar 48000 の部分は出力のサンプリングレートを 48kHz にする指示
-acodec pcm_s16le の部分は出力のコーデックを16bit PCM (もっと細かく言うと16bit PCM signed int の little endian形式)にする指示
です。

rnnoise でノイズを除去しよう

/home/ubuntu/rnnoise/ の中で以下のコマンドを実行しましょう。

./examples/rnnoise_demo  hogehoge.raw  hogehoge_denoised.raw

ノイズが除去(軽減)された音源ファイルがhogehoge_denoised.rawとして同じフォルダ内に出力されたと思います。EC2のt2-microで実行した場合、1時間40分の音声ファイルが2分30秒ほどでノイズ除去処理が終了しました。

ffmpeg を使って音源ファイルをもう一度変換しよう

.raw 形式のままだと再生できない場合、もう一度ffmpeg を使ってmp3 やwav といったPCで再生可能な形式に変換しましょう。
以下のコマンドを実行してください。

ffmpeg -ac 1 -ar 48000 -f s16le -acodec pcm_s16le -i hogehoge_denoised.raw hogehoge_denoised.mp3

このファイルをSFTPソフトなどでローカルPCに落として再生してみましょう。

rnnoise を利用してノイズを除去した結果

では、rnnoise のノイズ除去効果のほどを確認してみましょう。

【比較的大きめの声】
元の音声

ノイズ除去結果

【小さい声】
元の音声

ノイズ除去結果

確かにrnnoiseの効果は強く、ノイズはほぼ消えています。問題は声が聞こえるかどうかですが、ここまで小さい声だと中々厳しいところですね。人間が聞き取る前提であれば、rnnoise をかけない方が聞き取りやすい気もします。

rnnoiseの名誉のために申し添えておきますと、もっと大きい声だと完全にノイズを遮断し声の部分だけきれいに抜けておりました。しかし、今回は展示会の録音データをきれいにできるか、、というチャレンジでしたので、やや失敗といえるでしょう。

まとめ

rnnoise というディープラーニングを活用したノイズ除去ソフトを使って、展示会で録音した音声ファイルをきれいにすることにチャレンジしてみました。
しかし、相手の声を十分な音量で拾えていないため、rnnoise でノイズ除去しても声の部分を一部切り取ってしまうような感じで、むしろ聞きにくくなった感もあります。
rnnoiseの使いどころは、ノイズ環境下で自分の声を(自分の口の前に置いたマイクで録音した音を)きれいにするといった用途なのでしょう。

タイトルとURLをコピーしました