Merlinで話者適応。少量サンプルで高品質音声ゲット! 英語デモ編

Ubuntu18.04にて、DNN合成音声ライブラリ「Merlin」での話者適応に、挑戦してみたいと思います。これができるようになれば、高品質な音声を、少量のサンプルから作れるようになります。この記事では、まず英語のデモを行ってみたいと思います。
Merlinで話者依存モデルの作成をすでに実行済みの方は、「1.準備」のところは飛ばしていただいて結構です。

  

1.準備

①Merlinのインストール

~$ git clone https://github.com/CSTR-Edinburgh/merlin.git
~$ cd merlin/tools
~/merlin/tools$ ./compile_tools.sh

②「cmakeがないよ」と言われる場合

コンパイルのときに使用している”cmake”が入っていない場合、cmakeをインストールします。

~$ sudo apt install cmake

上記でうまくいかない場合は、直接ダウンロードします。

~$ wget https://cmake.org/files/v3.4/cmake-3.4.0-rc3.tar.gz
~$ tar xvf cmake-3.4.0-rc3.tar.gz
~$ cd cmake-3.4.0-rc3/
~$ ./configure
~$ make
~$ sudo make install
~$ export PATH="/usr/local/bin:$PATH"
~$ cmake

もう一度以下を実行すれば、無事にインストールできます。

~/merlin/tools$ ./compile_tools.sh

③pipによる諸々のインストール

~/merlin$ pip install numpy scipy matplotlib lxml theano bandmat

  

2.デモの実行(英語音声)

①デモ用のデータダウンロード

”merlin/egs/speaker_adaptation/s1”の中の「download_data.sh」を実行すると、英語のコーパスのデータがダウンロードされます。ダウンロードされるtarファイルだけでも11GB、それを展開したものが16GBと非常に大きいので、計27GB以上の空き容量を確保しておく必要があります(!)

~/merlin$ cd egs/speaker_adaptation/s1/
~/merlin/egs/speaker_adaptation/s1$ ./download_data.sh

自分の場合、ダウンロードに数時間かかりました。

②デモの実行でまさかの大量エラー

データのダウンロード後、「run_demo_voice.sh」実行で無事にデモが行われるはずなのですが、各段階でいろんなエラーが…。仕方がないので各ステップごとに個別実行していき、原因究明および修正をほどこしました。場当たり的にやったので、ごちゃごちゃしており、分かりにくいかもしれませんがご容赦ください…。

③諸々の変更

その1:pygpu関連

GPUを使うためにはpygpuを入れる必要があります。pygpuは”conda”を使ったインストールが基本のようですが、余計なものを入れたくなかったので、こちらを参考に別の方法で入れました。

~$ git clone https://github.com/Theano/libgpuarray.git
~$ cd libgpuarray
~/libgpuarray$ mkdir build
~/libgpuarray$ cd build
~/libgpuarray/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
~/libgpuarray/build$ make
~/libgpuarray/build$ sudo make install
~/libgpuarray/build$ cd ..
~/libgpuarray$ python3 setup.py build
~/libgpuarray$ python3 setup.py install

ちなみに自分の場合Virtualenv内でやろうとしたのですが、どうあがいてもpygpuがVirtualenv内に保存されてくれなかったので、/usr/local/lib/python3.6/dist-packages/pygpu-0.7.6+20.g9cec614-py3.6-linux-x86_64.egg内のpygpuと/home/ユーザー名/.local/lib/python3.6/site-packages内にあるmakoとmarkupsafeの3つのディレクトリをVirtualenv内のlib/python3.6/sitepackagesの中に手動で移動させました…

さらに、GPU駆動のためにはCudaとCudnnのバージョンが一致している必要があります。Cuda-8.0がMerlinとともに自動で入るのですが、Cudnnは別途インストールする必要があるので注意が必要です。自分の場合、以前Cuda-9.1を入れていたので、こちらを使うために、merlin/src/setup_env.shの13行目のcudaに関するパスをcuda-9.1に変更しました。参考リンクはこちら

その2:BLAS関連

機械学習の計算において、BLAS(Basic Linear Algebra Subprograms)というものを入れないとnumpyの本来の実力を発揮できません。以下のコマンドでOpenBLASを入れて、numpyをaptで再インストールします。(こちらを参考に)

