std::regexのメモ (その1)

C++正規表現を扱う。数字と助数詞を取り出す疑似コード。
input: リンゴ2個とイチゴ3個を買う。
re: std::regex re( R"( (\D*?[^+-]*?)([+-]?\d[\d,]*[\.]?\d*)(個|匹|本)(.*?) )");

 

std::vector<std::string> match(std::string& text, std::regex const& re) {

     std::vector<std::string> result;

     std::smatch m;

 

     std::regex_match(text, m, re);

     for (auto &&elem: m) {

          result.push_back(elem.str());

     }

     return result;

}

 

std::string apply_re(std::string input, std::regex re) {
     while (true) {
          auto result = match(input, re);

          if (result.size() == 0) {
               break;
          } else {
               // result[1]: prefix
               // result[2]: 数字
               // result[3]: 助数詞
               // result[4]: suffix
               input = result[4];
          }
     }
}

'?'を付けることで、最短一致か最長一致かを指定することができる。

Big coreとLittle core

詳細は以下URLを参照:
https://developer.qualcomm.com/blog/impact-big-core-little-core-architecture-application-development

 

big.LITTLEと呼ばれるアーキテクチャは,高性能を追求するbigと省電力性を追求するlittleの2つの種類のコアで構成されている.これらを組み合わせることにより,オペレーティングシステムレベルとアプリケーションレベルの両方で,処理要求と電力効率のバランスをとることが目的.
メーカーによって,big.LITTLEコアの選択を隠蔽しユーザ側が考える必要をなくしていたり,APIによって制御可能なようにしていたりする.IDEによっては,異なるコアでデバッグを簡単に行える.Don't forget that at some point you'll need to optimize and debug your application!

論文メモ_8

Semi-supervised training for improving data efficiency in end-to-end speech synthesis
利用できるデータをできるだけ生かし、Tacotronを学習する試み。1. word embeddingを用いてencoder networkをconditioning。2. decoder networkを、次フレームの出力を予測するよう学習させ、autoregressive modelとして事前学習する。

 

A new GAN based end-to-end TTS training algorithm
Tacotronのexposure biasを改善するための試み。teacher forcingを行った場合とfree running (inference mode) との間でGANを学習する。discriminatorへの入力は、ネットワークの出力系列ではなく、attention networkのhidden states。

 

Disentangling Correlated Speaker and Noise for Speech Synthesis via Data Augmentation and Adversarial Factorization
GMVAE w/ Tacotronを用いた音声合成。雑音および話者に関する情報をdisentangleするため、global condition用のencoderの出力に対し、雑音が重畳されているかどうかを当てるタスクを追加し、adversarial trainingを行う。雑音が重畳されたより収集が容易なデータも学習データとしたい。

 

Speech-to-speech translation between untranscribed unknown languages
テキストデータを用いずに、speech to speech translation。VQ-VAEを用いて離散シンボルを学習。

 

Domain expansion in DNN-based acoustic models for robust speech recognition
DNN-HMM hybrid systemのアクセントを対象とした adaptation (ここではdomain expansion)を行う。過去に提案されているKL divergence baseの正則化項とelastic weight consolidation (EWC)の併用を、他の先行研究と比較。パラメタのL2ノルムをFisher行列の対応する値で重みづけ。

 

Self-attention transducers for end-to-end speech recognition
RNN-TransducerのRNNをself-attentionに入れ替える。また、path-aware regularization (kaldiでalignmentを求め、これをマルチタスクとして使用)、chunk-flow mechanism (attention計算時に使用するencoder側の系列を固定長へと制限)を用いたonline decodingへの対応を行う。

 

A multi-task learning framework for overcoming the catastrophic forgetting in automatic speech recognition
domain adaptationを行う際、適応前ドメインの精度も落とさずに新たなドメインに適応を行う試み。対象はCTC。適応時のロスに、適応前学習データを用いた適応前後のCTCの出力のKL divergenceとCTCのlossを追加し、適応前学習データに対する精度が落ちないようにする。fine-tuningやretrainingよりも早く収束し、性能も同等もしくは良い結果となった。

 

