HTSで話者依存の自作音響モデルをつくる! 本編

Ubuntu18.04にて、HTSを使って話者依存の音響モデル(.htsvoice)を作るシリーズの第3回です。
引き続き、こちらのサイトを大いに参考にさせていただきました。

http://mahoro-ba.net/e1876.html

  

4. カスタム音響モデルの作成

いよいよ本題であるカスタム音響モデルです。

<音声の録音>

友人に頼んでATR503文を読み上げていただきました。
録音環境:Macbook12インチのボイスメモアプリ USBマイク 自室
ボイスメモアプリだと.m4aで保存されるため、これを「MediaHuman Audio Converter」で.wavに変換(16bit, Mono, 48000Hz)。
さらに、そのままでは音量が少し足りなかったため「audacity」を使ってノーマライズしました。503文ともなると編集もなかなか骨が折れます(読み上げてくれた友人に心から感謝)。
最後に、ファイル名を”a01.wav”〜”a50.wav”、”b01.wav”〜”b50.wav”…”j01.wav”〜”j53.wav”と変更します。この作業はUbuntuに音声データを移動させてから行いました。(Macbookでは01,02という連番がしにくかった)

  

<音素ラベリング>

サンプルでは必要ありませんでしたが、カスタム音声になると音素のラベリングが必要になるみたいです。今回はATR503文を読み上げていただいたので、「segment_atr503_windows-v1.0」の方を使いたいと思います。segment_adapt_windows-v1.0の方は、任意の音声でできるので、ATR503以外の文章を使うときにはこちらを使うといいみたいです。

1. 音声データの格納

”HTS/segment_atr503_windows-v1.0”直下に発話者の名前など任意の名前をつけたフォルダをつくり、その中に503個の音声データを入れます。

2. 実行ファイルを修正

”HTS/segment_atr503_windows-v1.0”の中の、”segment_atr503.pl”を開きます。(エディタは任意。)

4行目: $speaker = “akihiro”; を、 $speaker = “(自分のつけたフォルダ名)”
8行目: $julius4bin=”./bin/julius-4.2.1.exe”; を、 $julius4bin=”julius”;
78行目: push(words, $_); を、 push(@words, $_);

というように修正し、保存します。もとのファイルのバックアップを取っておくと安心です。

3. 端末を開き、以下のコマンドを実行

~$cd HTS/segment_atr503_windows-v1.0
~/HTS/segment_atr503_windows-v1.0 $ perl segment_atr503.pl

4. 出力の確認(full, mono, raw)

”HTS/segment_atr503_windows-v1.0”直下に任意の名前で作成したフォルダを見てみると、格納した音声データ以外に、”full”、”mono”、”raw”の3つのフォルダが出現しているはずです。それぞれ中身を確認して、ファイルがきちんとあれば、成功です。

  

<カスタム音響モデル>

1. Makefile.inファイルの修正

”HTS/HTS-demo_NIT-ATR503-M001/data”の中にある”Makefile.in”ファイルを開きます。(エディタは任意。)

その中に複数行ある、
”/$(DATASET)$(SPEAKER)” を ”/” で置き換えます。たくさんあるので検索と置換を使うと便利です。

2. full, mono, rawの移動

”HTS/segment_atr503_windows-v1.0”直下に任意の名前で作成したフォルダに出現した”full”フォルダを、”HTS/HTS-demo_NIT-ATR503-M001/data/labels”の下にある”full”フォルダと置き換えます。

同様に”mono”フォルダも”HTS/HTS-demo_NIT-ATR503-M001/data/labels”の下にある”mono”フォルダと置き換えます。

最後に”raw”フォルダは、”HTS/HTS-demo_NIT-ATR503-M001/data”の下にある”raw”フォルダと置き換えます。

3. data内生成フォルダ(cmp, lf0, mgc, bap, lists, scp)の削除 (2019/8/6加筆)

もし用意した音声データが503個より少なかった場合、かつそれ以前に503個の音声データで実行していた場合、”HTS/HTS-demo_NIT-ATR503-M001/data”の中にある、”cmp”,”lf0”,”mgc”,”bap”,”lists”,”scp”の6つのフォルダをすべて削除します。仮にこれらが残ったまま、503個より少ない音声データから生成されたfull,mono,rawを使って実行すると、それ以前に503個の音声データから作成されたものを使うため、音声が混ざります。

4. 端末を開き、以下のコマンドを実行。

~$cd HTS/HTS-demo_NIT-ATR503-M001
~/HTS/HTS-demo_NIT-ATR503-M001 $ ./configure --with-sptk-search-path=$HOME/HTS/prog/SPTK/bin --with-hts-search-path=$HOME/HTS/prog/htk/bin --with-hts-engine-search-path=$HOME/HTS/prog/hts_engine_API/bin
~/HTS/HTS-demo_NIT-ATR503-M001 $ make

5. 女性の声の場合は、2つ目のコマンドを以下のように変更。

