DeepLearning でアニメキャラのボイロを作った話 【データ収集編 その2】
はじめに
前回の記事のつづきです
データセット作成流れ
3. 対象キャラクターが話しているところのみ切り取り
手作業でやるなら Audacity で音声を聞きつついらないところを切り取るだけです。 初めは手作業でやっていたのですが、非常に時間がかかる上にしんどい...
という訳で、こちらでも Deep Learning の力を借りて作業をちょっと楽にしました。
具体的には、0.01 sec 間隔でその区間に対象キャラクターが話しているかどうかを判別するモデルを Neural Network で作ります。
モデルの全体像はこんな感じ。
Spectrogram の箇所は波形データを STFT (short time fourier transform) で変換して絶対値を取ったものです。
Neural Network 部分は CNN + BidirectionalLSTM で割と適当に組んでいます。
こんな感じ。
STFT は librosa の関数を hop_length = 256, n_fft = 512 の設定で使用。
Neural Network の Layer 数や次元は CNN, LSTM それぞれ 1~2 層, 64 ~ 256 次元の範囲でいくつかのモデルを作成して
最終的には全モデルの平均による簡単な Ensemble を取っています。
このモデルはチューニングや Ensemble をしない段階でも割と使えそうな感覚だったので、あまり精度を詰めたりとかはしてないです。
このモデルが出来たら、モデルが予測する「対象キャラクターが話している確率」が一定以下の箇所を除去します。
閾値は対象キャラクターが話しているところを消さないように低めに設定します。(例えば今回は予測確率が 0.15 以下の箇所を除去しました。)
モデルが取り逃がす箇所があるので残りは手作業で除きました。
このモデルを入れることで、手で切り取るべきところの 2/3 以上は自動でなくなるのでかなり楽になりました。
まぁこのモデルを作る時間を作業にあてたほうが早く終わったとは思いますし、モデルも完全自動とまでは行っていない不十分な感じではありますが、精神衛生が保たれたことと今後も作業が楽になりうるという非常に大きなメリットがあるのでやってよかったです。
だいたい 1 話分ちょっとくらいを自分でラベルづけして、残りにモデルを適用といった感じでやりましたが、これくらいのデータでの学習で十分使えるものが出来ました。
学習させたデータに出てこないキャラクターがほぼ除去できない点がうまく行かなかったので、除去できなかったキャラクターのデータを適宜学習データに追加してモデルを良くしていったりもしています。
いらない箇所を全て除いた後は、この後行う音声合成モデルの学習時にデータが長すぎると面倒なので 1 ~ 10 秒範囲くらいで音声をキリのいいところで分割をしていきます。これは音声の大きさから切るべき箇所を判断するスクリプトを組んで行いました。
4. 音声に対応するテキストを作成
私はなぜか原作の書き起こしテキストをもっていた(???)ので、それと音声を聴き比べつつデータを作りました。(もともとチャットボット的なのを作りたくてテキストは作ってました。)
テキストがなければ作った音声データを何かしらの音声認識にかければ多分すぐ作れるんじゃないでしょうか?やってないのでわかりません。
フリーの音声認識ソフトとしては Julius とかがあります。
おわりに
以上が私が実施したデータ作成作業のだいたいの流れです。どうでもいいところを言葉で説明してプログラムとかは全く載せてもないので、もっと細かいところが知りたい方はコメントやTwitterなどで聞いてください。
Deep Learning で何かやりたいと思った時に一番の障害となるのが、データをどうやって集めたらいいんだ 問題だと思っています。
特に個人でやる場合はかけられるお金やリソースが限られるので、集められる量が限られたり質のいいものが集められなかったり、頑張って集めたはいいがデータが足りないせいで微妙なモデルしかできなかったり...とやっても徒らに時間を浪費するばかりでなかなか成果が出ないという状況になりかねません。
そういう時にオープンデータが利用できれば楽なのですが、やりたいことにマッチするオープンデータもそうそうないですよね。
例えば日本語の音声合成に使えるのオープンデータとしては JSUT があります。(質が高いデータをオープンに提供してくれる方々は本当にすばらしい。)
あと、ちょうど数日前に自動で自然な歌声を生成できる NEUTORINO というソフトが発表されて界隈が非常に盛り上がってますが、このモデルの作成には きりたんの歌声のオープンデータベース が元になっているようで、このように質の良いデータセットがあって初めて素晴らしいアプリケーションができるものだと思っています。(この NEUTORINO でできる曲ほんとすごいですよね。SF の世界にしかないような未来がついに現実になった感覚がありすごく感動しました。)
もっと気軽に利用できるオープンデータがたくさんあれば、もっと気軽に色々な応用に挑戦する人が増えて、音声分野自体更に盛り上がると思うんですけど、日本語のデータに関しては全然量も種類も足りないのが現状な気がするのでもっと沢山出てくるといいなと思っています。
追記 JVS(Japanese versatile speech) という素晴らしいデータセットもあることを知りました。これがあればマルチスピーカーモデルや任意話者モデルにも気軽に挑戦できそうですね。
今回私が作ったモデルも JSUT や JVS のデータをうまく使って (例えば Domain Adaptation とか Transfer Learning とか) 精度があげられたらいいのですが、まだ検証・実験が不十分で実を結んでないので、今後やるとしたらこのあたりをもうちょっと詰めてみるのがいいかなと思ってます。あとは、データの処理がバラバラなので最終的によかった方法でやり直すとかでも精度があがるかも...いや、もうあの作業をするのは...精度上がるのは間違いないと思うんですが...
データ作成についてはここまでで、次回はモデル作成のことをまとめます。