DeepLearning でアニメキャラのボイロを作った話 【データ収集編 その1】

はじめに

前回の記事の続き
今回はデータセットを作る話になります。
よく言われる事で私もそう思っているのですが、高品質の Deep Learning モデルを作るために一番大事ことは いかに多くの綺麗なデータを集めるられるか です。
今回は多くの綺麗なデータを簡単に集められるようなタスクではなかったこともありデータ収集も色々頑張ったので(主に手作業を...)、そのあたりの苦労も含めてまとめたいと思います。

データセット作成流れ

だいたいこんな流れでした。順に述べていきます。

  1. アニメから音声抽出
  2. 音声とBGMの分離
  3. 対象キャラクターが話しているところのみ切り取り
  4. 音声に対応するテキストを作成

1. アニメから音声抽出

これは色んな方法があるかと思いますが、私の作業環境が Mac ということもあり QuickTimeとSoundflowerを使う方法 を使用しました。
ここで紹介されている方法は Mac から出る音声を録音する方法でして、これを使用して映像を Mac で再生した時に流れる音声を録音することで音声データを取り出しました。
この方法で作ったデータを使って個人で楽しむ範囲を越えることをすると著作権的にあれなのでご注意ください。 (前回のサンプル音声も怒られたら消します。)

2. 音声とBGMの分離

アニメの音声は大概 BGM が流れつつセリフが進行していたり、時にはセリフに被さって効果音が鳴っていたりするものです。
BGM は基本ノイズにしかならないため、頑張って BGM を消していきます。

具体的には以下を試してみています。

ツール 概要 補足
音きりす 周波数のフィルターとかでBGMを消せる やり方については例えばここ参考
PhonicMind ボーカル抽出のWebサービス たしか20ドルくらい課金しました
Spleeter オープンソースの音声分離ソフト これを早めに知ってたらPhonicMindに課金しなかったよ
自作モデル 自分で作った 詳細は下部

体感ですがクオリティ的にはこんな感じでした。

音きりす < 自作モデル < PhonicMind = Spleeter < Spleeter + 自作モデル

このうち自作モデルの話をもう少し詳しく深掘ります。

2.1. 自作モデルについて

そもそもなぜ自作モデルを作る必要があったかというと、 Spleeter (or PhoiceMind) では BGM は消えるけど効果音が消えてくれない という厄介な問題があったためです。

最初は効果音を消すために Audiacity のノイズ除去機能を使って手作業でやっていました。 特に足音のような音に対しては、他の方法だと全然残ったままですが手でやると結構綺麗に消せます。
Audiacity でやる方法はこんな感じ。(こういうことをずっとやってると心が折れる)

f:id:tosaka-m:20200221164646j:plain:w450
効果音箇所の選択
f:id:tosaka-m:20200221164715j:plain:w450
ノイズ除去手順

暫くこれをやっていて、これはもうやりたくないと思ったので、効果音を消すモデルを自分で作る方向性にシフトしました。(このモデル作る時間のほうが手でやるより時間かかったんじゃないだろうか。)

BGM or 効果音 を消すことに関連する音声界隈の分野・タスクに Audio Source Separation というものがあります。 Audio Source Separation タスクでは例えば、曲のボーカルとその他の音源(ギター、ドラム, ...) の分離をしますが、今回やりたいことも基本的に同じなのでこの分野の方法を使用しました。  

試したものは WaveUNet と UNet の 2 つです。WaveUNet はこれ、 UNet はこの方の方法参考にしてます。

これをやるときは自分の勉強も兼ねていたので、自分でモデルを組んでいましたが WaveUNet の方は最終的にそこまでいい感じにならなかったのでこの方のコードのほぼ丸パクリになっていきました。(signal の スケールを変えてるのが結構いい感じになる)

BGM データには、DSD100 と手持ちのサントラ、 効果音データには、効果音の箇所を自分でアニメの音声の中から探して切り取ったり、効果音を配布しているサイトからダウンロードしたりしてデータを集めました。

自作モデルの結果はデータを用意するのが面倒だったので載せませんが、結果の印象だけ述べておきます。

  • WaveUNet は全体的に薄く残ってしまう。
  • UNet は綺麗に消えるがセリフの末尾まで消してしまう。

みたいな違った問題が出てきたのは興味深かったです。両方に共通する問題として、データセットに入れていない効果音はあまり消せない問題もありました。

最終的には自作モデルだと綺麗にBGMを消せなかったので 「spleeter にかけたものを自作の WaveUNet にかける」という 2段階の方法をとり、spleeter の精度を活かしつつ spleeter の苦手な効果音の除去を自作モデルで補う形にしました。
spleeter には学習機能があるっぽいですが、そういえば使ってないです。もしかしたら spleeter の学習のほうがよかったかもしれません。

私は使ってないのですが以下のようなプロ用の製品もいいんじゃないかと気になってます。お高いです。

2.2. 出来上がったデータセットについて

データを作る作業は結構長い期間ちょっとずつやっていたので色んな方法で作ったデータが混在してカオスになりました。特に効果音を除く作業が辛過ぎて...

データを作るよりプログラミングしてる方が楽しいので、

データを作る → 心が折れる → モデルを作る → 精度が微妙だからデータを増やそう → データを作る → 心が...

の流れを 3 回繰り返して、その度により良いデータ作成方法はないかと検討したので色々試してたり、色々混ざってカオスなことになったり...

だいたい 1~4話:音きりす, 5~7話:Phonicmind, 8話~:Spleeter+自作モデル みたいな感じでやりました。

あとは、どの方法もそうなんですが、全体的にうまく行かないというよりも、うまく行く行かないがはっきり別れる感じなので、この段階でデータの選別をしておくのもいいと思います。

途中ですが

一旦区切ります。続きはその2で。

私は音声関連の専門家ではなく、このボイロ作成で初めて音声関連のタスクに触れたので、一般的な方法がどれかとかもよくわかっていません。
詳しい方でもっと良い方法を知っているという方がいらっしゃいましたら、ぜひお教えいただければ幸いです。