Merlinが音響特徴量から波形を合成する過程について
目的
音声合成ツールのMerlinを動かす際の、ニューラルネットワークを用いて推定した音響特徴量から音声波形を合成する過程を調べる。
まずconfigについて
- 変数の設定については
src/configuration/
のconfiguration.py
内に書かれており、クラス内メソッドのうち、主にuser_configuration
メソッド内のリストuser_options
で変数のデフォルトがインスタンス変数として指定され、引数として指定したconfigファイルでそれが上書きされる。つまり、デフォルトの値よりもegs/slt_arctic/s1/conf/
のtest_synth_jsut_full.conf
の値が優先される。
本題:音響特徴量から波形になるまでの過程について
記事(DNN統計的音声合成ツールキット Merlin の中身を理解をする - LESS IS MORE)にもあるように、波形合成をする前に得られた静的特徴量と動的特徴量から、MLPGアルゴリズムと呼ばれるもので特徴量を計算し直している。この特徴量の次元は静的特徴量の次元に等しい(次元数は3分の1になる)。MLPGアルゴリズムの内容は隠しファイル
src/frontend/
の.mlpg_fast.py
に書かれている。egs/jsut/s1/conf/
内のtest_synth_jsut_full.conf
の設定のうち、vocoder_type
を確認すると、波形合成のVocoderにはWORLDが用いられていることが分かる。
具体的な波形合成のコードはsrc/utils/
のgenerate.py
に書いてあるが、VocoderにWORLDを用いる場合、そのうちのwavgen_straight_type_vocoder
メソッドが実行される。このメソッド内でSPTKと WORLDを動かして音声波形を作っている。wavgen_straight_type_vocoder
メソッドでは、まずメルケプストラムにポストフィルターと呼ばれるものがかけられる。その手順は同ファイル内のpost_filter
メソッドに書かれている。フィルターをかけられた後のデータが拡張子.mgc_p_mgc
を持つものである。その後で波形合成が行われる。流れは以下の通り。最後以外はSPTK。
- 対数f0をf0に変換。その際、0の代わりに用いられた微小量は0に置き換えられている。その後にf0の文字型をfloatからdoubleに変換。
- 非周期性指標が正の場合、値を0に置き換え。その後、文字型をfloatからdoubleに変換。
- メルケプストラムをケプストラムに変換し、その複素数平面上での偏角を度数法で表す。この際、configファイルで見られる変数
fw_alpha
やfl
をパラメータとして用いる。その値を32768(8進法で100000だが値の理由は不明)で割ったのちに2乗する。その後に文字型をfloatからdoubleに変換する。 - 以上の変換されたデータを引数に指定してWORLDの
SYNTHESIS
コマンドで波形合成。この際、configファイルで見られる変数fl
やsr
をパラメータとして用いる。