keep learning blog(キープラーニングブログ)

自分が興味を持ったことを備忘録として残すブログです。

30.ディープラーニングでノイズを消してみよう

――科学者とは、自然のひみつと美しさを探し求めるおとぎの国の旅人です。それは大変おもしろく、夢のある楽しい仕事なんですよ。――

マリア・スクウォドフスカ・キュリー

 

 

ディープラーニングでノイズを消してみよう

すっかり季節が初夏の陽気になってきたと思っていたら、暦はもう6月になっていました。キュリー夫人の言う「おとぎの国」という表現がぴったりのデンマーク生活も、そろそろ終わりを告げようとしています。

昨年7月にデンマークの土を踏んでから約1年間、短いようでとても長かったです。西洋のことわざで、「ロバが旅に出かけたところで、馬になって帰ってくるわけではない」という言葉があります。私はポニーくらいにはなれたでしょうか。

デンマーク生活で印象に残っていることはいくつかあります。そこに住む人たちの親切さや行儀の良さ(politeness)、高齢世代のITリテラシーの高さ、そして何よりアジア人キラーとも言える冬の夜長です。

一つ目について、(本音は分かりませんが)デンマーク人はEU加盟国内でも屈指の親切心を持っていると思います。特に親日というわけではないものの、外国人に対しても分け隔てなく接してくれます。総じて行儀の良い人たちという印象を抱きました。

二つ目について、デンマークでは社会システムが一定水準のITリテラシーを前提とした作りになっているので、全世代がIT技術に慣れ親しんでいる印象があります(ガラケー?なんですかそれ?)。高福祉国家が成立するためには、ITの存在が不可欠だと感じました。

三つ目について、緯度が変わることによる日照時間の変化がこれほどまで劇的だとは夢にも思いませんでした。ようするに、北欧の冬を舐めていて不眠症に罹りました。日本の四季の移ろいは西洋に比べ微弱だが、それゆえ豊かであったのだな、という侘び寂びの境地(?)に至りました。

振り返ってみると、最初は住民登録と銀行口座の開設に始まり、持病の薬をもらうために日本からの紹介状を携えて病院に行き、ロックダウン中にまさかの虫歯で歯医者を探し回る、と常にてんてこ舞いでした。

生活が落ち着き、なんとなく研究室で過ごす一日のサイクルが板についてからは、それこそ毎日が発見の連続で、新しい知識を吸収する喜びを日々感じていました。

何となく決めた音声処理や機械学習というテーマ設定も、いま思えば正解だったと思います。身近な音にコンピュータでアプローチするだけで、こんなにも豊かな世界が広がっているんだと知り、この分野の将来性を感じました。

海の向こうにたくさんの友人ができたことも、実に得難い喜びだと思います。この留学経験を糧に、今後のキャリアパスを見つめ直し、スキルアップする足掛かりとなる1年間でした。

さて、思ひでぽろぽろな与太話はこれくらいにして、今回はICASSP2020*1でプレゼンされていた最新論文のアルゴリズムPythonで実装し、その効果を実証してみたいと思います。

f:id:yuki0718:20200607040325j:plain

 

論文の概要

今回、ICASSP2020で見たプレゼンの中で気になったのが、テキサス大のA. E. BulutさんとMicrosoft社のK. Koishidaさんという方の共著で書かれた「Low-Latency Single Channel Speech Enhancement Using U-Net Convolutional Neural Networks」という論文発表です。

この発表で目を引いたのは、従来手法を凌ぐパフォーマンスの高さと、ネットワーク構造(Architecture)のシンプルさでした。言うなれば「安くて美味い」、日本の牛丼のような提案手法だと私は感じました(誉め言葉)。

タイトルにもあるとおり、この論文は音声強調(Speech enhancement)というタスクに取り組んだものです。端的に言えば、人の話し声と背景で鳴っているノイズとを分離して、声を聞き取りやすくする技術です。