~/HTS/HTS-demo_NIT-ATR503-M001 $ ./configure UPPERF0=400 --with-sptk-search-path=$HOME/HTS/prog/SPTK/bin --with-hts-search-path=$HOME/HTS/prog/htk/bin --with-hts-engine-search-path=$HOME/HTS/prog/hts_engine_API/bin

これは、基本周波数に関する指定のようです。このオプションをつけないで実行すると、女性なのにかなり低めの声が出力されてしまうことになります。

6. 出力の確認

数時間ほど待つと、いよいよカスタム音響モデルの完成です。
”HTS-demo_NIT-ATR503-M001/voices/qst001/ver1”にhtsvoiceファイルができていると思います。(ファイル名は”nitech_jp_atr503_m001.htsvoice”)
”HTS-demo_NIT-ATR503-M001/gen/qst001/ver1/hts_engine”には、サンプル音声(wavファイル)が入っています。

Htsvoiceファイルができさえすれば、OpenJtalkなどを使って好きな言葉を喋らせることが可能です。

  

参考URL

マーチンさん http://mahoro-ba.net/e1876.html
アキヒロさん http://akihiro0105.blog55.fc2.com/blog-entry-12.html
ragolunさん https://ragolun.exblog.jp/23144146/
satortu.netさん(ATR503文) https://satoru-net.hateblo.jp/entry/20151030/1446184756

  

話者依存モデルの音響モデル作成の流れは以上となります。次は話者適応モデルをつくってみたいと思います。

4件の返信

  1. 阿部高志 より:

    用意したATR503文のwavファイルから音響モデルを作ろうとしているのですがうまくいきません。

    まず、rawファイルに変換する時点でfullとmonoは作られますが、rawフォルダは作られても中身がない状態でエラーになります。

    ・・・
    Start segmentation j51
    Start segmentation j52
    Start segmentation j53
    Error: cannot open wav file
    push key

    Died at segment_atr503.pl line 32, line 1.

    何か死んでいるようですが、意味が分かりません。

    幸いfullとmonoフォルダの中身はできていたので、コマンドからrawファイルを作成し、それぞれをフォルダに移動させました。
    rawファイルも音声を確認しています。
    その後サンプルと同じようにファイルを減らして音響モデルと音声ファイルを作ったのですが、すごいぷつぷつの音声で、日本語とも思えないものが出来上がりました。

    x2x : warning: input data is over the range of type ‘short’!

    この警告もたくさん出ています。
    音声ファイルの規格は合わせています。
    エラーを調べたところ音量などの原因らしいのですが、音量を調節したりしても変わりがなくぷつぷつしたり、クラッシュで途中終了します。

    • kyabe2 より:

      まず、前半の「Died at…」の件ですが、これはエラーではなく、正常に終了したときにも出るただのログメッセージみたいです。アルファベットと数字をぐるぐる回して処理しているため、a1からj53まで全部終わるとそれ以上開けるwavファイルは存在しなくなるので、このメッセージが出るようです。

      rawファイルが出力されないのは、soxのバージョンの関係で、ソースコード(segment_atr503.pl)のraw生成部分である
      「system(“echo $speechfile | sox -t wav $speechfile -t raw -L -2 -s $speaker/raw/${filename}.raw”);」(176行目)を
      「system(“echo $speechfile | sox $speechfile $speaker/raw/${filename}.raw”);」に変えないといけないみたいです…
      記事に書き忘れてしまっていたようなので、修正しておきます。すみません汗

      最後の、音響ファイルを作ったときに使ったファイルの数はいくつぐらいでしょうか?少ないと最終的にできる音声のクオリティにかなり影響しそうではあります。
      ただ自分も「x2x : warning: input data is over the range of type ‘short’!」に関してはMerlinの方で遭遇し原因究明ができないままゴリ押してしまったので、適切な回答ができるか不安です…

  2. 阿部高志 より:

    無事rawファイルが作れるようになりました。大変ありがとうございます。

    「Died at…」の部分はそういう意味だったのですね。
    いきなりあんなログが出てきたので不安になっていました。
    a01~j53(全503ファイル)までしか対応していないみたいですが、内部をいじれば倍の音声ファイルからでも音響モデルを作れるのでしょうか?
    merlinと比べると質が悪いように聞こえますし、ATR503文以外の文章ではもっと多くの学習データが必要そうなので。
    もしかして、話者適応のほうで三人の平均データを増やせばいい音響モデルが作れるのですかね?

    • kyabe2 より:

      無事に作成できて本当に良かったです。

      そうですね、プラグラム上ではa01~j53と限定している部分はありませんので、倍の音声ファイルでも可能なはずです!
      Merlinは深層学習なのに対し、HTSは一世代前の技術ですからね…。平均声と適応させたい声にあまりに乖離がある場合ですと、「平均声を作るための話者数」は生成される声の質に関わりますが、そうでない場合はデータ数の方が質に寄与するかと思います。ただ、話者適応自体の技術的な頭打ちもありますので、ATR503文で満足できる声が完成しない場合、数をこれ以上増やしても厳しいかもしれません…。

コメントは受け付けていません。