HARK音声認識セット("HARK_recog_2.3.0.1_practice2")のモデルを自作モデルに差し替えたい。

HARK FORUM HARK音声認識セット("HARK_recog_2.3.0.1_practice2")のモデルを自作モデルに差し替えたい。

This topic contains 10 replies, has 3 voices, and was last updated by Avatar yoshi.shun.kaldi 2 weeks, 4 days ago.

Viewing 11 posts - 1 through 11 (of 11 total)
  • Author
    Posts
  • #1076
    Avatar
    yoshi.shun.kaldi
    Participant

    初めて質問させていただきます。

    Corpus of Spontaneous Japanese(以下、CSJ)で学習したKaldi音声認識モデル(nnet1)を
    “HARK_recog_2.3.0.1_practice2″で使用しているデフォルトのモデルと差し替えたいです。

    現状は、Ubuntu16.04 LTS 環境にて Hark公式(※1)の Installation 等を参考に、
    HARKの各パッケージをインストールし、”HARK_recog_2.3.0.1_practice2″の動作確認まで行えております。

    次のステップとしてHARK Documentの”6.8.2 KaldiDecoder”(※2)の章と、
    “HARK_recog_2.3.0.1_practice2″に内包されている”./kaldi_conf/online.conf”を参考に、
    デフォルトのモデルを自作モデル(上記に記載した、CSJで学習したKaldi音声認識モデル(nnet1))に差し替えました。

    その状態でREADME_JPを参考に”sep_rec_offline.n”を実行したところ、
    KaldiDecoderがクラッシュし手詰まりの状況です。

    エラー内容から”The input-dim is 1400, the data had 189 dims”とあり、
    確かに自作モデルだと”input-dim 1400″に対し、
    デフォルトのモデルは”input-dim 189″となっています。
    モデルを差し替えた場合に変更すべきパラメータ等ございましたらご教示いただけないでしょうか。

    以下にログ等の情報となります。

    ◆ 差し替えたファイル(全7点)
    =======================================================
    1.align_lexicon.int
        ⇒ s5/exp/tri4/graph_csj_tg/phones を使用。

    2.ali_train_pdf.counts
        ⇒ s5/exp/dnn5b_pretrain-dbn_dnn を使用。

    3.final.feature_transform
        ⇒ s5/exp/dnn5b_pretrain-dbn_dnn を使用。

    4.HCLG.fst
        ⇒ s5/exp/tri4/graph_csj_tg を使用。

    5.final.mdl
        ⇒ s5/exp/dnn5b_pretrain-dbn_dnn を使用。

    6.final.nnet
        ⇒ s5/exp/dnn5b_pretrain-dbn_dnn を使用。

    7.words.txt
        ⇒ s5/exp/tri4/graph_csj_tg を使用。
    =======================================================

    ◆ sep_rec_offline.n実行手順(README_JP)
    =======================================================
    1.python python/Kaldi.py (kaldiReceiver connected.が出力されるまで待つ)
    2.batchflow sep_rec_offline.n 2SPK-jp.wav
    =======================================================

    ◆ エラー内容
    `
    (省略)
    KaldiReceiver connected.
    Client connected: 127.0.0.1:57914 unique_key=b06923ac-ef66-451f-b812-15bdda81e46b
    [ERROR] nothing to read, socket has been closed by remote host
    [WARNING] read operation failure
    Client disconnected: 127.0.0.1:57914 unique_key=b06923ac-ef66-451f-b812-15bdda81e46b
    Client connected: 127.0.0.1:57916 unique_key=119cf47a-1b14-416b-958a-46dfb223426a
    [ERROR] nothing to read, socket has been closed by remote host
    [WARNING] read operation failure
    Client disconnected: 127.0.0.1:57916 unique_key=119cf47a-1b14-416b-958a-46dfb223426a
    waiting 1
    [ERROR] Non-matching dims on the input of <AddShift> component. The input-dim is 1400, the data had 189 dims.
    terminate called after throwing an instance of ‘std::runtime_error’
    what():
    Aborted (core dumped)
    `

    ◆ その他
    (※1)
    ・https://www.hark.jp/install/linux/

    (※2)
    ・https://www.hark.jp/document/2.5.0/hark-document-ja/subsec-KaldiDecoder.html
    ・https://www.hark.jp/document/hark-document-en/subsec-KaldiDecoder.html

    以上です。
    何卒よろしくお願いいたします。

    #1077

    お問い合わせありがとうございます。

    ご質問の目的ですが、CSJコーパスで学習された音響/言語モデルが必要という認識で宜しいでしょうか。
    nnet3形式のchain modelで宜しければ、学習済みのモデルが下記ページよりダウンロード可能です。
    https://www.hark.jp/download/samples/

    現行の最新版(HARK3.0)のサンプルファイルがCSJで学習されたモデルとなります。
    次のファイルをダウンロードして頂けますでしょうか。
    HARK_recog_3.0.0_practice2.zip

    従来のnnet1形式のモデルに比べ認識性能、処理速度なども向上しておりますので、
    今後も互換性のためにnnet1形式のモデルを使用して動作させる事は可能ですが
    理由が特になければnnet3形式のモデルへ移行される事を推奨しております。

    モデルの変更にあたり、デコード時に使用する特徴量は
    特徴量13次元 + Delta特徴量13次元 + DeltaPower特徴量 の27次元から
    特徴量40次元 に変更となっています。ご了承ください。

    —-

    また、将来的にご自身で学習されたモデルへ入れ替えたいという事でしたら、
    HARK Forum内の下記スレッドでKaldi公式の学習レシピ(nnet3用)から変更が
    必要な点についての回答が行われていますので宜しければご確認ください。
    音響モデルの作成について

    まず、GMMの学習に13次元のMSLS特徴量、chain学習に40次元のMSLS特徴量が必要となります。
    SpeechRecgnitionClientのFEATURESへの入力をSaveHTKFeatureに繋ぎ変える事でHTK形式の特徴量ファイルが出力されます。
    デコード時(音声認識セットのサンプル)は40次元の特徴量のみをSpeechRecgnitionClientにて送信していますが、学習の為には別途13次元の特徴量が必要になりますのでご注意ください。
    上記のスレッドを参考にHARKで出力したHTK特徴量をKaldiのark形式に変換して頂いた上で、Kaldiへ入力して学習してください。
    我々が提供しているモデルではiVectorに100次元を使用しております。
    他の設定は HARK_recog_3.0.0_practice2.zip の kaldi_conf ディレクトリをご参照ください。

    Notes:
    Kaldi公式のレシピでPCMデータから直接作成してしまいますと、
    MSLS特徴量には対応していませんのでMFCC特徴量が使われます。
    MSLSExtractionの代わりにMFCCExtractionというノードを使用する事も可能ですが、
    この場合も特徴量の次元数等の設定については学習時と合わせて頂く必要が御座います。

    以上、宜しくお願い致します。

    #1080
    Avatar
    yoshi.shun.kaldi
    Participant

    お忙しい中迅速なご回答いただき誠ありがとうございます。

    言葉足らずな質問で申し訳ございません。

    目的といたしましては、HARK_recog_2.3.0.1_practice2で使用しているモデルを
    私自身がKaldi+CSJコーパス+IRSTLMで作成したnnet1モデルへ入れ替えたいです。
    # 既に私自身が作成したnnet1モデルがあるためそれを用いてHARK_recog_2.3.0.1_practice2を動作させたいです。

    nnet3モデルを推奨されているとのことですが、
    私の環境上直近で用意できるのがnnet1モデルのみであるため、
    どうにかnnet1で動作させたいという思いがございます。
    # 目下、私自身が作成したnnet1モデルで動作実績を作りたいです。

    そのためkaldi nnet1 model samplesとある、
    HARK_recog_2.3.0.1_practice2を使用しモデルを入れ替えたところ、
    以下のエラーとなりご質問させていただいた次第です。

    [ERROR] Non-matching dims on the input of <AddShift> component. 
    The input-dim is 1400, the data had 189 dims.

    ご教示いただいた内容からnnet3の場合Kaldiのモデル作成からやり直す必要が
    あるように見受けられますがnnet1の場合も同様なのでしょうか。

    KaldiおよびHarkに触れてからまだ日が浅い部分もあり、
    まずは動作させるというところ目指しております。
    大変恐れながらnnet1で動作させる方法をご教示いただけると大変助かります。

    以上です。
    何卒よろしくお願いいたします。

    #1082
    Avatar
    Danilo Onishi
    Participant

    お送りいただいたエラー内容ですが、HARKが送信している特徴量とKaldi音響モデルの入力次元数が異なるのが原因です。

    HARK側ではMSLSExtractionノードとMelFilterBankのFBANK_COUNTオプションを実際の次元数を設定し、DeltaノードのFBANK_COUNTに次元数+1(パワー次元のため)を設定して頂く必要があります。

    また、Kaldidecoder側で–splice(現在フレームと合わせて前後何フレームを入力するか)の設定が必要になります。HARK_recog_2.3.0.1_practice2で提供しているモデルはsplice 3を使用しておりますので、現在フレームの±3フレーム(合計7フレーム)をモデルに入力します。つまり、入力次元数は [13(ベース次元数)+13(デルタ)+1(パワー)] * 7 = 189になります。一歩、Kaldi本家のnnetレシピのデフォルトですと、splice=17とfMLLR特徴量で(17*2+1)*40=1400になります。

    ただ、注意点としてkaldidecoderはHTK形式特徴量(HARKが扱う形式)にしか対応しておりませんので、それに合わせてHTK特徴量でKaldi音響モデルを学習する必要があります。データの変換手順に関しては前の投稿をご参照ください。

    以上、宜しくお願い申し上げます。

    #1083

    > 私の環境上直近で用意できるのがnnet1モデルのみであるため、
    > どうにかnnet1で動作させたいという思いがございます。
    理解しました。

    > ご教示いただいた内容からnnet3の場合Kaldiのモデル作成からやり直す必要が
    > あるように見受けられますがnnet1の場合も同様なのでしょうか。
    MSLS特徴量を使用したい場合は、HARKでしかMSLS特徴量を生成できませんので再学習が必要になります。一方で広く一般的に使われるMFCC特徴量もHARKで計算する事が出来ますので、性能等に差が出る場合もございますがMFCC特徴量で学習されたモデルをKaldiDecoderで使う事は可能です。
    HARKの分離音をSaveWavePCMで出力して学習に使用された場合などは、CSJの学習レシピを変更していなければKaldiがMFCC特徴量に変換して学習しているはずですので、再学習しなくても設定変更だけで済むものと思われます。その場合、お使いの環境で下記の変更が必要となります。

    1.HARKのネットワークファイルの差し替え
    Kaldi公式レシピでPCMデータから学習している場合、KaldiDecoderには40次元のMFCC特徴量を入力する必要があります。上の投稿にありますように、入力した特徴量形式と次元数が一致していれば特徴量空間での適応処理(fMLLR)を行って作成されたモデルの場合でも問題なくデコードできます。
    HARK_recog_2.3.0.1_practice2 に含まれるネットワークファイルでは特徴量の次元数が異なりますので修正が必要です。40次元の特徴量を作るHARKのネットワークファイルのサンプルは、 HARK_recog_3.0.0_practice2.zip に含まれております。注意点として、 MSLSExtraction ノードでMSLS特徴量を生成している部分を MFCCExtraction ノードに置き換えて頂く必要が御座います。MFCCExtractionノードのパラメータは MSLSExtraction と同じように40次元となるように設定して差し替えてください。

    2.KaldiDecoderに渡すconfigファイルの変更
    上の投稿にありますように、KaldiDecoderに読み込ませるconfファイルへ下記の行を追記してください。
    --splice=17

    以上、宜しくお願い致します。

    #1088
    Avatar
    yoshi.shun.kaldi
    Participant

    お世話になっております。
    お忙しいところ詳細なご回答ありがとうございます。

    ご教示いただいた内容を参考に以下の手順(※1)で動作させることができました。
    ありがとうございます。大変助かりました。

    また、動作させる中で大変恐れながら1点質問がございます。

    私の最終的に実現したいことといたしましては、マルチマイクではない通常マイクで録音した音声ファイル(例えば、発話者一人が静音環境下が録音した「おはようございます」など一言で終わるwavファイル)を、”2SPK-ja.wav”と差し替えて認識させてみたいと考えております。

    ご教示いただいた内容で動作させることができましたので、早速任意の音声ファイルと差し替えたところ正常に動作する(クラッシュしない)ものの認識結果が出力されないでおります。(kaldi_out.txtに何も出力されない)
    # sox –i 2SPK-ja.wavで情報は確認しbit数等を合わせた音声ファイルを使用しております。

    認識させる上で何か設定が必要でしたらご教示いただけないでしょうか。

    また、”2SPK-ja.wav”を認識させた場合は想定(HARK_recog_3.0.0_practice2を修正しないで認識させた結果)とは大分異なる結果となっております。

    ●認識結果(自作nnet1による”2SPK-ja.wav”の認識結果)

    0, 135.0, いう
    1, 105.008911, じ か
    2, 64.972717, か きく
    3, 40.01096, か
    5, -35.024876, ちゅ いう いう 地域 いう 
    4, 45.0, いう い いう い 
    11, 120.000725, いう
    10, 94.992081, か き
    6, 45.0, か いう い 言う か い 言う か
    7, -35.024876,  いう  言う か
    9, -35.024876, 釣っ  いう 
    8, 49.98904, か い  いう  言う か

    お忙しいところ大変恐縮ではございますがご回答いただける幸いでございます。

    以上です。
    何卒よろしくお願いいたします。

    (※1)
    以下試した手順となります。

    1.HARKのネットワークファイルの差し替え
    ご教示いただいた通り、HARK_recog_2.3.0.1_practice2を使用するのではなく、
    HARK_recog_3.0.0_practice2を使用しネットワークでは以下の変更をいたしました。

    ● HARK_recog_3.0.0_practice2(sub_recognitionシート)の変更

    変更箇所:MSLSExtraction ノード ⇒ MFCCExtraction ノードに変更

    パラメータについては以下の通りです。

    ・FBANK_COUNT = FBANK_COUNT ★ MSLSExtractionと同様の値。
    ・NUM_CEPS = 12→40 ★40に変更。
    ・LIFTERING_COEF = 22
    ・USE_POWER = false

    2.KaldiDecoderに渡すconfigファイルの変更
    こちらはHARK_recog_2.3.0.1_practice2のconfigに加え、ご教示いただいた通り--splice=17を追加いたしました。
    # .nnetや.mdlなどはnnet1モデルを使用しております。

    --port-mfcnet=5530
    --port-result=10500
    --filename-words=./my_model_conf/words.txt
    --filename-align-lexicon=./my_model_conf/align_lexicon.int
    --max-active=2000
    --filename-feature-transform=./my_model_conf/final.feature_transform
    --filename-nnet=./my_model_conf/final.nnet
    --filename-mdl=./my_model_conf/final.mdl
    --filename-class-frame-counts=./my_model_conf/ali_train_pdf.counts
    --filename-fst=./my_model_conf/HCLG.fst
    --splice=17 ★追加
    #1099
    Avatar
    yoshi.shun.kaldi
    Participant

    五月雨で申し訳ありません。
    追加で1点確認させてください。

    >HARKの分離音をSaveWavePCMで出力して学習に使用された場合などは

    こちらの内容についてですが、
    そもそもデフォルトのKaldi+CSJオリジナル音源で音響モデルを作成した場合、
    2SPK-ja.wavのような複数話者が話している音源は認識できないため、
    “HARKの分離音をSaveWavePCMで出力して学習”が必要ということでしょうか。

    再度、”dnn5b_pretrain-dbn_dnn_smbr_i1lats”で作成されたモデルで、
    差し替えて動作させてもやはり想定する認識結果とならず手が詰まっております。
    # また現状のnnet1モデルはCSJオリジナルのクリーンな音源でのみ学習したものです。
    # harkの分離音などの学習はしておりません。
    # 現在の目標としては発話者一人が静音環境下が録音した音源を認識させたいと考えております。

    ● 認識結果(kaldi_out.txt)
    0, 135.0, 
    1, 105.008911, か
    2, 64.972717, 
    3, 40.01096, か
    5, -35.024876, 
    4, 45.0, 
    11, 120.000725, 
    10, 94.992081, 
    6, 45.0, 
    7, -35.024876, 
    9, -35.024876, 
    8, 49.98904, 

    差分としては必要最低限に抑え、
    以下の変更で実施いたしました。

    ● online.conf (online_chain.confと差し替えました)
    --port-mfcnet=5530
    --port-result=10500
    --filename-words=./my_model_conf/words.txt
    --filename-align-lexicon=./my_model_conf/align_lexicon.int
    --max-active=2000
    --filename-feature-transform=./my_model_conf/final.feature_transform
    --filename-nnet=./my_model_conf/final.nnet
    --filename-mdl=./my_model_conf/final.mdl
    --filename-class-frame-counts=./my_model_conf/ali_train_pdf.counts
    --filename-fst=./my_model_conf/HCLG.fst
    --splice=17
    
    ● MFCCExtraction (MSLSExtractionと差し替えました)
    ・FBANK_COUNT = FBANK_COUNT ★ MSLSExtractionと同様の値。
    ・NUM_CEPS = 12→40 ★40に変更。
    ・LIFTERING_COEF = 22
    ・USE_POWER = false

    お忙しいところ大変申し訳ありませんが、
    ご回答いただけると幸いでございます。

    #1100
    Avatar
    Danilo Onishi
    Participant

    前の投稿で誤解を招いてしまい、申し訳ございませんでした。

    現状は特徴量を40次元に設定して処理が通るようになりましたが、fMLLR法を用いた音響モデルですとミスマッチがあり、認識性能が出ません。

    Kaldi本家のレシピのままですとfMLLR(話者適応処理)を使用しますが、その手法はオンライン処理に向いていないためkaldidecoderは対応しておりません。恐れ入りますが、HARK+kaldidecoderを使用する場合はfMLLRを使わず、MFCC/MSLSそのもので音響モデルを学習する必要があります。

    また、HARKのMFCCとKaldiのMFCCが若干異なりますので、HARKのSaveHTKFeatureノードで出力した特徴量を用いて音響モデルを学習した方が条件としてマッチすることになります。

    以上、宜しくお願い申し上げます。

    #1101
    Avatar
    yoshi.shun.kaldi
    Participant

    迅速なご回答をありがとうございます。大変助かります。
    以下、インラインにて失礼いたします。

    >現状は特徴量を40次元に設定して処理が通るようになりましたが、
    >fMLLR法を用いた音響モデルですとミスマッチがあり、認識性能が出ません。

    クラッシュは防げるものの認識できない旨承知いたしました。

    >Kaldi本家のレシピのままですとfMLLR(話者適応処理)を使用しますが、
    >その手法はオンライン処理に向いていないためkaldidecoderは対応しておりません。

    fMLLR法の場合、オンライン処理に向いていないとありますが、
    オフライン処理の場合は認識させることはできるのでしょうか。

    私自身の直近で実施したいことといたしましては、
    マイク経由ではなく事前に用意した「こんにちは」などの
    “発話者一人が静音環境下が録音した音源”を認識させたいと考えております。

    理由といたしましては、
    OSSのjuliusやサードパーティ製の音声認識エンジンと認識精度を比較する目的で、
    既に用意してある音声ファイルを使用したいと考えておりご質問させていただいている次第です。

    >恐れ入りますが、HARK+kaldidecoderを使用する場合はfMLLRを使わず、
    >MFCC/MSLSそのもので音響モデルを学習する必要があります。

    もし、上記に記載させていただいたオフラインによる認識ができない場合は、
    私自身でHARK+KaldiDecoderに対応する音響モデルの作成をしたいと思います。
    # その場合も事前に用意した音声を認識させるようにしたいです。

    例えば、nnet1モデルでも以下の手順で行えるものなのでしょうか。

    KaldiとHARKそれぞれでどのようなデータが必要でどのような手順が
    必要なのかあまり理解できておらずご教示いただけると幸いです。

    音響モデルの作成について

    >また、HARKのMFCCとKaldiのMFCCが若干異なりますので、
    >HARKのSaveHTKFeatureノードで出力した特徴量を用いて
    >音響モデルを学習した方が条件としてマッチすることになります。

    MFCCあるいはMSLSと2つの方法で音響モデルを作成かと存じますが、
    私のような初心者が行う場合はどちらが比較的容易に行えますでしょうか。

    以上です。
    引き続き、何卒よろしくお願いいたします。

    #1102
    Avatar
    Danilo Onishi
    Participant

    > fMLLR法の場合、オンライン処理に向いていないとありますが、
    > オフライン処理の場合は認識させることはできるのでしょうか。

    > 私自身の直近で実施したいことといたしましては、
    > マイク経由ではなく事前に用意した「こんにちは」などの
    > “発話者一人が静音環境下が録音した音源”を認識させたいと考えております。
    目的に関して、かしこまりました。オフライン処理の場合、そしてマイクアレイを使用しない場合でしたら、HARK自体は不要になり、Kaldiの特徴量作成とオフラインデコードツール(steps/make_mfcc.shとsteps/nnet/decode.sh)のみで出来ます。その手順に関してはKaldiのCSJレシピをご参照ください。

    > KaldiとHARKそれぞれでどのようなデータが必要でどのような手順が
    > 必要なのかあまり理解できておらずご教示いただけると幸いです。
    HARK特徴量に対応した音響モデルの作成ですが、下記投稿の通り、HARKで保存したMFCCまたはMSLS特徴量をfeats.scpファイルに列挙し、copy-feats --htk-inコマンドを使用して頂ければKaldiアーカイブに変換されたデータを通常のレシピに使用出来ます。

    音響モデルの作成について

    大変恐縮ですが、HARKは商品ではなくオープンソースプロジェクトのため、HARKに対応したKaldi音響モデル作成に関してのサポートは出来かねます。ご了承ください。

    > MFCCあるいはMSLSと2つの方法で音響モデルを作成かと存じますが、
    > 私のような初心者が行う場合はどちらが比較的容易に行えますでしょうか。
    MFCCとMSLSは特徴量作成に用いる手法で、ファイルの扱いは同じですが後者の方が若干性能的に良いためサンプル音響モデルに使用しております。またMSLSはKaldiのfbankに近い処理を行います。

    以上、よろしくお願い申し上げます。

    #1103
    Avatar
    yoshi.shun.kaldi
    Participant

    お忙しいところご回答いただきありがとうございました。

    >目的に関して、かしこまりました。
    >オフライン処理の場合、そしてマイクアレイを使用しない場合でしたら、
    >HARK自体は不要になり、Kaldiの特徴量作成とオフラインデコードツール
    >(steps/make_mfcc.shとsteps/nnet/decode.sh)のみで出来ます。
    >その手順に関してはKaldiのCSJレシピをご参照ください。

    ご教示いただきありがとうございます。
    マイクアレイを使わないかつオフライン処理の場合は、
    HARKではなくKaldiのツールで行える旨承知いたしました。

    確認し試してみたいと思います。

    >HARK特徴量に対応した音響モデルの作成ですが、
    >下記投稿の通り、HARKで保存したMFCCまたはMSLS特徴量をfeats.scpファイルに列挙し、
    >copy-feats –htk-inコマンドを使用して頂ければ
    >Kaldiアーカイブに変換されたデータを通常のレシピに使用出来ます。
    >大変恐縮ですが、HARKは商品ではなくオープンソースプロジェクトのため、
    >HARKに対応したKaldi音響モデル作成に関してのサポートは出来かねます。ご了承ください。

    上記旨承知いたしました。
    今後は、マイクアレイによる認識も考えているため今後の参考にさせていただきます。

    >MFCCとMSLSは特徴量作成に用いる手法で、
    >ファイルの扱いは同じですが後者の方が若干性能的に良いため
    >サンプル音響モデルに使用しております。
    >またMSLSはKaldiのfbankに近い処理を行います。

    MSLSはfbankに近い処理を行うとのこと承知いたしました。

    この度はご多忙に関わらずご回答いただき誠にありがとうございました。
    引き続き、HARKおよびKaldiについて学んでいきたいと考えております。
    今後またお力添えいただくこともあるかと存じますが、
    その際は何卒よろしくお願いいたします。

    以上です。今後ともよろしくお願いいたします。

Viewing 11 posts - 1 through 11 (of 11 total)

You must be logged in to reply to this topic.