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のみを更新。

論文メモ_5

AI and Accessibility: A Discussion of Ethical Considerations
1. システムの包括性:誰に向けたシステムか。多様なdiversityをカバーできているか。
2. バイアス:性別や人種に対する偏見、障害に基づく差別を促さないか。SNSのようなサービスから、知られたくない個性や状態が推測できる可能性がある。
3. プライバシー:システム学習のために協力者がデータを提供する際、データを完全に匿名化できるとは限らない。
4. エラー:エラーはつきもの。overconfidence/underconfidenceを減らすために、どのように結果を提示すべきか。
5. ExpectationSetting:特定のタスクでうまくいっただけなのに、さもそれが現実世界でも動作するような誇張は無くすべき。
6. どのようにsimulated dataを作ればいい?
7. 新しい技術に対する需要性:プライバシーや公平性など、技術を利用することで生じる、間接的な利害関係者への影響はどうか, eg., google glass

 

Two-Pass End-to-End Speech Recognition
mobile deviceのような低リソース計算機下で、認識性能を上げるための試み。RNN-Tでstreaming ASRを行い、その結果を用いてattention decoderで2nd pass decodingを行う。encoder networkを共有し、RNN-Tの値を用いてMinimum WER基準でdecoder networkを学習。

 

Twin Regularization for online speech recognition
Unidirectional LSTMをencoder networkとして使用するオンラインシナリオで、認識を上げるための試み。forwardで求めたhidden statesとbackwardで求めたhidden statesのMSEをロスとして追加。

 

Compression of End-to-End Models
end-to-end ASRをモバイル端末で動かすため、以下の手法を検討。sequence level knowledge distillation、matrix factorization、weight pruning。

 

Multilingual Adaptation of RNN based ASR Systems
言語特徴量を補助情報として使用して、multilingual ASRの性能を上げる試み。
音声に対して言語ラベルを予測するネットワークを学習し、そのbottleneck featureを1) 補助情報として使用 2) LSTMの出力に掛け合わせる の2通りを比較、実験。

 

Learning Problem-agnostic Speech Representations from Multiple Self-supervised Tasks
様々な音声関連のタスクで有用な特徴量を抽出する試み。目的関数はシンプルで、音声波形を入力し、Log power spectrumやMFCC、prosodyを出力するように学習。frame単位のmappingだけでなく、globalな情報も目的関数として組み込んだり、与えられたサンプルが当該フレームより前にあるか後にあるかを当てるタスクも組み込んだりする。

 

Non-Parallel Sequence-to-Sequence Voice Conversion with Disentangled Linguistic and Speaker Representation

 

VAE-based Domain Adaptation for Speaker Verification
out-of-domainな環境でも頑健にspeaker verificationを行うための適応手法に関する研究。x-vectorを学習後、それを対象としてVAEを学習。得られたlatent representationを用いてPLDA。VAEやPLDAを適応。

 

Uncertainty weighting and propagation in DNN-HMM based speech recognition
DNN-HMM hybrid ASR systemにuncertainty weightingを適用。senoneの事後確率の分散を求め、これが閾値よりも大きければあまり信頼できないとし、それに応じて事後確率に重みをかける。

 

A study of speaker adaptation for DNN-based speech synthesis
DNNベースのTTS systemを話者適応する試み。i-vectorの入力およびLHUCを用いたパラメタ更新を行う。

 

Adaptation of an Expressive Single Speaker Deep Neural Network Speech Synthesis System
DNNベースのTTS systemを話者適応する試み。hidden unitの数を学習後に新たに増やし、これを学習。

 

Speaker adaptation in DNN-based speech synthesis using d-vectors
DNNベースのTTS systemを話者適応する試み。d-vectorを補助情報として使用する際、1) そのまま使用 2) 既知話者のd-vectorの線形補間として表現 3) 二つの併用 などを比較。

 

Linear Networks based Speaker Adaptation for Speech Synthesis
DNNベースのTTS systemを話者適応する試み。新たに層を追加したりSVDで行列分解を行い、少量パラメタのみを更新。

論文メモ_4

Adversarial Attacks Against Automatic Speech Recognition System via Psychoacoustic Hiding
Hybrid DNN-HMM systemを対象としたadversarial attack。exampleを生成する際、mp3圧縮を参考に取りうる値に制約を置くことで、imperceptibleに。任意の単語系列にご認識させられる。コード、サンプルともに公開されていた。

 

Encrypted Speech Recognition using Deep Polynomial Networks
server側でASRを行う際、client側で音響特徴量を暗号化し、server側ではそれに対してhomomorphic encryptionをかけたままposterior probabilityを計算する。client側はそれを受けとって解読し、最終的なsearchを行う。How to prune in encrypted domain and hide this information is still an open problem.

 

Improved Speech Separation with Time-and-Frequency Cross-domain Joint Embedding and Clustering
mixture signalに対してmaskをかけてspeech separationを行う際、time and frequency domain features両方を考慮させる。そのため、入力信号にSFTFをかけた後の出力とCNNをかけた後の出力 (CNN encoded features) 両方を対象に、それぞれmaskの推定や信号の生成を行う。maskを計算する際に1d convをかけ、両方をミックス。

 