~$ sudo apt install -y libopenblas-base libopenblas-dev
~$ sudo apt install python3-numpy

その3:submit.shの変更

”merlin/egs/speaker_adaptation/s1/scripts”の中の「submit.sh」を開きます。THEANO_FLAGSの部分が、バージョンに合わなくなっているので変更します。「nvcc.flags=-D_FORCE_INLINES」を削除し、「gpu」を「cuda」に変えます。2箇所あるので、ご注意ください。

その4:データベース内の無効ファイルの削除

「02_prepare_labels.sh」でラベリングをする段階で、無効なデータファイルがあるとコアダンプを起こしてしまいそれ以降のデータを読んでくれなくなるので、これらをもみ消してしまいましょう(笑)。「VCTK-Corpus」の中のwavとtxtの両方から、以下のファイルを消します(番号のみ表記)。

p225: 018,117,143,177,334
p226: 018,059,125,188,195
p227: 018
p228: 018,053,139,263
p229: 018,057,098,198,296,313
p230: 018
p231: 018,406
p232: 018,051,177,180,192,388
p233: 018,166,186,203,235,296,370
p234: 018

その5:festival,speech_tools,htkのダウンロード

それぞれを以下のリンクからダウンロードします。
festival
speech_tools
htk
ただし、htkのダウンロードにはユーザー登録が必要です。詳しくは以前の記事に書いてあります。
それぞれを展開して、festivalおよびspeech_toolsを”merlin/tools”の中に、htkは”merlin/tools/bin”の中に入れます。htkの中身がさらにbinとなっているようなら、その中身をhtkの直下に来るように配置しなおします。

その6:01_setup.shの変更

”merlin/egs/speaker_adaptation/s1”の中の「01_setup.sh」を開きます。102行目周辺のTrainのファイル数を、⑥で削除したファイル数を反映させて「3258」に変更します。さらに、112行目以降の、ESTDIR,FESTDIR,FESTVOXDIR,HTKDIRについてのパスを、自分の環境に合わせたものに変更します。

その7:08_setup_adapt.shの変更

⑧と同様に変更します。Trainは「306」に変更し(その4で1個だけ消してます)、ESTDIR,FESTDIR,FESTVOXDIR,HTKDIRについてのパスを、自分の環境に合わせたものに変更します。

その8:run_demo_voice.shの変更

”merlin/egs/speaker_adaptation/s1”の中の「run_demo_voice.sh」を開きます。67行目あたりのstep13のところで、「duration_adapt_p234_fine_tune.conf」となっているところを「acoustic_adapt_p234_fine_tune.conf」に変更します。さらに、このスクリプトには音声生成の部分が入っていないので、それも追記します。以下の行を追加してください。

if [ "$run_tts" = true ]; then
   basename --suffix=.txt -- experiments/adapt_p234/test_synthesis/txt/* > experiments/adapt_p234/test_synthesis/test_id_list.scp
   ./07_run_merlin.sh experiments/adapt_p234/test_synthesis/txt conf/test_dur_synth_adapt_p234.conf conf/test_synth_adapt_p234.conf
fi

その9:prepare_config_files_for_synthesis.shの変更

”merlin/egs/speaker_adaptation/s1/scripts”の中の、「prepare_config_files_for_synthesis.sh」の76行目あたりに

$SED -i s#'model_file_name\s:.'#'model_file_name: model_adapted_using_'${AdaptationMethod}# $duration_config_file

を、206行目あたりに

$SED -i s#'model_file_name\s:.'#'model_file_name: model_adapted_using_'${AdaptationMethod}# $acoustic_config_file

を追加します。

④改めて、デモの実行

以下のコマンドでデモが実行されます。

~/merlin$ cd egs/speaker_adaptation/s1/
~/merlin/egs/speaker_adaptation/s1$ ./run_demo_voice.sh

これで、無事にwavファイルが”merlin/egs/speaker_adaptation/s1/experiments/adapt_p234/test_synthesis/wav”の中にできていれば成功です!できていなければ、エラーログとしばし戦ってみていただき、分からなければぜひコメント欄で質問いただければと思います。
いやはや、デモだからすんなりいくと思ったら大間違いでした…。でも、いろいろ勉強になりました。

  

これで、話者適応の準備およびデモ実行は完了です。次回は日本語の音声での実行をしてみたいと思います。