Merlinで話者依存モデル。深層学習でリアルな合成音声を作る! 日本語編

Ubuntu18.04で行う、Merlinを使ったDNN(ディープニューラルネットワーク)による音声合成の続きです。MerlinはHTSの後継となる合成音声ライブラリで、従来の生成声より遥かにリアルな声が作れます。この記事では、日本語の音声にチャレンジしてみます。ネット上にあまり記事がなかったので、断片的情報をつなぎ合わせてなんとかしました…。一番参考になったのはこちらの記事です。

   

1.準備

①音声ファイル、ラベルファイルの準備

Merlinでの音声合成のために自分で準備する必要のあるファイルは、声を録音したwavファイルとその発話内容に対応するフルコンテクストのラベルファイルのみです。フルコンテクストのラベルファイルの用意の仕方は、以前の記事で紹介してあります。

②japanese_voiceフォルダの作成

Merlinはすでにインストールされていて、できれば「その1」も実行済みとして話を進めます。”merlin/egs”にあるmandarin_voiceフォルダ(中国語用のフォルダ)をコピーして、フォルダ名を「japanese_voice」に変更します。

③各種ディレクトリの作成

基本的には”merlin/egs/japanese_voice/s1”の中の「README.md」に書いてあるとおりに進めれば大丈夫です。まず、「database」というフォルダを作成し、その中に「wav」、「labels」、「prompt-lab」というフォルダを作成します。さらに「labels」の中に「label_phone_align」というフォルダを作成します。
次に、自分の用意した音声ファイルを「wav」フォルダの中に、フルコンテクストのラベルファイルを「labels/label_phone_align」の中に入れます。そして、「prompt-lab」の中に、フルコンテクストラベルのうち最後にサンプルとして出力生成したいものをいくつか(3〜5個くらい)選び、ここに入れます。

④01_setup.shの変更

Questionsの変更

”merlin/egs/japanese_voice/s1”の中にある「01_setup.sh」というファイルを開き、55行目のQuestionFileの設定を「question-mandarin.hed」から「question-japanese.hed」に変更します。このファイルは、”merlin/misc/questions”の中に最初から入っています(バージョンにもよると思いますが)。

SamplingFreqの変更

同ファイルの57行目、SamplingFreqの設定を、自分が用意したWAVファイルのサンプリング周波数に合わせます。自分の場合、48000Hzだったので”SamplingFreq=48000”としました。

Train,Valid,Testの数変更

同ファイル67,68,69行目のTrain、Valid、Testの値を、自分の用意した音声ファイルの個数に合わせます。ここが少しトリッキーなのですが、ValidとTestの値は、先ほど「prompt-lab」にいれたファイルの個数を両方に入れます。例えば、5個いれたなら、「Valid=5」「Train=5」です。そして、Trainの値には、音声ファイルの総数-Validの個数-Testの個数を入れます。例えば、音声ファイルの総数が200個で、Valid、Testがそれぞれ5個なら、200-5-5=190なので、「Train=190」となります。

⑤scripts/submit.shの変更

”merlin/egs/japanese_voice/s1/scripts”の中の「submit.sh」を開きます。その中の20行目と42行目にあるTHEANO_FLAGSの部分で、「device=gpu」となっているところを「device=cuda」に変更します。これをしないとあとで「gpuという表記はバージョンが古い」と叱られます。

⑥03_prepare_acoustic_features.shの変更

”merlin/egs/japanese_voice/s1”の中にある「03_prepare_acoustic_features.sh」というファイルを開き、35行目の「${Vocoder}」のところを、「${Vocoder,,}」に変更します。この「,,」をつけることで、探しにいくVocoderのフォルダ名が小文字になるようです。

⑦label_normalisation.pyの変更

