人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

統計的声質変換 (6) 声質変換モデルの学習

統計的声質変換 (5) scikit-learnのGMMの使い方(2015/3/22)の続き。

今回は、いよいよ声質変換モデルを混合ガウスモデル(GMM)で学習しよう!第3回目(2015/3/4)で述べたようにclbさんの声をsltさんの声に変換することを前提に進める。

今まで「声質変換モデルをGMMで学習する」と書いてきたが、参考にしていたチュートリアルを読んでも何をGMMで表すのかがいまいちピンとこなかった。そこで、元論文(PDF)を当たったところ式 (6) を見てようやく理解できた。

f:id:aidiary:20150330230321p:plain

この式から z_t がGMMでモデル化されていることがわかる。そして、この z_t は、変換元話者の t フレーム目の特徴量 x_t と変換先話者の t フレーム目の特徴量 y_t結合ベクトル

f:id:aidiary:20150330230323p:plain

である。今回は26次元のメルケプストラム特徴量を使うため z_t は2人のメルケプストラム特徴量を結合した52次元ベクトルになる。つまり、学習するのは52次元空間のGMMになる。第4回目(2015/3/10)において時間同期をとったパラレルデータを作成したのは同じ時間位置tで結合したベクトルを作りたかったから。さらにパラレルデータなら学習データのフレーム数が二人の話者で完全に一致する。

学習データはclbさんとsltさんのarctic_a0001.mcepからarctic_a0050.mcepまでの50文、計35926フレーム分のデータを用いた。GMMの混合数は適当に32とした。この学習データの尤度がもっとも高くなるようにGMMのパラメータ(混合係数、平均ベクトル、共分散行列)を推定するのがGMMによる学習である。

f:id:aidiary:20150330230325p:plain

では、さっそくプログラムを書いてみよう。

実行コマンドは、

python train_gmm.py aligned_mcep_clb_slt/clb aligned_mcep_clb_slt/slt clb_slt.gmm

第4回目(2015/3/10)でパラレルデータを出力したディレクトリaligned_mcep_clb_sltにclbさんとsltさんの間のパラレルデータがあると仮定している。

学習したモデルはあとで使いまわせるようにsklearnのjoblibモジュールを使ってファイルにダンプしている。このモデルファイルは次回使おう。

実行すると2つのグラフが表示される。1つ目のグラフは、最初の3つのガウス分布の平均ベクトルをプロットしたグラフである。

f:id:aidiary:20150330230312p:plain

このグラフを見ると26次元目で何やら区切りが見える。これは結合ベクトルの平均ベクトルに

f:id:aidiary:20150330230330p:plain

という関係があるため。2つ目のグラフは、0番目の正規分布の共分散行列を可視化したグラフである。

f:id:aidiary:20150330230316p:plain

このグラフを見ると4つの区間に分割できそうであるが、これは結合ベクトルの共分散行列に

f:id:aidiary:20150330230328p:plain

という関係があるためである。

ようやく声質変換モデルが学習できたので次回は結合ベクトルのGMMを使って実際に声質変換してみたい。実は次回が一番難しい。

今回は、初めて手書きの図を入れてみた。最近、iPadで使えるタッチペンを買ったので手書きでノートを取っている。これからもちょくちょく入れてみようかな。