2020年4月15日〜5月15日にデータサイエンスのコンペティション「バンダイナムコ・データサイエンス・チャレンジ」が開催されました。このコンペに参加いたしまして、幸運にも3位となりましたので、その解法を公開します。
このコンペの課題は「ノイズを持つ音声データからノイズを除去するプログラムを作る」というものでした。ただし、他の機械学習系のコンペティションと異なり、以下の2個のデータセットのみが提供されていました。
[対象データ] ノイズを含む音声データ30個
[参考データ] ノイズを含まない音声データ100個
対象データのノイズを除去したものが提出データとなります。ここで、参考データとしてノイズを含まない音声データが提供されていましたが、この音声にノイズを加えたものは提供されていません。そのため、U-Netなどを使った教師あり学習は難しいと考えました。
ノイズの特性を把握するために音声データを解析したところ、ホワイトノイズや騒音といった背景ノイズではなく、音声に対して機械的に付加されたようなノイズであることが分かりました。そこで、ノイズ除去の課題ではなく、音質変換の課題と捉えることで対象データの特性を参考データに近づけられるのではないかと考え、この方針に従ってプログラムを作成しました。
CycleGANを使った音質変換が提案されていましたので、これを参考にプログラムを作成しています。
Takuhiro Kaneko, Hirokazu Kameoka, Kou Tanaka, Nobukatsu Hojo,
"CycleGAN-VC2: Improved CycleGAN-based Non-parallel Voice Conversion" (2019)
https://arxiv.org/abs/1904.04631
モデル作成のための手順は上記論文とほぼ同じですが、モデル(generator/discriminator)は独自のものになっています。ただし、私にはGANの実装経験がほとんどありませんので、これらのモデルが適しているかは分かりません。
また、今回の課題に対応するため、以下の処理を追加しました。
[処理1] 実際の値の平方根をモデルの入力値/出力値とする
[処理2] ノイズ有り/無しのデータを平等に学習させる
[処理3] 判別モデルを作ってGANの性能を評価する
このプログラムはDNNのライブラリとしてpytorchを使っています。
データファイルをdata
ディレクトリに展開すると、以下のようなファイル構成になります。
data
├── dist-data.zip
├── noised_tgt
│ ├── noised_tgt_001.npy
│ ├── noised_tgt_002.npy
│ ├── noised_tgt_003.npy
│ ...
├── raw
│ ├── raw_001.npy
│ ├── raw_002.npy
│ ├── raw_003.npy
│ ...
├── readme.txt
└── submit-data-sample.zip
音質変換モデル(generator)を作成する場合は以下のコマンドを実行します。
python src/train.py [model file]
提出データを作成する場合は以下のコマンドを実行します。
python src/generate.py [model file]
モデルが正しく音質変換できていることを確認するため、ノイズの「有り or 無し」を判別するモデルを作成します。この判別モデルを使って、音質変換モデルの性能を検証します(判別モデルが「ノイズ無し」と判別するデータを生成することが音質変換モデルの目標となります)。
判別モデルのを作成する場合は以下のコマンドを実行します。
python src/classify.py [classifier file]
判別モデルで性能検証をしながら音質変換モデルを作成する場合は以下のコマンドを実行します。
python src/train.py --classifier [classifier file] [model file]
このコンペを開催してくださいましたバンダイナムコ研究所の皆様に感謝申し上げます。このコンペでは「データ数が少ない」「性能検証が難しい」という課題がありましたが、現実の多くの問題を解決する場合はデータの収集や評価指標の考案から始まりますので、これらの現実問題を想定した課題だったのかなと思います。求人も想定したサイトでのコンペティションだったということを考慮すると、非常によい課題だったように思います。