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_alphaflをパラメータとして用いる。その値を32768(8進法で100000だが値の理由は不明)で割ったのちに2乗する。その後に文字型をfloatからdoubleに変換する。
    • 以上の変換されたデータを引数に指定してWORLDのSYNTHESISコマンドで波形合成。この際、configファイルで見られる変数flsrをパラメータとして用いる。

参考

DNN統計的音声合成ツールキット Merlin の中身を理解をする - LESS IS MORE