読者です 読者をやめる 読者になる 読者になる

SHIROBAKO大好き人間のブログ

SHIROBAKOが好きなエンジニアによる技術ブログ

「万策尽きたー!」を別のキャラの声に変換しようとした

突然ですが、僕はアニメSHIROBAKOが大好きです。

そして、SHIROBAKOの劇中で印象的なセリフとしてこれがあります。


そう、「万策尽きたー!」です。

ある時ふと思いました。

このセリフを別のキャラの声に変えることができたら面白くね?

という訳でやってみましょう!

概要

以下の論文の手法に基づいてやっていきます。

話者適応型Restricted Boltzmann Machineを用いた声質変換の検討(中鹿ら, 2014)

この論文では、ARBM (Adaptive Restricted Boltzmann Machine)という確率モデルを用いて声質変換、すなわち声の変換を行っています。

ARBMについてはブログを書いたので、どういうモデルか気になる人は読んでみてください。

ややこしい話が嫌いという人は、「何か上手いことやってくれる確率モデル」くらいの認識で大丈夫です。

このARBMにはいくつかパラメータがあるのですが、それらを声の変換が上手くいくように訓練していきます。

そして、訓練が終わったモデルに「万策尽きたー!」の音声を入力して、音声の変換を行います。

必要なデータ

変換を行う為には「万策尽きたー!」以外にもいくつかデータが必要です。

  • 変換元の話者のデータ

ちょっと難しい言い方をしましたが、要するに本田さんのデータです。

変換したい言葉(「万策尽きたー!」)はもちろんですが、それ以外の本田さんのセリフも必要になります。

今回は劇中の本田さんのセリフのうち、BGMがないものを5個用意しました。

BGMがあるとノイズとなってしまうのでなるべく避けましょう。

ちなみに1つのセリフはこれくらいの長さです。

セリフを探す為にSHIROBAKOを見返す作業はなかなか楽しかったです


  • 変換先の話者のデータ

今回は「万策尽きたー!」をずかちゃんの声に変換したいと思います。

f:id:phoro3:20161122230226j:plain

先ほどと同じく、ずかちゃんのセリフを5個用意しました。


  • 参照話者のデータ

要するに、本田さんとずかちゃん以外のキャラのセリフです。

この参照話者のデータから、上手いこと人の発話に共通する特徴を見つけられるのがARBMの特徴です。

なるべくたくさんあった方がいいですが、多すぎるとモデルの訓練に時間がかかるので今回は以下の4人にしました。

f:id:phoro3:20161122232626p:plain

この4人のセリフを10個ずつ用意してそれを参照話者のデータとします。

手順

変換の大雑把な手順を説明していきます。

ソースコードを見せながら説明すると逆にややこしくなりそうなのでこの記事では示しません。

ソースコード自体はこちらに置いてるので、興味のある方はこちらへどうぞ。

1. 音声をMFCCに変換

この記事でも少し書きましたが、音声データはそのまま入力をしてもあまり上手くいきません。

そこで、集めたデータをMFCCという特徴量に変換し、これをARBMに入力することにします。

MFCCは人の声の特徴を表す特徴量です。詳細は以下のブログが参考になります。

音声データをMFCCに変換するコードは自分で書いても良かったのですが、すでに実装されてるものがあったのでそれを使いました。

変換に使ったソースコードこちらにあります。

2. 参照話者でARBMを訓練

ここでざっくりとARBMの内部を紹介したいと思います。

f:id:phoro3:20161123223601p:plain

ARBMは図のようにW_{common}W_{speaker}の2種類の重みが存在します。

W_{common}は話者に共通する重み、W_{speaker}は話者ごとの重みを表します。

W_{speaker}は話者ごとの重みなのでW_{yano},W_{shizuka}のように各キャラごとに値がありますが、ここでは簡単の為これらをまとめてW_{speaker}と表すことにします。

この2種類のWをうまく訓練すると声質変換ができます。



訓練方法ですが、まずは参照話者のMFCCを使ってW_{common}W_{speaker}を同時に訓練します。

f:id:phoro3:20161123224324p:plain

直感的に言うと「人が喋る時に共通して出てくる特徴」を学習している感じです。

3. 変換元・変換先話者でARBMを訓練

f:id:phoro3:20161123230100p:plain

今度は、変換元と変換先の話者のMFCCで訓練を行います。

ただし、W_{common}は先ほどの段階で訓練済みなので今度はW_{speaker}のみを訓練します。

この訓練で、変換元である本田さんと変換先のずかちゃんの特徴を学習します。

4. 変換

f:id:phoro3:20161123230509p:plain

最後に、変換したい音声をARBMに入力して変換を行います。

訓練したモデルは「本田さんの声質をずかちゃんの声質に変換する」モデルになっているはずです。

なので、訓練したモデルに「万策尽きた-!」のMFCCを入力してずかちゃんのMFCCに変換します。



ただし、MFCCは声の特徴を表す値で、声の高さ(ピッチ)までは扱えません。

そこで最後に「万策尽きたー!」のピッチを変えてよりずかちゃんに近付けます。

具体的には以下の数式で変換します。

p_{t} = \frac{\rho_t}{\rho_s} (p_s - \mu_s) + \mu_t

p_sが「万策尽きた-!」のピッチで、p_tが変換後のピッチを表します。

また、\mu_s\rho_sは集めたデータの中での本田さんのピッチの平均と標準偏差\mu_t\rho_tはずかちゃんのピッチの平均と標準偏差です。

これを使ってピッチも変換すれば完成です!

結果

ではさっそく変換後の「万策尽きたー!」を聴いてみましょう。

ぜんぜんうまくいってない!!!

タイトルで察した人もいると思いますが、この通り上手くいきませんでした。

ずかちゃんの声になったというよりは、本田さんの声を早回しにしたって感じですね・・・。

上手くいかなかった原因

  • 参照話者のデータが少ない

参考にした論文では、参照話者のデータとして38人の話者の発話を5つずつ使って訓練を行っています。

一方この記事では4人の話者の発話を10個ずつしか使ってません。

なので使ったデータの少なさは原因の1つとしてあると思います。

ただ、これ以上データを増やすとノートPCで訓練を回すのが結構面倒です・・・。


  • 参照話者に女子しかいない

これは実際にモデルの訓練を始めた後に気付きました。

訓練を回してる間の待ち時間に、集めたデータを冷静に見たら女子しかいなくて焦りました(笑)

男→女への声質変換をやろうとしてるのに、男のデータが無いのでは精度もイマイチな可能性が高いですよね。



他にも細かい原因は有りますが、大きくはこの2つだと思います。

2つ目はすぐに改善できそうですが、1つ目は計算力のあるマシンを用意しないと辛いですね。



余談ですが、約1年前に同じテーマに挑んでいる方がいらっしゃいました。

こちらは自分自身の声をアニメキャラに変換しようとチャレンジしてます。

残念ながら、こちらも結果はあまり良くなかったようです・・・

アニメキャラの声を自在に変えられる日はまだちょっと遠そうです。

まとめ

声質変換は難しい!

参考文献・サイト

話者適応型Restricted Boltzmann Machineを用いた声質変換の検討(中鹿ら, 2014)


実装でわかる統計的声質変換