概要
Whisperを活用した日本語歌詞のforced-alignmentの試行錯誤 その2です。
音源分離を事前にすることで結果が良くなるかを検証します。
シリーズ一覧は以下
【試行錯誤】OpenAI Whisperを活用した日本語歌詞のforced-alignment リンクまとめ
背景
Whisperで歌唱区間を抽出した後、wav2vecでforced-alignmentをすることで、多少それっぽい結果を得ることができました。しかし、whisperがBGMのみの区間もsegmentとして抽出してしまうなど課題もありました。
今回は、ノイズ除去してからwhisperに入力すると精度がよくなるという情報も見られたため、試してみることにしました。
spleeterで背景のBGMやSEを消してwhisperに突っ込むといい感じでテキスト起こしできる感じ pic.twitter.com/A9eCV8Ddd0
— ミクミンP/Kazuhiro Sasao (@ksasao) October 4, 2022
音源分離
音源分離にはDemucsを使いました。手軽に使えるライブラリの中ではもっとも精度がよいようです。
こちらの記事を参考に音源分離を実行しました。
環境はColabです。
音源は引き続きYOASOBI「夜に駆ける」を使わせていただきます。
!pip install demucs
input_audio_path = "yorunikakeru.wav"
!python3 -m demucs --two-stems=vocals {input_audio_path}
実行完了するとseparated/mdx_extra_q/yorunikakeru
のような名前のフォルダが作られて、中にボーカルのみ(vocals.wav)とBGMのみ(no_vocals.wav)の音声ファイルが生成されます。
vocals.wavをダウンロードして聴いてみると非常に綺麗に音源分離ができています。
あとはこれを入力としてwhisperによる歌唱区間抽出、wav2vecによるalignmentをするだけです。やり方は前回記事と重複するので省略します。モデルサイズは前回同様、largeにしました。
結果
正解データをまだ作っていないので感覚的な評価になりますが、歌唱区間の検出はあまり改善されていないように思えました。前回同様、BGM部分もsegmentとして認識されてしまう区間が結構ありました。耳ではきれいに除去できているように聴こえるのですが、なぜでしょうか。
ちなみに、Character Error Rate (CER)は前回の0.06に対し、0.05と若干改善しています。誤差の範囲かもしれませんが。
wav2vecによるalignmentは感覚ですが、精度が上がっているような気がしました。少なくとも音源分離はalignmentの精度を高めるうえで有用なのかもしれません。一方で実用レベルにはまだ達してはいない気がします。このあたり現状だと感覚で議論するしかないので、alignmentの精度を数値化するための正解データを早めに作っておきたいです。
おわりに
OpenAI Whisperを活用した日本語歌詞のforced-alignment その2ということで、音源分離を試してみました。結果、耳で聴く分にはきれいにノイズ除去できたものの、whisperのsegment検出のタイムスタンプのズレは思ったほど解消されませんでした。一方で、wav2vecのalignmentの精度向上にはポジティブな影響があったように思われました。
次のステップですが、alignmentの正解データを作って、音源分離の効果を定量的に検証してみたいです。
また今回、音源分離のためのdemucs実行はコマンドラインで行いましたが、将来的に何らかのアプリに組み込むことを考えると、pythonのコードでかけたほうが便利そうです。demucsをpytorchで実行するチュートリアルなどを参考に、その辺のやり方も探ってみたいです。
参考
demucsで音源分離する(コマンドライン実行)
[Demucs] 機械学習で音源分離・ボーカル抽出 [Python]
demucsをpytorchで実行するチュートリアル
MUSIC SOURCE SEPARATION WITH HYBRID DEMUCS