私は専門ではないですが、音声強調では隠れマルコフモデル(HMM:Hidden Markov Model)ベイズ推定(Bayesian inference)などを用いた確率論的アプローチと、敵対的生成ネットワーク(GAN:Generative Adversarial Networks)のような手法が流行りのようです。

しかしこの論文はそのいずれでもなく、2015年頃に電子顕微鏡画像から細胞などの特定箇所を検出する(Segmentation)用途で開発された、U-Netという比較的シンプルな畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)を採用しています。

論文の提案手法を正しく理解するために、まずはこのU-Netというネットワーク構造について紹介します。

 

U-Netとは

上述したとおり、U-Netは医用画像のセグメンテーション用に開発されたネットワークです。その入力は画像であり、出力も画像になっています。原著論文によれば、それは以下のような構成からなります。

f:id:yuki0718:20200606231258p:plain
出典:O. Ronneberger, P. Fischer, T. Brox: 'U-Net: Convolutional Networks for Biomedical Image Segmentation', in Proceedings of the International Conference on Medical Image Computing and Computer Assisted Intervention (MICCAI), pp.234–241, (2015).

U-Netの1つ目のポイントは、このU字形のEncoder-decoder-likeなアーキテクチャです。図の左側は画像のサイズが徐々に小さくなり特徴量マップのチャンネル数が増えていくEncoder部分、図の右側は縮小された特徴量マップを元のサイズまで復元していくDecoder部分に対応します。

U-Netの2つ目のポイントは、Encoder部分の途中経過をDecoder部分に連結(Concatenate)していることです。CNNのEncoderでは畳み込みが進むほど位置情報が曖昧になるので、Encoder部の特徴量マップを直接持ってくることで位置情報を保持する狙いがあります。

U-Netは、初心者でも(たぶん)簡単に実装できるCNN構造であり、そのシンプルさから計算負荷もさほど大きくありません。にも関わらず、論文ではGANのような大掛かりなネットワーク*2を上回るパフォーマンスを発揮しているのだから驚きです。

 

U-Netのアレンジ

U-Netの原著論文は引用回数14000回超え(2020年6月現在)を達成している超有名論文なので、2018年にはクイーン・メアリー大のD. StollerらがWave-U-Netという名前で音源分離用にアレンジしています。

しかし、今回の論文とWave-U-Netとの大きな違いは、Wave-U-Netではノイズ入りの音声データを入力したらノイズ除去された音声データが出力されるend-to-endな構成*3を採用しているのに対し、今回の論文では原著論文と同じく入出力が2次元画像になっている点です。

以前の記事でご紹介したとおり、音声データを画像に変換するには短時間フーリエ変換(STFT)を利用します。STFTで得られた時間軸と周波数軸からなる画像は、通称スペクトログラム(Spectrogram)と呼ばれるのでした。

keep-learning.hatenablog.jp

論文では、ノイズ入り音声のスペクトログラムを入力し、ノイズのないクリアな音声のスぺクトログラムが出力されるようにネットワークを組み、スペクトログラムを16フレーム(0.256msec)ごとに分割したセグメント単位で学習させています。

f:id:yuki0718:20200607003852p:plain
出典:A. E. Bulut and K. Koishida: 'Low-Latency Single Channel Speech Enhancement Using U-Net Convolutional Neural Networks', IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), (2020)

また、ちょっとした変更点ではあるものの、U-Netの原著論文で使っていたPooling層やUpsampling層を使わずに、畳み込み層のStrideを大きくとったり転置畳み込み層(Transposed convolutional layer)を用いたりすることで、画像の縮小(Encode)と拡大(Decode)を行っています*4

まず、Encoder部分の畳み込み層は以下のような計算イメージです。畳み込みフィルタ(Kernel)をスライドさせる距離sをStrideと呼び、このStrideを2以上に設定すると必然的に出力画像のサイズが入力画像より小さくなります。

f:id:yuki0718:20200607005051p:plain
出典:https://indoml.com/2018/03/07/student-notes-convolutional-neural-networks-cnn-introduction/

