
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”の中にできていれば成功です!できていなければ、エラーログとしばし戦ってみていただき、分からなければぜひコメント欄で質問いただければと思います。
いやはや、デモだからすんなりいくと思ったら大間違いでした…。でも、いろいろ勉強になりました。
これで、話者適応の準備およびデモ実行は完了です。次回は日本語の音声での実行をしてみたいと思います。