Evaluating Long-form Text-to-Speech: Comparing the Ratings of Sentences and Paragraphs
従来のTTSは、文単位でスコアを求めることが多い。paragraphやdialogレベルでの音声合成では、過去のコンテキストとの関連や一貫性も重要なため、コンテキストを考慮した上でTTSの評価を行う枠組み

 

Exploring methods for the automatic detection of errors in manual transcription
ASRの学習に使用する音声・テキストペア内に含まれる、書き起こし誤りを検出する試み。(kaldiでは、書き起こしを用いてbiased LMを学習し、decoding結果の精度をチェックことで間違った正解ラベルの検出を行う。この文献では、)DNN-HMMで計算した事後確率とforced alignmentをとって計算した確率のsymmetric KL divergenceの標準偏差を発話単位で計算し、これを閾値として誤りを検出する。ただ、EERは、biased LM-baseの手法と同等。

論文メモ_7

Improving performance of end-to-end ASR on numeric sequences
数字列を発声した際、システムはそれを文字ではなく数字で表示してほしい。数字へと精度よく変換するための手法の提案。書き起こしに対してtrivialかnon-trivialかをタグ付けし、non-trivialな部分は別途モデル (FST|NN) へ入力し変換を行う。

 

Discriminative learning for monaural speech separation using deep embedding features
end-to-endにspeech separationをする。deep clusteringとuPITを組み合わせ、すべてをend-to-endで学習。まずDCでembedded featureを求め、これをuPIT側へ入力。(discriminative learning of uPIT: 選択したpermutationの候補以外の組み合わせで計算したロスにマイナスをかけ、それをDCとuPITにロスに足しこむ。)

 

Fast DNN acoustic model speaker adaptation by learning hidden unit contribution features
従来のLHUCは、適応データを準備してLHUCのパラメタをbackpropで学習する。backprop無しでデータ量の増加に応じてonline adaptationできるように、averaging layerを持つLHUC prediction networkを用意し、この出力に応じてadaptationを行う。

 

Unsupervised adaptation with adversarial dropout regularization for robust speech recognition
adversarial dropout regularizationを用いた音響モデルの話者適応。モデルはDNN-HMM hybrid systemで、framewise posteriorを対象としてる。

 

Exploiting semi-supervised training through a dropout regularization in end-to-end speech recognition
dropoutを用いてラベルを作成し、semi supervised trainingを行う。decoding scoreやエントロピーを用いて生成したラベルrの信頼度を計算し、適応データとして使用するかどうか決める。

 

Sequence-to-sequence learning via attention transfer for incremental speech recognition
Incremental speech recognitionの学習手法。attention matrixからknowledge distillation。

 

Group latent embedding for vector quantized variational autoencoder in non-parallel voice conversion
VQ-VAEを用いた音声変換。辞書をsub-groupに分割し選択したsubgroupの重み付き和を潜在変数に。

スマホで音声認識

[1] で開発されているプロジェクトのコードを読み、動かす。kaldiOpenFSTをarmv7でコンパイルし、aarを作成している。コア部分はC++ (kaldi)、front end interfaceはJavaJava側からswigC++を呼び出している。予めHCLとGをcomposeせず、on-the-fly decoding。実機で動かすと、性能は落ちるが予想以上にlatencyが低く、いい感じ。

[1] https://github.com/alphacep/kaldi-android

Kaldiをwindows上でコンパイルする

Compile Kaldi on Windows
参考URL: https://github.com/kaldi-asr/kaldi/blob/master/windows/INSTALL.md

1. OpenFSTコンパイル
以下のプロジェクトをクローンし、slnをvisual studioでビルドする。
https://github.com/kkm000/openfst.git

2. Kaldiコンパイル
2.1 OpenBLASのダウンロード
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/mingw64_dll.zip
(kaldi)/tools$ unzip OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ unzip mingw64_dll.zip

(kaldi)/windows$ cp variables.props.dev variables.props
variables.propsを編集 (OPENBLASDIR, OPENFST, OPENFSTLIB)

(kaldi)/windows$ cp kaldiwin_openblas.props kaldiwin.props

