ESPnetというEnd-to-End音声認識のオープンソースについて、Referenceに示す資料を調べので、本記事にまとめます。
レシピのステージ構成
●データセットの前処理
Stage 1: trainセット、validセット、evalセットに対応するデータディレクトリを生成する
local/data.shが呼び出されます。
data/フォルダが作成され、trainセット、validセット、evalセットフォルダの中に、以下のメタファイルが作成される。evalセットはコーパスによっては、複数のフォルダが作成される。
utt2spk:各発話IDに対し、その発話に含まれる話者IDを示す
spk2utt:各話者IDに対し、その話者IDがどの発話に含まれるかを示す
text:各発話IDに対する正解データとなるテキスト
wav.scp:各発話IDに対応する音声ファイルのパス
Stage 2(Optional): 話速変化に基づくデータ拡張を実施するステージ
--speed_purturb_factorsオプションを指定した場合のみ実行されます。
Stage 1で作成されたtrainセットフォルダ内のwav.scpにパイプを使ったsoxコマンドが追記されます。
Stage 3: 特徴量抽出を行う
data/フォルダのメタデータに基づいて、特徴量抽出が行われる。特徴量データはdump/フォルダに出力される。
特徴量のタイプは、--feats_typeオプションに応じて処理が異なる。デフォルトはfeats_type=rawであり、特徴量抽出の代わりにwav.scpの整形のみが行われます。feats_type=raw以外を利用する場合は、Kaldiの特徴量抽出を利用します。この場合、Kaldiのコンパイルが必要となります。
※rawを選択した場合でも、実際にはmel log spectrogramに変換される。
Stage 4: 発話のフィルタリングを行う
学習セットと検証セットの中の最短しきい値以下の発話と最長しきい値以上の長さの発話を取り除きます。最短及び最長しきい値は--min_wav_duration及び--max_wav_durationオプションでそれぞれ指定することができます。
Stage 5: トークンリスト(辞書)を作成する
--token_typeオプションに応じて、利用するトークンのタイプが異なります。ASRではtoken_type=charもしくはtoken_type=bpeが利用可能です。token_type=bpeの場合、SentencePieceによるサブワードへの分割が行われます。
●オプショナル言語モデルの学習
Stage 6(Optional): 言語モデル学習のための統計量を算出する
動的にバッチサイズを変更するための各データのシェイプ情報(系列長及び次元数)を取得します。言語モデルの利用をしない場合、--use_lmオプションをuse_lm=falseにすることでStage 6から8までをスキップすることができます。
Stage 7(Optional): 言語モデルの学習を行う
--lm_config及び--lm_argsオプションに応じて言語モデルの学習を行います。
デフォルトではLSTMを用いたニューラル言語モデルが学習される。conf/フォルダのコンフィグファイルでモデルのパラメータ等を変更可能。
Stage 8(Optional): 学習した言語モデルのパープレキシティ(PPL)を計算する
簡易的に言語モデルの評価を実施します。
Stage 9(Optional): N-gramを計算するステージ
ニューラル言語モデルではなく、N-Gramによる言語モデル
●End-to-Endモデルの学習、推論
Stage 10: ASRモデルの学習のための統計量を算出する
動的にバッチサイズを変更するためのデータのシェイプ情報(系列長及び次元数)と、特徴量の正規化を行うための学習データ全体の統計量(平均及び分散)を計算します。
Stage 11: ASRモデルの学習を行う
--asr_config及び--asr_argsオプションに応じてASRモデルの学習を行います。
exp/フォルダに学習済みモデルやlossの推移等の情報が保存される。
Stage 12: 学習したモデルを利用してデコーディングを行う
--inference_config及び--inference_argsオプションに応じて、学習した言語モデルとASRモデルを用いた推論を行います。
デフォルトでは、CPUを使った推論が行われる。
Stage 13: デコードされた結果の評価を行う
Character Error Rate(CER)及びWord Error Rate(WER)を算出します。
--token_type charを選択した場合、WERは正しく計算されない(SERになる)。
●モデルのアップロード(デフォルトではスキップされる)
Stage 14-15(Optional): 学習済みのモデルのパッキング及びZenodoへのアップロードを行うステージ。
利用するには、Zenodoにユーザー登録を行い、トークンを発行する必要があります。
指定可能なオプション例
・開始、終了ステージの設定
動作確認が取れるまでは、以下のオプションを用いてステージごとに実行するほうが望ましい。
--stage
--stop_stage
・特徴量タイプ(raw or fbank)
デフォルトでは特徴量はraw。fbankにする場合は、kaldiのインストールが必要。
kaldi用にすでに抽出済の特徴量を使用する場合、dumpフォルダに保存しておく。
--feats_type
・トークンタイプ
デフォルトでは文字ベースのトークンになっている。bpeも選択可能
--token_type
・additionalの言語モデルの有無を選択可能
--use_lm true
様々なモデルの学習(Encoder-decoder, Transducer, CTC)
End-to-Endモデルは、Attention-based Encoder Decoder、CTC、RNN-Transduce系のモデルが存在する。
以下に、各タイプのモデルの学習方法を記載する。
Attention-based Encoder Decoder
以下の図にAttention-based Encoder Decoder構造の概要を示す。デフォルトでは、CTC lossとAttention lossの重みづけ和が損失として採用されている。以下のパラメータで変更可能。yamlに記載するか、オプションで指定する。
--ctc_weight
エンコーダ、デコーダブロックには、Conformer, Transformer, LSTMのyamlファイルがデフォルトで用意されている。
CTC
上図におけるエンコーダ部分だけを使用することでCTCモデルの評価が可能。
具体的には、Attention-based Encoder Decoder構造における、yamlファイルにて、Attention lossの重みを0(CTC lossの重みを1)にする。
具体的には、train.yaml, decode.yamlの両方で、ctc_weight=1.0と設定する。
※ただし、モデル自体はオフライン
RNN-Transducer
RNN-Transducerを学習する場合、ESPnet1のyamlファイルに以下を記載する。
デフォルトでは、BLSTMを用いたRNN-Transduceが学習される。
criterion: loss
model-module: "espnet.nets.pytorch_backend.e2e_asr_transducer:E2E"
Reference
ESPnet2で始めるEnd-to-End音声処理
https://kan-bayashi.github.io/asj-espnet2-tutorial/
End-to-End音声処理の概要とESPnet2を用いたその実践
https://www.jstage.jst.go.jp/article/jasj/76/12/76_720/_pdf
ESPnet: end-to-end speech processing toolkit
https://espnet.github.io/espnet/tutorial.html#transducer
ESPnet Hackathon 2019@Tokyo ESPnet概要説明