”merlin/src/frontend”の中にある「label_normalisation.py」というファイルを開きます。ここで、matplotlibのmlab.normpdfというものを使っているのですが、これはもうバージョンが古く使えないそうです。なのでこれを現状のscipyのstats.norm.pdfというものを使うように変更します。8行目「import matplotlib.mlab as mlab」を「from scipy.stats import norm」に変更、678〜680行目および720〜722行目「mlab.normpdf」を「norm.pdf」に変更します。

  

2.実行

①実行ファイルの作成

”merlin/egs/japanese_voice/s1”の中の「run_mandarin_voice.sh」というファイルをコピーして、「run_japanese_voice.sh」に名前を変更します。
そして中身を開いて、5行目のvoice_nameのところを「mandarin_voice」から「japanese_voice」に変更します。

②いよいよ実行!

端末を開き、以下のコマンドを実行すると、学習が始まります。

~$ cd merlin/egs/japanese_voice/s1
~/merlin/egs/japanese_voice/s1$ ./run_japanese_voice.sh

完了すると以下のようなログが出ると思います。「All successfull!! Your demo is ready :)」と書かれていても、上にエラーが書いてあったりするので注意が必要です。

③出力データの確認

HTSでは何時間もかかって(半日はかかる)学習が完了しますが、Merlinでは1時間もかからずに学習が完了します!
出力されたサンプル音声データは、”merlin/egs/japanese_voice/s1/experiments/japanese_voice/test_synthesis/wav”の中に入っています。さすがディープラーニング、HTSより声のリアリティが高かったです!

④任意のテキストからの音声生成(手作業ver.)

「japanese_voice」のコピー元である「mandarin_voice」のフォルダには、任意のテキストからの音声生成のためのプログラムが入っていないので、その1で紹介した「slt_arctic」の中の音声合成用のプログラムを利用します。
”merlin/egs/slt_arctic/s1”の中の「merlin_synthesis.sh」を開きます。この中の20〜38行目(英語のラベル作成に関するプログラム)を除いた部分をコピーして、新しいファイルを作成します。「japanese_synthesis.sh」とでも名付けておきます。
次に、新しく発声させたいテキストのフルコンテクストラベルを”merlin/egs/japanese_voice/s1/experiments/japanese_voice/test_synthesis”内の「prompt-lab」の中に入れます。
その後、同ディレクトリ内の「test_id_list.scp」ファイルに、先ほど入れた発声させたいフルコンテクストラベルの名前(拡張子(.lab)はつけない)を記入し保存します。
最後に、端末で以下のコマンドを実行すれば、学習した音響モデルに基づく新しい音声が生成されます!

~$ cd merlin/egs/japanese_voice/s1
~/merlin/egs/japanese_voice/s1$ ./japanese_synthesis.sh

サンプル音声と同様、出力された新たな音声データは、”merlin/egs/japanese_voice/s1/experiments/japanese_voice/test_synthesis/wav”の中に入っています。

  

以上で、話者依存データによる日本語のDNN音声合成は一通り完了です。次回は話者適応モデルにチャレンジしてみたいと思います。

