ichou1のブログ

主に音声認識、時々、データ分析のことを書く

kaldi

音声認識メモ(Kaldi)その26(パラメータ更新、NG-SGD Dan's DNN(nnet2))

前回の続き。論文とセットで見ていく。パラメータ更新の過程でやっていることは「Natural Gradient for Stochastic Gradient Descent (NG-SGD)」と名前が付いている。用語のおさらい。 「Stochastic Gradient Descent」(確率的勾配降下法)は、シャッフルし…

音声認識メモ(Kaldi)その25(内部で扱うデータの型)

プログラム内で扱うデータの桁数に関するメモ。デフォルトでコンパイルすると「float」型になる。 kaldi/configure at master · kaldi-asr/kaldi · GitHub configure抜粋 # Default configuration double_precision=false (snip) if $double_precision; then…

音声認識メモ(Kaldi)その24( パラメータ更新 Dan's DNN(nnet2))

「AffineComponentPreconditionedOnline」コンポーネントのパラメータ更新過程を追ってみる。モデルは「nnet4c」ベース、mixupを行う前の状態。 今回、確認するのは下図の破線部分のパラメータ。 BackPropagationにおいて、以下2つの値を使って更新する。 尚…

音声認識メモ(Kaldi)その23(トレーニング時のモデル更新 Dan's DNN(nnet2))

前回の続き。mixup後に生成した12個のモデル(14.mdl〜25.mdl)から「final.mdl」を生成する過程を追ってみる。 nnet2では、結果が良かったモデルを1つだけ選ぶのではなく、スケールを掛けた上で足し合わせている。生成は、「nnet2bin/nnet-combine-fast」コ…

音声認識メモ(Kaldi)その22(アライメント)

decodeの過程を掘り下げてみる。アライメントで出力される数値(インプットであるMFCC特徴量の各フレームに1対1で紐付けられる)は何を示しているか。今回は、デコードシェル(egs/wsj/s5/steps/decode.sh)の内部でコールしているlattice生成コマンドのアウ…

音声認識メモ(Kaldi)その21(音韻モデル)

認識対象を孤立単語から発展させて、もう少し実用的な使い方を試してみる。まず、トレーニング対象の発話を音素に分解する。 元の文 オススメの料理は何ですか 文を単語へ分解(分かち書き、「MeCab」を使用) オススメ の 料理 は 何 です か 単語を音素列…

音声認識メモ(Kaldi)その20(トレーニング Dan's DNN(nnet2))

nnet2での学習の流れを追ってみる。今回は、活性化関数に「tanh」を使った「nnet4c」を対象とした。 ${KALDI_ROOT}/egs/rm/s5/local/nnet2/run_4c.sh # for CPU only (with --use-gpu false). steps/nnet2/train_tanh_fast.sh \ --stage -10 \ --minibatch-s…

音声認識メモ(Kaldi)その19(Toolkitスクリプト(3))

前回の「Kaldi for Dummies tutorial」では、トライフォンの初期学習までであった。 TRI1 - simple triphone training (first triphone pass). この後の処理を確認してみる。「egs/rm/s5/RESULTS」には各実装(experiments)でのWERが出力されており、いくつ…

音声認識メモ(Kaldi)その18(Toolkitスクリプト(2))

自前で用意した音声データを認識させる手順はKaldi for Dummies tutorialに説明されている。"for Dummies"("サルでも分かる")という位だから、「yes/no」サンプル(前回の記事)の次に試すのはこれがいいのだろう。流れを大まかに書き出してみると以下のとお…

音声認識メモ(Kaldi)その17(Toolkitスクリプト)

Kaldiは、Bashスクリプトで実行するコマンドをコントロールしている。 今回はスクリプトについて確認してみる。GitHubからダウンロードした一式のディレクトリ構成については以下のとおり。 egs (今回の確認対象) src (ソースコード) misc (論文など?未確認…

音声認識メモ(Kaldi)その16(Backpropagation Dan's DNN(nnet2))

前回の続き。 Backpropagation(誤差逆伝播法)によるパラメータ更新の流れを追ってみる。Softmaxの出力結果(確率)が以下のとおりであったとする(正解となるpdf-classのみ記載)。 小数点第6位切り捨て確率の逆数にweightを掛けたものを求める(今回、wei…

音声認識メモ(Kaldi)その15(活性化関数 Dan's DNN(nnet2))

活性化関数に関するメモ。公式サイトの隠れ層に関する説明には、"tanh"(双曲線正接関数)と"p-norm"が登場する。この”p-norm”というのは、論文によると活性化関数"maxout"からヒントを得た独自版らしい。「egs/rm/s5/local/run_nnet2.sh」のコメントにも書…

音声認識メモ(Kaldi)その14(特徴量変換 Dan's DNN(nnet2))

LDA変換用パラメータは教師データの統計をもとに作成する。 統計データ作成には「bin/acc-lda」コマンドを使う。 「bin/acc-lda」コマンド Accumulate LDA statistics based on pdf-ids. Usage: acc-lda [options] <transition-gmm/model> <features-rspecifier> <posteriors-rspecifier> <lda-acc-out>インプットは以下のとおり。 モデル(GM</lda-acc-out></posteriors-rspecifier></features-rspecifier></transition-gmm/model>…

音声認識メモ(Kaldi)その13(特徴量変換 Dan's DNN(nnet2))

Dan氏による実装版(nnet2)の中身を見てみる。公式ドキュメントの説明によると、インプットとなる特徴量(MFCC)に対して、次の変換を行うとある。 Dan氏の論文でいうところの、baseline/Type I featuresにあたるようだ。 splice LDA(linear discriminant Analy…

音声認識メモ(Kaldi)その12(delta特徴量)

音声データは、時系列で見た変化量も特徴となりえる。デルタ特徴量の追加は「featbin/add-deltas」コマンドを使う。元々の特徴量(MFCC)が13次元だとすると、出力結果は、deltat特徴量13次元、delta-delta特徴量13次元を加えて、39次元になる。 delta特徴量(…

音声認識メモ(Kaldi)その11(学習率 Karel's DNN)

学習の過程をトレースしてみる。スクリプト「steps/nnet/train.sh」を実行すると、内部で「steps/nnet/train_scheduler.sh」をコールし、「nnetbin/nnet-train-frmshuff」を実行する。今回、"もしもし"という発話(198フレーム)の音声ファイルを3つ用意し、…

音声認識メモ(Kaldi)その10(入力層 Karel's DNN)

入力層の構成を掘り下げてみる。特徴量(MFCC)に対して変換を実行したもので、仮にMFCCが13次元、198フレームだとすると、変換後は143次元、198フレームになる(spliceは「5」を想定、詳細は前回を参照)。 splice5.proto <Splice> <InputDim> 13 <OutputDim> 143 <BuildVector> -5:5 </BuildVector>続けて、spliceし</outputdim></inputdim></splice>…

音声認識メモ(Kaldi)その9(pre-training Karel's DNN)

事前学習の流れを追ってみる。インプットとなる音声は連続値であるから、GB(Gaussian-Bernoulli)型の制限付きボルツマンマシン(RBM)を使う。 可視層(visible):Gaussian、連続値をとる 隠れ層(hidden):Bernoulli、離散値をとる nnet(Karel's DNN)では、…

音声認識メモ(Kaldi)その8(training Karel's DNN)

DNNモデルの学習過程をトレースしてみる。学習には「nnetbin/nnet-train-frmshuff」コマンドを使う。 nnetbin/nnet-train-frmshuff \ --minibatch-size=128 \ --randomize=false \ scp:train/feats.scp \ <--inputとなる特徴量 ark:mosimosi_ali2post.ark \ …

音声認識メモ(Kaldi)その7(decode with Karel's DNN)

Deep Neural Network Featuresを使ったdecodeを試してみる。 公式サイトKaldi: Deep Neural Networks in Kaldiによると3種類あるらしい。 nnet(Karel氏による) nnet2(Dan氏による) nnet3(Dan氏による) 今回はKarel氏によるバージョンを試してみる。 結…

音声認識メモ(Kaldi)その6(学習 その3)

モノフォンのモデルをもとに、トライフォンのモデルを作成する。まずは、統計量を作成。 bin/acc-tree-stats --ci-phones=1:2:3:4:5:6:7:8:9:10 2.mdl ark:mosimosi.ark ark:1.ali treeaccphone index 1〜5は「sil」、6〜10は「spn(spoken noise)」続けて、…

音声認識メモ(Kaldi)その5(学習 その2)

前回の続き。学習用グラフを作成したら、アライメントを作成する。 初期モデルに対しては「bin/align-equal-compiled」コマンドを使用する。 bin/align-equal-compiled ark:fsts.0 ark:mosimosi.ark ark:equal.align.0均等分割アライメントの出力結果は以下…

音声認識メモ(Kaldi)その4(学習 その1)

Kaldiにおけるモデルの学習過程を追ってみる。モデルを更新するにあたっては「gmmbin/gmm-est」コマンドを使う。 Do Maximum Likelihood re-estimation of GMM-based acoustic model Usage: gmm-est [options] <model-in> <stats-in> <model-out> e.g.: gmm-est 1.mdl 1.acc 2.mdl学習の際の</model-out></stats-in></model-in>…

音声認識メモ(Kaldi)その3(WFST)

Kaldiで使うモデルを作成してみる。ターゲットは、「もしもし」という発話。流れとしては、下図4つのモデルを作って合成する。 合成は以下の順番。 L ○ G ↓ C ○ (L ○ G) ↓ H ○ (C ○ (L ○ G))まず、Grammar。これはARPAファイルから生成する。 src/lmbin/arpa…

音声認識メモ(Kaldi)その2(decode)

Kaldiで実際に音声を認識させてみる。以下のサイトを参考にさせていただいた。 Kaldi - Training 1Kaldiに関する処理を日本語のドキュメントでまとめてみた(デコーディング編)6 - Qiita 使ったのは"もしもし"という発話データ(frame数198)。 実行コマン…

音声認識メモ(Kaldi)その1(特徴量抽出)

音声認識Tool Kit「Kaldi」を試してみる。今回は特徴量抽出。 音声データはHTKのHCopyで試した時と同じものを使用。Kaldi公式サイトには次の記述があり、全く同じにはならないよう。 With the option –htk-compat=true, and setting parameters correctly, i…