神野さんに言われました。

神野さんに言われました。

AIの勉強をしています @sesenosannko

フレームごとのGMM-based mappingによる声質変換

こんにちは。
個人的にはなかなか良い結果を得られたので書いておきます。

https://www.cs.cmu.edu/~pmuthuku/mlsp_page/lectures/Toda_VC.pdf

例によってこの論文なんですが、とりあえず2章の従来の方法というやつを試してみます。
この手法はフレームごとに完全に独立して変換を行う方法で、動的特徴量も系列内変動も何も考えていません。
ただ、どれくらい行けるのかというのを試してみました。

ライブラリを駆使、というか全て投げてとりあえず実装するということに全力を入れました。
そして、とりあえず実装に命をかけた結果、お手本のようなスパゲッティコードができたので、もう少し綺麗にする元気があったら上げるかもしれません・・・

かなりこのサイト様を参考にしたので、これを読んでください。

aidiary.hatenablog.com

音声関連はSPTK、GMMの学習はsklearn、あとはfastdtwとかいう神ライブラリとかを使っています。
こうやってみてみると自分では何もしてない。悲しい。

音声データはここのデータを使わせていただきました。
8. 発話のプロフェッショナルによるATR 25文の読み上げ の8モーラ/秒の女性1人目を男性に変換しています。
こういう研究室は本当にありがたいですね。

http://www.it.ice.uec.ac.jp/SRV-DB/

今回はGMMの構成ガウス分布は32個でやりました。
戸田さん論文によれば、25文程度の場合は32個らしいです。
あとのパラメータとかは色々ネットで調べたり、上のサイトのものを丸パクリしたりです。

さて、本題です。
変換元の声はこれ



そして変換先はこれです。



これはデータセットの1個目の文章です。一応学習からは除いています。
そして、変換した結果がこれです。
正直、これでも結構感動しました。
明らかに男性の声質に変わっているのがわかると思います。
ただ、少し声が高く、違和感がありますね。
ここでは基本周波数を変更せずに変換したメルケプストラムを合成しているので、声の高さが女性のままになっているんですね。



意外なことに基本周波数の変換に関する文献が適当に探しただけでは見当たらなかったのですが(2017/04/04追記:log F0などの平均と分散を合わせるのが通例のようです)グラフを書いたらかなり綺麗に線形になっていました。
ちなみに、どちらかに0を含むデータは取り除いてあります。
DTWをしていますが、結構ずれるので、片方が0で、もう一方が数百とかいうデータがそれなりの数あります。
これがかなり学習を邪魔するので、事前に取り除くことにしました。


f:id:sesenosannko:20161002220225p:plain


ということで、ここで学習した線形変換を掛けた結果がこれです。



かなりノイズがありますが、明らかに男性の声になっているのがわかると思います。
単純に線形変換しただけだからか、よりノイズが増えてしまった気がします。

ノイズには幾つかの原因があります。
1つ目は、MLSAフィルタによるものですね。
このモデルを用いた手法では、このノイズは少なくとも掛かります。
今回は慣れてるのでSPTKを使ったんですが、World等に比べると質が低いと言われています。
あと、ピッチを適当に線形変換したせいで起こるノイズはこれに関係するものですね。
2つ目は、完全にフレームごとに変換を行っているためですね。
むしろフレームごとに変換して、よく音声の体を保っていられるなと感心するレベルです。
これに関してはもちろん戸田さんの論文に書いてある通りですね。

多分それ以外にも色々あるでしょう。
文章が25文程度の場合はGMMの構成要素は32個がベストらしいですが、当然文章とGMMの自由度を大きくすれば精度は上がるでしょう。

とりあえず、これをベースラインとして頑張りたいと思います。