バンダイナムコ音声コンペ 16th place solution と参加体験記

こんにちは、公私問わず機械学習技術に触れる日々を送っているエンジニアの増田といいます。初めてブログを書いてみます。

初投稿記事として、バンダイナムコさんが主催されていた音声のノイズ除去コンペにて16位(上位4%)に入賞できた体験について、そのsolutionの共有と参加してみての所感を綴っていこうと思います。

f:id:taro_masuda:20200529010222j:plain

終結果としてのリーダーボードに筆者名前とベストスコアが載った様子

- コンペの紹介ページ: https://athletix.run/challenges/czaMEOxQG

コンペの概要

タスク:ノイズが付加された単一人物による発話音声のメルスペクトログラムが30ファイル(1ファイルあたり数秒程度)、および同一人物によるノイズの無い発話音声のメルスペクトログラムが100ファイル(同じく1ファイル当たり数秒程度)与えられます。ノイズの付加された30個のメルスペクトログラムそれぞれについて、ノイズを除去したメルスペクトログラムを求めてください。

評価指標:正解メルスペクトログラムとのMSE(Mean Squared Error)の30ファイル分の平均値

このコンペのユニークな点は2つあります。

① ノイズあり音声とノイズ無し音声の発話内容は異なるため、同一の発話のペア(パラレルデータ)がない。よって、単純な教師あり学習(正解として出力が近づくべき教師データが直接使える)とはならない

② ノイズあり・ノイズ無し音声の発話者は同一(1名のみ)。

16th place solution

ソースコードは以下のリンクにて公開しています。結果として何の変哲もないローパスフィルタをかける、という信号処理ベースの手法がベストスコア(MSE: 2.47)となりました。

https://github.com/taro-masuda/bandainamco_speech_denoising/blob/master/lowpass.ipynb

正直なところ、この手法は手始めにsubmitの操作の流れを掴むための第一歩として試したノリだったので、最終的にこれがベストスコアになるとは何とも複雑な気分でした。というのも、他にも以下の3つの手法など、より趣向を凝らした手法をいろいろ試してみましたが、上記のシンプルな手法に勝る結果は得られなかったためです。

- ノイズの無いデータにランダムノイズを付与したスペクトログラムを入力とし、Autoencoder(自己符号化器)を学習させて、ノイズの無い音声を復元するようなニューラルネットワークを構築する手法(MSE: 7.06)

→ 中間層の数などいわゆるハイパラ調整にもっと時間が割けていればスコアが改善したかもしれません。上位の方のsolutionにも使われていたので、もう少し試行錯誤してみる余地があると思います。

- NMF (Nonnegative Matrix Factorization, 非負値行列因子分解) を用いてノイズの無いスペクトログラムの行列を音声のスペクトル基底とアクティベーションに分解し、ノイズの無いスペクトル基底を得る。次に、ノイズのあるスペクトログラムの行列分解結果の一部を、ノイズの無いスペクトル基底に置換しながら行列分解の最適化のiterationを回していく手法(MSE: 12.53)

→ 試した手法の中で最も誤差が大きくなりました。原因として、ノイズの無いスペクトル基底を無理やり使うという発想では、十分にノイズのあるスペクトログラムを近似できなかったのだと考えられます。実際に復元してみた音声を耳で聴いてみても、他の手法よりもノイズが目立っていました。

- スペクトログラムを2次元の画像とみなし、まずノイズの無い音声から細かく切り取った正方行列(4x4、8x8など)のパッチを多数用意する。次にノイズのあるスペクトログラムの細かい正方領域について全パッチとのユークリッド距離を算出し、最も距離の小さいパッチでノイズのあるスペクトログラムを貼り替える、という手法(MSE: 3.39)。上記のユニークな点②に挙げたように、事前に同一話者のノイズのないメルスペクトログラムが与えられているので、それらを切り貼りして繋ぎ合わせた結果としてのスペクトログラムも、同様にノイズの少ないメルスペクトログラムとして得られるはずだという発想です。

 → 4x4, 8x8, 16x16などのパッチを用いた結果、4x4で最もスコアが高くなりました。しかし、ノイズありの音声との単純なユークリッド距離という発想ではスコア改善の限界があろうことも同時に手ごたえとして実感しました。

体験記

良かった点

- Submit数に制限が無かったこと。こちらはともすれば正解をハックするなど悪用されかねないルールであるとも言えますが、コンペの特性上手元でValidationができなかったので、気軽にSubmitのスコアが確認できたのはとてもありがたかったです。

- データセットのサイズが大きすぎず、1つの手法で試行錯誤する時間が大規模データセットを使う場合と比べて短かったこと。コンペの開催期間が限られているなかでいろいろ試せる仕組みになっていたのはありがたかったです。

- コンペ終了後に正解データとスコア算出スクリプトが公開されたこと。コンペのページ自体は閉じてしまいましたが、これらによりlate submissionの代わりとして復習に使える役者が整ったことになります。上述した手法に対する正確なスコアも、これがあって初めて把握できました。

- KaggleによくあるFinal subを選ぶ形とは異なり、自分が今まで提出した中でのベストスコアが最終結果に自動反映されること。後述の通り自分のスコアは大雑把にしか把握できない仕組みになっていたので、この自動反映は助かりました。

気になった点

- 途中経過のLeaderboardが上位10人までしか表示されなかったため、自分が今どれくらい惜しい位置にいるのか掴めませんでした。次回以降はより詳細なLeaderboardの表示に期待します。

- 自身のsubmitに対するスコア表示がMSEで大雑把なオーダー(10^nのスケールの場合、nのみ)しか開示されず、どのサブミットも同じような表示になり、どの手法がどれくらい有効なのか確認できませんでした。1を切るくらいの有効打が出せたのは上位2名のみだったようなので、ほとんどの参加者はこの仕様に苦しめられたと思います。

- Kaggleにて利用可能なDiscussionチャネルやノートブックの公開などが存在しませんでした。コンペ進行中にも参加者同士で議論しながら進められたら全体としてのレベル感ももう少し上がったのではないかなと思いました。

自身の反省点

もっと早くコンペに取り組み始めればよかった。本コンペは期間が丸々1ヶ月与えられていたのに、競プロなど別の勉強にうつつを抜かしていた結果、初サブミットを果たしたのが締め切り5日前という体たらくでした。また、締め切り日が平日金曜日だったため、昼に業務をして夜~深夜にコンペに取り組むという高負荷稼働を連日続けた結果最終日に風邪を引き寝込む(会社も休む)という最悪のラストスパートとなってしまいました。皆様も無理のないコンペライフを送れるようご自愛くださいませ。

さいごに

音を扱うコンペは、テーブル・画像・自然言語と比べてとても珍しく、自分にとって興味深く取り組めたコンペでした。このような機会を下さり、またソリューションの公開に許諾を下さった株式会社バンダイナムコ研究所のご担当者様方に感謝いたします。