Speech Model Pre-training for End-to-End Spoken Language Understanding
Spoken language understanding のためのデータ (Fluent Speech Command) およびコードを作成。# hours (train): 14.7, # spk (train): 77。

 

Few Shot Speaker Recognition using Deep Neural Networks
capsle networkを用いて、few shot speaker recognition (~3seconds)。

 

Triplet Network with Attention for Speaker Diarization
speaker diarization taskでself attentionを用いる。triplet lossを用いて、異なる話者との間のembedding space上での距離(L2)が一定以上となるよう学習。評価基準はdiarization error rate[1]。
[1] pyannote.metrics: a toolkit for reproducible evaluation,diagnostic, and error analysis of speaker diarization systems

 

Discriminative Learning for Monaural Speech Separation Using Deep Embedding Features

論文メモ_3

End-to-End Multi-Speaker Speech Recognition using Speaker Embeddingsand Transfer Learning
"VoiceFilter: Targeted Voice Separation by Speaker-Conditioned Spectrogram Masking"と似たアイディア。single speakerでモデルを事前学習。

 

Self-supervised Attention Model for WeaklyLabeled Audio Event Classification
audio event classification taskで、正確な時間情報を含むラベル情報 (strong labels) がある場合、当該時刻の当該クラスにかかるattentionが高くなるように、lossを追加。strong labelsがない場合も、self-supervisedで学習できる。(TTS分野でも[1]のようにattention自体に対してlossを定義している手法がある、おいている仮定は違うが。)
[1] Efficiently Trainable Text-to-Speech System Based on Deep Convolutional Networks with Guided Attention

 

Forward-Backward Decoding for Regularizing End-to-End TTS
End-to-End TTSにおいて、decoderはleft-to-right (L2R)にdecodeしていく。そのため、exposure biasが問題となる。これに対処するため、right-to-left (R2L)にstepを進めるdecoderも学習し、両者の生成するメルスペクトログラム (もしくはhidden states)が一致するよう、新たにロスを追加する。メルスペクトログラムを対象とした場合、data augmentationともみなせる。
ASRでも同じモチベーションで研究が行われており、その一つが[2]
[2] Forward-Backward Attention Decoder

 

Exploring Phoneme-Level Speech Representations for End-to-End Speech Translation
End-to-endで音声翻訳をする際、直接frame-levelの音響特徴量を入力するのではなく、phoneme-levelの情報、具体的にはDNN-HMMで求めたアライメント、を入力としてMTを学習。

 

Very Deep Self-Attention Networks for End-to-End Speech Recognition
モチベーション:transformerをそのまま音声認識に適用しても、精度の改善は限定的なので、さらに改良を加える。residual layerのskipしない方の値に(dropoutと同じように)maskをかけるstochastic layerを提案。very deep: 48 transformer layers in total。

 

Almost Unsupervised Text to Speech and Automatic Speech Recognition
ASRのTTSの間のdualityに着目して、なるべく少ないpairwise dataだけを用いてASRとTTSモデルを学習。single speaker, 200 paired data on LJSpeech。⇔speech chain, cycle consistency。

 

Self-Attention Aligner: A Latency-Control End-to-End Model for ASR Using Self-Attention Network and Chunk-Hopping
Online recognitionのための、self attention network (SAN)を用いたend-to-end model。1) blankとcausalを考慮したマスクをかけてLMを学習 2)chunk単位での処理 (Chunk-hopping mechanism)

 

Towards Language-Universal End-to-End Speech Recognition
Multi-(3-) lingual end-to-end ASR。output unitの、複数言語間での共有を許す。output unitの発音が言語間で異なるので、言語情報を利用してhidden vectorに対してgatingを行う。また、対象言語と関係のないoutput unitはzero maskingする。

別スレッドで重いタスクを動かし、終了後にメインスレッドで値を受け取る。

タイトルにある動作をC++で実装する際、future/promiseを用いた。スレッド終了後、値の受け渡しができる。初めて使用したので、メモ。

std::futureを使うかboost::futureを使うかは、boost::is_ready()を使うかどうかで決める?std::futureのwait_for()でも同じ情報が取れるよう。違いがよく分からなかった。

-----
boost::promise<string> p;
boost::future<string> f = p.get_future();

thread_pool.post([&, ...] {
string r = func();
p.set_value(r);
});
-----
if (f.is_ready()) {
string ret = f.get();
}
-----

condition_variableでも同期やスレッド制御ができる。

[TODO] boost::shared_mutexについて

Kaldiでwav fileを読み込む

Kaldiでwav fileを読み込む

1) kaldi formatの"wav.scp"を読み込む:
SequentialTableReader<WaveHolder> reader(wav_rspeficier);
for (; !reader.Done(); reader.Next()) {
std::string key = reader.Key();
const WaveData &wave_data = reader.Value();
}

2) wav file pathを指定して読み込む:
std::ifstream ifs(wav_file_path, std::ios::in|std::ios::binary);
WaveData wave_data;
wave_data.Read(ifs);