(kaldi)/windows$ perl generate_solution.pl --vsver vs2017 --enable-openblas

fst.libが見つからないと言われるので、(kaldi)/windows/openfstwin_release.propsのfst.libをlibfst.libに変更する。また、AdditionalLibraryDirectoriesを適切に変更し、libfst.libを参照できるようにする。

---
管理者権限でcmdを立ち上げ
1. windows key + r
2. type 'cmd'
3. ctrl + shift + enter

Visual Studio+Cygwinコマンドライン開発環境の構築
https://qiita.com/mkaminaga/items/7e15dd3ca385780b31b5

---

論文メモ_6

Synchronous Bidirectional Neural Machine Translation
NMTでforwad pass decoderとbackward pass decoderの情報を統合する試み。ビームサーチレベルでleft-to-rightとright-to-leftの仮説を保持し、pruning後に生き残った両方向の仮説のstateを、それぞれの方向のdecoderが受け取るようなネットワーク構造を提案。

 

Knowledge Distillation for Small-Footprint Highway Networks
Hybrid DNN-HMMのDNN (highway networks) をknowledge distillationした研究。

 

Predicting expressive speaking style from text in end-to-end speech synthesis
Global Style Tokensを用いて、multi-speaker multi-speaking styleのTTSを行う試み。style tokenの重み付き和をtextから予測し、これを用いてglobal conditioningを行う。

 

Multilingual ASR with massive data augmentation
Hybrid ASR systemを作成する際、音響モデル・言語モデルともにmultilingual dataを用いて言語非依存なモデルを学習する(end-to-endでは、monolithic neural network architectureでmulti lingual ASRを学習する研究が既に報告されている)。その際、low resourceを仮定し、speed perturbationやspecAugmentなどのdata augmentation を行う。hybrid systemの場合でも、言語依存の場合と比較して性能改善。(大規模データでどうなる?)

 

Large-Scale Multilingual Speech Recognitionwith a Streaming End-to-End Model
RNN-Tを用いてmultilingual ASRを行う試み。1) language vectorの入力 2) data sampling 3) adapterを用いて言語依存化 を行った。言語セットが類似している場合、言語情報を入力することは有効。

 

Probing the information encoded in x-vectors
(i-vectorおよび)x-vectorに話者以外の情報 (チャネルやテキスト情報、雑音情報) が含まれているか、調査を行う。

 

VAE-Based Regularization for Deep Speaker Embedding
(後段のPLDAとの相性を考え)VAEを用いてx-vectorをGaussianに。また、speaker cohesive lossを提案:話者sの平均x-vectorを$s(x)$、話者sサンプルiのx-vectorを$\mu(x)$としたとき、$\ln p(\mu(x)|\s(x))$を新たにロスとして追加。同一話者のlatent representationをより近くへ。

 

An Online Attention-Based Model for Speech Recognition
attention networkが取りうるencoder representationを制限するための手法を提案。考慮する領域をneural baseで決定することが、先行研究との違い (adaptive monotonic chunk-wise attention: AMoChA)。取りうるattentionの領域を学習するための教師データとしては、searchの情報やHMMのアライメント情報を用いる。encoder networkはlatency controlled bidirectional LSTM。

 

Lattice Generation in Attention-Based Speech Recognition Models
encode decoder networks でlatticeを生成する試み。(TODO) コードが公開されている。あまり理解できなかったので、公開されているコードを読む。

 

Trainable dynamic subsampling for end-to-end speech recognition
音声はencoder側のtime stepが大きくなりがちなので、subsamplingが行われる。従来は手動で決定していたsamplingを行うタイミングを学習することで、フレームの重要度に応じてdata drivenに取捨選択させようとする試み。hidden vectorを入力としてMLPを学習し、hardに決定する。

 

Speaker adaptation for attention based end-to-end speech recognition
attention-based encoder decoder networksを話者適応する試み。1) KL divergenceを用いた正則化項の追加 2) adversarial training (話者) の追加 3) 異なるlabel unitを用いたmulti task learningを行う。発話数は100 or 200発話で、すべてのパラメタもしくはencoder networkのみを更新。