kaldi
前回の続き。論文とセットで見ていく。パラメータ更新の過程でやっていることは「Natural Gradient for Stochastic Gradient Descent (NG-SGD)」と名前が付いている。用語のおさらい。 「Stochastic Gradient Descent」(確率的勾配降下法)は、シャッフルし…
プログラム内で扱うデータの桁数に関するメモ。デフォルトでコンパイルすると「float」型になる。 kaldi/configure at master · kaldi-asr/kaldi · GitHub configure抜粋 # Default configuration double_precision=false (snip) if $double_precision; then…
「AffineComponentPreconditionedOnline」コンポーネントのパラメータ更新過程を追ってみる。モデルは「nnet4c」ベース、mixupを行う前の状態。 今回、確認するのは下図の破線部分のパラメータ。 BackPropagationにおいて、以下2つの値を使って更新する。 尚…
前回の続き。mixup後に生成した12個のモデル(14.mdl〜25.mdl)から「final.mdl」を生成する過程を追ってみる。 nnet2では、結果が良かったモデルを1つだけ選ぶのではなく、スケールを掛けた上で足し合わせている。生成は、「nnet2bin/nnet-combine-fast」コ…
decodeの過程を掘り下げてみる。アライメントで出力される数値(インプットであるMFCC特徴量の各フレームに1対1で紐付けられる)は何を示しているか。今回は、デコードシェル(egs/wsj/s5/steps/decode.sh)の内部でコールしているlattice生成コマンドのアウ…
認識対象を孤立単語から発展させて、もう少し実用的な使い方を試してみる。まず、トレーニング対象の発話を音素に分解する。 元の文 オススメの料理は何ですか 文を単語へ分解(分かち書き、「MeCab」を使用) オススメ の 料理 は 何 です か 単語を音素列…
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 for Dummies tutorial」では、トライフォンの初期学習までであった。 TRI1 - simple triphone training (first triphone pass). この後の処理を確認してみる。「egs/rm/s5/RESULTS」には各実装(experiments)でのWERが出力されており、いくつ…
自前で用意した音声データを認識させる手順はKaldi for Dummies tutorialに説明されている。"for Dummies"("サルでも分かる")という位だから、「yes/no」サンプル(前回の記事)の次に試すのはこれがいいのだろう。流れを大まかに書き出してみると以下のとお…
Kaldiは、Bashスクリプトで実行するコマンドをコントロールしている。 今回はスクリプトについて確認してみる。GitHubからダウンロードした一式のディレクトリ構成については以下のとおり。 egs (今回の確認対象) src (ソースコード) misc (論文など?未確認…
前回の続き。 Backpropagation(誤差逆伝播法)によるパラメータ更新の流れを追ってみる。Softmaxの出力結果(確率)が以下のとおりであったとする(正解となるpdf-classのみ記載)。 小数点第6位切り捨て確率の逆数にweightを掛けたものを求める(今回、wei…
活性化関数に関するメモ。公式サイトの隠れ層に関する説明には、"tanh"(双曲線正接関数)と"p-norm"が登場する。この”p-norm”というのは、論文によると活性化関数"maxout"からヒントを得た独自版らしい。「egs/rm/s5/local/run_nnet2.sh」のコメントにも書…
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>…
Dan氏による実装版(nnet2)の中身を見てみる。公式ドキュメントの説明によると、インプットとなる特徴量(MFCC)に対して、次の変換を行うとある。 Dan氏の論文でいうところの、baseline/Type I featuresにあたるようだ。 splice LDA(linear discriminant Analy…
音声データは、時系列で見た変化量も特徴となりえる。デルタ特徴量の追加は「featbin/add-deltas」コマンドを使う。元々の特徴量(MFCC)が13次元だとすると、出力結果は、deltat特徴量13次元、delta-delta特徴量13次元を加えて、39次元になる。 delta特徴量(…
学習の過程をトレースしてみる。スクリプト「steps/nnet/train.sh」を実行すると、内部で「steps/nnet/train_scheduler.sh」をコールし、「nnetbin/nnet-train-frmshuff」を実行する。今回、"もしもし"という発話(198フレーム)の音声ファイルを3つ用意し、…
入力層の構成を掘り下げてみる。特徴量(MFCC)に対して変換を実行したもので、仮にMFCCが13次元、198フレームだとすると、変換後は143次元、198フレームになる(spliceは「5」を想定、詳細は前回を参照)。 splice5.proto <Splice> <InputDim> 13 <OutputDim> 143 <BuildVector> -5:5 </BuildVector>続けて、spliceし</outputdim></inputdim></splice>…
事前学習の流れを追ってみる。インプットとなる音声は連続値であるから、GB(Gaussian-Bernoulli)型の制限付きボルツマンマシン(RBM)を使う。 可視層(visible):Gaussian、連続値をとる 隠れ層(hidden):Bernoulli、離散値をとる nnet(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 \ …
Deep Neural Network Featuresを使ったdecodeを試してみる。 公式サイトKaldi: Deep Neural Networks in Kaldiによると3種類あるらしい。 nnet(Karel氏による) nnet2(Dan氏による) nnet3(Dan氏による) 今回はKarel氏によるバージョンを試してみる。 結…
モノフォンのモデルをもとに、トライフォンのモデルを作成する。まずは、統計量を作成。 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)」続けて、…
前回の続き。学習用グラフを作成したら、アライメントを作成する。 初期モデルに対しては「bin/align-equal-compiled」コマンドを使用する。 bin/align-equal-compiled ark:fsts.0 ark:mosimosi.ark ark:equal.align.0均等分割アライメントの出力結果は以下…
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で使うモデルを作成してみる。ターゲットは、「もしもし」という発話。流れとしては、下図4つのモデルを作って合成する。 合成は以下の順番。 L ○ G ↓ C ○ (L ○ G) ↓ H ○ (C ○ (L ○ G))まず、Grammar。これはARPAファイルから生成する。 src/lmbin/arpa…
Kaldiで実際に音声を認識させてみる。以下のサイトを参考にさせていただいた。 Kaldi - Training 1Kaldiに関する処理を日本語のドキュメントでまとめてみた(デコーディング編)6 - Qiita 使ったのは"もしもし"という発話データ(frame数198)。 実行コマン…
音声認識Tool Kit「Kaldi」を試してみる。今回は特徴量抽出。 音声データはHTKのHCopyで試した時と同じものを使用。Kaldi公式サイトには次の記述があり、全く同じにはならないよう。 With the option –htk-compat=true, and setting parameters correctly, i…