他方、Decoder部分の転置畳み込み層は以下のような計算イメージです。入力画像の隙間を0埋め(Zero padding)してから畳み込むことで、出力画像のサイズが入力画像より大きくなります。

f:id:yuki0718:20200607005107p:plain
出典:Z. Zhang et. al.: 'Multi-point Displacement Monitoring Based on Full Convolutional Neural Network and Smartphone', IEEE Access 7, pp139628-139634, (2019)

さらに、学習用のクリアな音声スペクトログラムと出力スペクトログラムとの誤差を測る損失関数(Loss function)についても、原著論文のMSE(Mean squared error)ではなく、LSD(Log-spectral distance)という尺度を用いています。

 \displaystyle LSD \stackrel{\mathrm{def}}{\equiv} \frac{1}{T} \sum_{i=1}^{T} \sqrt{\frac{1}{F} \sum_{j=1}^{F} \{ S_{truth}(i, j)-S_{estimate}(i, j) \}^{2} }

論文に明示的に記載されていない部分は私の想像で補っているものの、以上で提案手法の特徴はご紹介できたと思います*5

 

Pythonで実装

さっそく、論文のアルゴリズムPythonコードに書き起こしてみました。しかし、かなり長いのでこの記事には直接書き込まず、GitHubにアップしています。ご興味があればご覧ください。

github.com

実装にはTensorflowのversion 2.1を使っています。Tensorflow2.0系では上位ラッパーライブラリKerasを取り込む形で開発が進んでおり、簡易なコードで安定した動作が可能です。

なお、論文だけを手掛かりに書いたので、本当にこれで正しい実装なのかどうかはよく分かりません。一応、PESQ等の音声強調スコアを算出してみた限りは、論文と同程度のパフォーマンスを発揮できているようです。

さて、「スコアが良かった」と言うだけだとイメージが湧かないと思うので、簡単なデモも用意しました。以下のような背景ノイズ入りの音声データを評価用に用意します(4つのスピーチを結合)。

(出典:C. Valentini-Botinhao: 'Noisy Speech Database for Training Speech Enhancement Algorithms and TTS models', [online], available: http://dx.doi.org/10.7488/ds/2117

当然、このデータは学習には使っていません。つまりは学習済みモデルにとっては未知の音声であるこのデータをネットワークに通して、出力された音声は以下のようになりました。

一番最初のスピーチは電車(?)のブレーキ音が若干残ってしまっている気もしますが、他のノイズについてはほぼ完ぺきに消去できているように聴こえます。

音声強調タスクは、うるさい場所にいる人が快適に電話できたり、音で何かを検出するシステムで誤検出の確率が下がったりと、社会的に需要のある課題です。

世界中の研究者が鎬(しのぎ)を削るこの領域では、新しいアルゴリズムの開発や改善が今後も続いていくと思います。

 

今回は以上です。30回目のブログ更新をもって1年間の留学生活に幕を下ろすことになりました。最後の方はCOVID-19のせいでバタバタしましたが、総じて夢のような1年間でした。プログラミングにも留学前よりちょっとだけ親しみが湧きました。

帰国後もこれを更新するかどうかは分かりません。でも、将来自分の子供がこれを読んだらどう思うのかな、なんて想像すると少し面白いです。

1年間、稚文をお読みいただきありがとうございました。

*1:IEEE International Conference on Acoustics, Speech, and Signal Processing

*2:GANでは、基本的にGeneratorとDiscriminatorという2つのネットワークを相互学習させる必要があるので、往々にして計算負荷が大きくなります。

*3:似たような言葉に「ゆりかごから墓場まで」というのがありましたね。第二次世界大戦後にイギリスが掲げた社会福祉政策のスローガンでした。

*4:論文には転置畳み込み層について明示的に書かれていませんが、論文中の各記述の帳尻を合わせるにはこう解釈するしかないと思います。

*5:基本的に、情報系の学術論文というのは、第三者が読んでもすぐに実験結果を再現できる(Reproducible)記述でなければなりません。この論文はかなり詳細まで書いてくれているので、ある程度CNNの知識があれば比較的容易に実装できます。