21件の返信

  1. Axios より:

    この記事を参考に、とある音声を merlin にて話者依存モデルで音声合成できないか試みている者です。
    音声合成に関しては本当にドが付くほどの素人なのですが(学習している仕組みもよく分かっていない上にPythonも初心者レベル…)、
    丁寧に説明されていたお陰で、./run_japanese_voice.sh を実行する所までたどり着きました(音声ラベル等も試行錯誤しつつ作成出来ています)。
    記事を見るからに相当苦労されたのが伝わってきます…記事にして頂いている事に感謝します…

    さて、出来るだけ記事の内容を忠実になぞっているつもりなのですが、
    (違いを挙げるとすれば WSL 上の Ubuntu で構築している事、GPU(CUDA)が実行出来ない(開発PCにNVIDIAGPUを積んでいない)ためCPUで試している事、諸々の事情で音声ラベルはATR503文ではなくカスタムの文章で作成している事くらいでしょうか)
    ソースを記事通りに修正した上で ./run_japanese_voice.sh を実行した所、数十分待ったあとに
    「…
    2019-10-0x xx:xx:xx,059 INFO labels : loaded /root/merlin/egs/japanese_voice/s1/experiments/japanese_voice/test_synthesis/gen-lab/full_069.lab, 143 labels
    2019-10-xx xx:xx:xx,200 INFO acoustic_norm: Loaded min max values from the trained data for feature dimension of 675
    2019-10-xx xx:xx:xx,449 INFO main : label dimension is 675
    2019-10-xx xx:xx:xx,450 INFO main : generating from DNN
    Traceback (most recent call last):
    File “/root/merlin/src/run_merlin.py”, line 1320, in
    main_function(cfg)
    File “/root/merlin/src/run_merlin.py”, line 945, in main_function
    dnn_generation(test_x_file_list, nnets_file_name, lab_dim, cfg.cmp_dim, gen_file_list, reshape_io)
    File “/root/merlin/src/run_merlin.py”, line 420, in dnn_generation
    dnn_model = pickle.load(open(nnets_file_name, ‘rb’))
    IOError: [Errno 2] No such file or directory: ‘/root/merlin/egs/japanese_voice/s1/experiments/japanese_voice/acoustic_model/nnets_model/feed_forward_6_tanh.model’」
    のようなエラーが出て終了してしまい、学習を続行させる事が出来ていません…
    何度も試してみましたが、全く同じエラーが出てしまいます…
    調べても見たのですが、モデルファイルの生成に失敗している事と mandarin_voice に関係していそうな事は分かったものの、それ以上は何も分かりませんでした…

    もし、このエラーについて何か情報をご存知であれば、是非教えて頂けないでしょうか…?
    お忙しいとは思いますが、宜しくお願いします…

    • kyabe2 より:

      コメントいただき、ありがとうございます!そう言っていただき恐縮です笑 日本語の記事が少ないんですよねー…
      自分もMerlinをマスターしているわけではないので、的確なことが言えるか少し不安ではあるのですが、
      もしかしてご使用の音声ファイルのサンプリング周波数が、48000Hzではないとか?
      その場合はご使用の音声ファイルのサンプリング周波数に合わせて、01_setup.shを変更していただければと思います。
      自分も同じようなエラーが、サンプリング周波数が設定と実際のファイルとで異なると出てきたことがありまして…
      参考になれば幸いです。

  2. dk より:

    初めまして。こちらのやり方を見ながら、merlinで音響モデルを作成しようと実行しているのですが、
    ①の音声ファイルやフルコンテクストラベルは、最低でもどのくらいの数が必要でしょうか。
    試しに12個、wavとlabelを用意して実行してみたのですが(Valid=5)
    GPU処理で数分で作成され出力されたものは、
    「あー」的な音声で声になっていない感じのものがwavフォルダに5個作成されました。
    ファイルが少量だとこのような物が出力されるのでしょうか。
    それともどこか手順をミスしていて正常に動作していないのでしょうか。
    ご教示のほどお願いいたします。

    • kyabe2 より:

      コメントありがとうございます!そうですね、深層学習にはある程度の数が必要なので、まともな声を出すには最低50個以上は音声ファイル&ラベルデータが必要かもしれないです…。最終出力ファイルがきちんとあるということは、処理の方は正常に行われていると思いますので、数を増やしさえすればきちんと声が生成できるかと思います!よろしくお願いいたします。

      • dk より:

        返信ありがとうございます。
        50個以上ですか。データ少量の結果だったのですね。安心しました。
        他に日本語でmerlin解説されてるとこが見つからないので感謝しております。
        GPU処理はちゃんと動いてそうなので、頑張って音声&ラベルデータ作ります。
        ありがとうございましたm(_ _)m

        • kyabe2 より:

          数を増やしても変化がないようでしたら、またコメントいただけると幸いです。そう言っていただけると元気が出ます、ありがとうございます!データ作り、結構骨が折れますよね…。無事に声が完成することをお祈りしております。

  3. 阿部高志 より:

    前ページの英語版フルサンプルデモはまだできていませんが、日本語版を試していたところ処理が行えました。
    用意した音声ファイルはHTSのサンプル音声503ファイルを使用しました。
    ですが、エラーが頻発で処理が行えなかったので、確認のために50ファイルに減らしたところ何故か成功しました。
    今回はそこの部分が不思議なので質問させてください。

    エラーは以下のものです。(503ファイル)

    Traceback (most recent call last):
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 1320, in
    main_function(cfg)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 945, in main_function
    dnn_generation(test_x_file_list, nnets_file_name, lab_dim, cfg.cmp_dim, gen_file_list, reshape_io)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 437, in dnn_generation
    predicted_parameter = dnn_model.parameter_prediction(test_set_x)
    File “/home/ユーザー名/merlin/src/models/deep_rnn.py”, line 279, in parameter_prediction
    predict_parameter = test_out()
    File “/home/ユーザー名/.local/lib/python2.7/site-packages/theano/compile/function_module.py”, line 917, in __call__
    storage_map=getattr(self.fn, ‘storage_map’, None))
    File “/home/ユーザー名/.local/lib/python2.7/site-packages/theano/gof/link.py”, line 325, in raise_with_op
    reraise(exc_type, exc_value, exc_trace)
    File “/home/ユーザー名/.local/lib/python2.7/site-packages/theano/compile/function_module.py”, line 903, in __call__
    self.fn() if output_subset is None else\
    File “/home/ユーザー名/.local/lib/python2.7/site-packages/theano/gof/op.py”, line 892, in rval
    r = p(n, [x[0] for x in i], o)
    File “/home/ユーザー名/.local/lib/python2.7/site-packages/theano/tensor/blas.py”, line 1552, in perform
    z[0] = np.asarray(np.dot(x, y))
    ValueError: (‘shapes (908,675) and (671,1024) not aligned: 675 (dim 1) != 671 (dim 0)’, (908, 675), (671, 1024))
    Apply node that caused the error: Dot22(, W)
    Toposort index: 7
    Inputs types: [TensorType(float32, matrix), TensorType(float32, matrix)]
    Inputs shapes: [(908, 675), (671, 1024)]
    Inputs strides: [(2700, 4), (4096, 4)]
    Inputs values: [‘not shown’, ‘not shown’]
    Outputs clients: [[Elemwise{Composite{tanh((i0 + i1))}}[(0, 0)](Dot22.0, InplaceDimShuffle{x,0}.0)]]

    Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 1320, in
    main_function(cfg)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 870, in main_function
    cmp_mean_vector = cmp_mean_vector, cmp_std_vector = cmp_std_vector,init_dnn_model_file=cfg.start_from_trained_model)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 247, in train_DNN
    dropout_rate = dropout_rate, optimizer = cfg.optimizer, rnn_batch_training = cfg.rnn_batch_training)
    File “/home/ユーザー名/merlin/src/models/deep_rnn.py”, line 93, in __init__
    hidden_layer = GeneralLayer(rng, layer_input, input_size, hidden_layer_size[i], activation=hidden_activation, p=self.dropout_rate, training=self.is_train)
    File “/home/ユーザー名/merlin/src/layers/layers.py”, line 224, in __init__
    self.output = T.dot(self.x, self.W) + self.b

    HINT: Use the Theano flag ‘exception_verbosity=high’ for a debugprint and storage map footprint of this apply node.
    done…!

    theanoの内部が何かあるようなのですが、どこを書き換えればいいのでしょうか?
    若しくは503が多すぎるとかありますかね?

    • kyabe2 より:

      50個ではいけたのですか!うーむ、謎ですねぇ…
      ValueError: (‘shapes (908,675) and (671,1024) not aligned: 675 (dim 1) != 671 (dim 0)’, (908, 675), (671, 1024))
      とあるので、行列の掛け算で掛ける行と掛けられる列の数が一致していないようではありますが…
      675,671という数には何か心当たりはありますでしょうか?

  4. 阿部高志 より:

    英語版がどうにか安定してできるようになったので、再度日本語版を試したところ以下のエラーが出ました。

    Traceback (most recent call last):
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 1320, in
    main_function(cfg)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 645, in main_function
    min_max_normaliser.load_min_max_values(label_norm_file)
    File “/home/ユーザー名/merlin/src/frontend/min_max_norm.py”, line 82, in load_min_max_values
    min_max_vector, frame_number = io_funcs.load_binary_file_frame(label_norm_file, 1)
    File “/home/ユーザー名/merlin/src/io_funcs/binary_io.py”, line 64, in load_binary_file_frame
    fid_lab = open(file_name, ‘rb’)
    IOError: [Errno 2] No such file or directory: ‘/home/ユーザー名/merlin/egs/japanese_voice/s1/experiments/japanese_voice/duration_model/inter_module/label_norm_HTS_671.dat’

    step7の実行の際に起きています。
    サンプリング周波数や変更を加える点を何度も確認しましたがダメでした。
    label_norm_HTS_671.datファイルがないとのことですが、このファイルはいったい何なのでしょうか?

    echo “synthesizing speech…”

    ↑これがログに出力されていないので

    echo “synthesizing durations…”
    ./scripts/submit.sh ${MerlinDir}/src/run_merlin.py $test_dur_config_file

    この部分の実行中に起きているエラーだと思われます。

    • kyabe2 より:

      英語版デモのエラーの解決、良かったです!
      なるほど、今度は日本語版でのエラーですね。この記事( https://r9y9.github.io/blog/2017/08/16/trying-to-understand-merlin )によると、そのファイルは671次元の特徴ベクトルの正規化に必要な情報だそうです。で、その671次元は、日本語の質問(question-japanese.hedの中)が671個あることに起因するみたいです。
      そのファイルは、run_japanese_voice.shが正常に完了していれば作られているはずみたいなので、もう一度run_japanese_voice.shで学習させてみて、どこかでエラーが出ていないか見ていただいてもよろしいでしょうか?

  5. 阿部高志 より:

    エラーに悩まされながらも500個ほどの音声ファイルから学習を行うことが成功しました。

    どのエラーだったか忘れましたが、
    カスタム文章でsegment_adapt_windows-v1.0を使う場合、文章が長すぎるとフルコンテキストをopen-jtalkを使い作成した際に正しく処理がされずエラーの原因となっていました。
    恐らく10秒以上ある文章の音声だと思います。
    フルコンテキストの秒数を示す数値部分が変なことになっていたので。

    本題ですが、500個から音声ファイルを作成すること自体はできたのですが、内容が「あー」と言っているようにしかできませんでした、というものです。
    ●学習前のフルコンテキストのエラーが原因なのかもしれません。
    (/home/ユーザー名/merlin/egs/japanese_voice/s1/database/featsは消して学習しています)
    ●もしかするとfestivalも関係していますか? (日本語のみなので入れていませんでした)
    ●音声が用意しきれなかったので読み上げソフトから音声ファイルを作ったのも原因でしょうか?
    (音声ファイルの規格は合わせています。合わせないとエラーになりますし)
    ●先に50個程度で試した後に行ったためモデルが更新されていないとかもあり得ますか?
    ●open-jtalkで男性の音響モデルを使い、学習用音声では女性のものを使ったのがまずかったですかね?

    原因はこれぐらいしか思いつきません。
    ただ、同じ音声ファイルをHTSで試したところ、20個で成功しているので音声ファイルに問題があるようには思えません。(merlinとHTSは別物みたいなのであれですが)

    上のほうでも同じ質問をされている方(dkさん)がいますが、自分のはファイル数が足りているんですよね。
    フルコンテキストもopen-jtalk、segment_adapt_windows-v1.0を使いました。
    その人の内容ぴったりのフルコンテキストが必要とかないですよね?
    そうなると卵(モデル)が先か鶏(フルコンテキスト)が先かになりますし。

    • kyabe2 より:

      エラーとの格闘、お疲れ様でございます…
      どうやらOpenJtalkは一定を超える長文(この記事(http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_open_jtalk/)によれば18文字)だと読み上げが極端に遅くなったりするバグがあるようですね!
      なるほど、十分な音声データを使ってもまともな音声が出力されなかったのですね。
      まず、OpenJtalk用音声と学習用音声の違いは、あまり関係がないと思われます。segment_adapt_windows-v1.0によって、ラベルファイルの音声の高さに関する部分が修正されるので、学習用音声に合わせられたラベルになるはずだからです。
      次に、モデルが更新されていない可能性ですが、前回よりも今回の方が音声データの量がより多いですし、基本的に上書きされるので影響はないはずです。念のため各ファイルの更新日時をチェックしてみていただければと思います。
      festivalも英語のみに必要なものなので、関係ないはず。読み上げソフトで読み上げた音声は、用意した音声に対してどのくらいの割合でしょうか?また、その読み上げ音声は用意した音声の声質とどのくらい違うものでしょうか?
      音声生成用のフルコンテクストファイル(s1/experiments/japanese_voice/test_synthesis/prompt-labにいれたもの)は、まずは学習用に使ったものの一部を使ってみると良いかもしれません。もしこちらのフルコンテクストファイルの用意に使った音声があまりに学習用音声と乖離しているとうまくできないかもしれないです…
      学習前のフルコンテクストのエラーというと、具体的にはどんな感じでしょうか??
      質問に対して質問で返してしまってすみませんが、よろしくお願いいたします。

  6. 阿部高志 より:

    やはりopen-jtalkにも規格が存在していたんですね。
    フルコンテキストとして使う分には修正可能なレベルでしたので良かったです。
    学習前のフルコンテキストのエラーは、open-jtalkを使った際に生成されるフルコンテキストの数値(音素の秒数?)が変なことになっていた、というものです。
    どこかでバグったのか、設定をミスったのかわかりませんが。

    今回は全て(503個)フリーの読み上げソフトから音声を作成しており、内容はATR503文章と同じものです。

    あれから考えまして、音声ファイルの規格の見直し、音量の調整、発話内容の一致(大変でした)を行い試しました。
    結果は同じく「あー」と言っているようにしか聞こえないものが出来上がりました。
    やはり音声かフルコンテキストがダメなのでしょうか……。

    そこでHTSで学習させて音響モデルを作り、open-jtalkからフルコンテキストを、merlinで学習させました。
    しかし、結果は変わらず残念音声です。

    もっと考え、今度はaudacityを使い波長のチェックを確認しました。
    すると、HTSのサンプルと波長が大きく異なり、作成したフルコンテキストの秒数間での発話が変な部分で区切られているのが確認できたのです。
    ただ、変なところで区切られていても音声生成用のフルコンテキストは学習用の中から流用しているのでおかしな話に思えますが。

    HTSのサンプル503個を試しに入れてみたところ普通に音声が生成できたので、やはり機械音とフルコンテキストの一致がダメなのだと結論を出しました。
    HTSでは機械音でも生成できるので余計に意味が分からないことになっています。
    内部の学習処理が違うんですかね? (違うでしょうが)
    学習用の音声のフルコンテキストを作成できないものでしょうか……。

    今度はyoutubeから生の音声を探して試してみようと思います。

    また、変わったエラーといいますか、設定ファイルの上書き系? で詰まった経験をお伝えしておきます。
    merlinでサンプルデモを試してMemory Error(処理能力不足?)になったので、音声ファイルの数を30個に減らして、設定ファイルや実行ファイルの数値を修正して再度行いました。
    すると、なぜかTrain、Valid、Testの数が一致しないエラーが頻発しました。
    いろいろ見て回ったためどのファイルだったか覚えていないのですが(しかも気づいたらPCが再起動していました)、run_merlin.pyでエラーが起きているので確認すると三つの合計数が表示されているファイルが60個のままだったので修正したのを覚えています。
    そのファイルの中身を一行ずつ読んで数を比較しているんですよね?
    ファイルの数を減らしたのは初めてだったので、なぜ一致しないのか悩みに悩みました。

    • kyabe2 より:

      エラーが出ないのが一番わけわからんくて辛いですね…。
      様々に悩み、試行錯誤されているお姿が伝わってきます。なるほど、OpeJtalkのログファイルの中身がおかしい感じになっていたのですね。もしかすると、ログファイルからコンテクストを抜き出す自作PYTHONアルゴリズムが間違っているかもしれません(この記事のやつです -> https://www.ibuddie.site/blog/250)。文字列の抽出条件を「”0000”かつ”xx/”を含む」というものにしていますが、別の音声だと異なるのかも…。
      なるほど、Train,Valid,Testの数が合わなかったのですね。確かに自動で判別して欲しいところですよね汗

      いろいろややこしくなったので整理しますと、まず、用意されたのは①フリーの読み上げソフトから作成したATR503文の503個のwavファイル、②ATR503文なので「segment_atr503_windows-v1.0」を使って用意したフルコンテクストラベル(OpenJtalkは使う必要なし)、でよろしいですかね?
      で、各種ディレクトリを作成したのち、「prompt-lab」ディレクトリにサンプルとして出力生成したいフルコンテクストラベルを入れて、各種設定の変更を施して学習実行(「./run_japanese_voice.sh」の実行)。
      「All successfull!! Your demo is ready :)」と出てもなお上にエラーが隠れていないかチェック(できれば「./run_japanese_voice.sh」の中身を各ステップごとに実行できたらなお安心)。
      出力データ確認後、今度は任意の音声の生成に挑戦。
      新しく発声させたいテキストのフルコンテクストラベル(これはOpenJtalkのログから作成必要 -> さらに、そのログから作ったフルコンテクストファイルを「segment_adapt_windows-v1.0」を使って声質を変更したフルコンテクストファイルに。ただしOpenJtalkには発話長さ制限あり。)を、「prompt-lab」ディレクトリに入れ、「test_id_list.scp」ファイルの中に、先ほどのフルコンテクストファイルの名前を入れる。-> この時、名前は拡張子(.lab)をつけない。さらに、複数ある場合は名前ごとに改行。
      その後、いよいよ生成(「./japanese_synthesis.sh」の実行)。
      この流れはOKですかね??どこかに見える形でのエラーや相違点があれば解決策を講じられるのですが…

      ともあれ、数多くのエラーに見舞われても諦めない姿勢、尊敬いたします。応援しております!

  7. 阿部高志 より:

    またまた訳の分からないエラーが出てしまいました…。

    2020-03-25 17:18:56,331 CRITICALListDataProvider: the number of frames in label and acoustic features are different: 3086 vs 2643 (full92)
    2020-03-25 17:18:56,333 CRITICAL main : train_DNN threw an exception
    Traceback (most recent call last):
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 1320, in
    main_function(cfg)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 870, in main_function
    cmp_mean_vector = cmp_mean_vector, cmp_std_vector = cmp_std_vector,init_dnn_model_file=cfg.start_from_trained_model)
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 225, in train_DNN
    shared_valid_set_xy, temp_valid_set_x, temp_valid_set_y = valid_data_reader.load_one_partition()
    File “/home/ユーザー名/merlin/src/utils/providers.py”, line 296, in load_one_partition
    shared_set_xy, temp_set_x, temp_set_y = self.load_next_partition()
    File “/home/ユーザー名/merlin/src/run_merlin.py”, line 849, in main_function
    os.makedirs(model_dir)
    File “/usr/lib/python2.7/os.py”, line 157, in makedirs
    mkdir(name, mode)
    OSError: [Errno 17] File exists: ‘/home/ユーザー名/merlin/egs/japanese_voice/s1/experiments/japanese_voice/acoustic_model/nnets_model’

    下の部分は上の部分がうまくいっていないがためのエラーなのは経験上分かっています。
    ただ、こちらの

    the number of frames in label and acoustic features are different: 3086 vs 2643 (full92)

    このエラーは意味が分かりません。
    フレーム数と音響の何かが異なるらしいのですが、何度も調べても
    チャンネルは1(モノラル)
    サンプリング周波数は48000
    ビットレートは16
    指定の通りになっていました。

    音声はyoutubeから拾ったものです。
    少しの雑音がダメなのでしょうか?
    動画のフレームならわかりますが音声のフレームは聞いたことがなかったので余計にわからない状況で困っています。
    一つのファイルが悪いのかと思えば全部が悪いようでもありました。

    音声はaudacityで行いました。

    • kyabe2 より:

      返信遅くなりすみません…
      音声であるWAVファイルも、アナログの信号をサンプリングしてデジタル化しているので、フレームがあるみたいですね。フレーム数はこの記事によれば(https://qiita.com/bayachin/items/68f7659d31fa6c836317)、サンプリング周波数×時間で算出されるみたいです。
      同じようなエラーの人がたくさんいたら良いのですが、あんまりないですね…
      いちおう、この記事(https://github.com/CSTR-Edinburgh/magphase/issues/12)では「REAPER」というものでフレーム数を算出しており、それのバグだとか言ってますね汗
      2019年10月のコメントっぽいのですが、merlinを最新バージョンにしたら何か道が開けるのでしょうか(すでに最新だったらすみません)
      音声信号の雑音等はそこまで関係ないはずです!

  8. Toshi より:

    最近、本ページにたどり着き
    日本語音声合成を試みています。

    英語は、fullの音声合成できましたが、日本語がどうしてもエラーで止まります。

    エラーは、
    2020-07-17 CRITICALListDataProvider: the number of frames in label and acoustic features are different: 473 vs 459 (a24)
    a24は、音声ファイルa24.wavラベルファイルa24.labを指していると思います。

    acousticモデルの生成ができません。

    データは、ATR503のデータnitech_jp_atr503_m001_a01~a50をa01からa50という名称に変更して使っています。

    このエラーの回避方法は、ないのでしょうか?

    よろしくお願いいたします。

    • kyabe2 より:

      CRITICALListDataProvider: the number of frames in label and acoustic features are different: 〇〇〇 vs 〇〇〇
      のようなエラーは、以前も質問してくださった方がいたのですが、自分も解決策が結局わかりませんでした汗
      新しいバージョンで特有のエラーなのかもしれません…。一応、この記事(https://github.com/CSTR-Edinburgh/magphase/issues/12)によればREAPERというものが関係しているみたいです。
      Merlinリポジトリのバージョンを下げるか、この記事の内容に従ってREAPERのバージョンを上げるかすると解決するかもしれません。
      明確な回答でなく申し訳ございませんが、よろしくお願いいたします。

  9. Toshi より:

    できている英語のディレクトリをコピーして、このページの変更を加えて
    日本語の音声合成は、できるのでしょうか?

    よろしくお願いいたします。

    • kyabe2 より:

      英語の方のディレクトリは、中身のいろいろな設定が英語用になっていて、直接適用できないみたいなのです汗。
      なのでMandarinディレクトリをごにょごにょしているのですが、日本語用の明確なやり方が公式には出てないみたいなので、逐次エラーと戦うしかないようです。自分ももう少しMerlinに精通して全体の構造をつかめていたらいいのですが…。
      よろしくお願いいたします。

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