音声認識システム作るには何が必要だっけ
もう1年以上も音声研究の分野から遠ざかっていた上に、学生時代の研究も終盤はかなりニッチなところを掘り下げていたので、音声認識システム全体がどうなっていたのかをおさらいするところから始めなくてはいけません。
統計的音声認識システムは誰かが発した「音声」と「音声に関する統計的なモデル」から、その誰かが「何と言おうとしてそう発音したのか」を推定するシステムなんですけど、そこら辺の話はきっと誰かがまとめてくれていると思うし、現時点でこの記事は自分用のメモとしての機能しか期待していないので色々割愛して、具体的な手順をメモするだけにとどめておこうと思います。
とりあえず、システムの仕様は以下。最初は楽したいので学生時代の研究のセッティングにかなり寄せています。
いわゆるDNN-HMMハイブリッドアプローチというやつです。個人的には、僕が大学院を卒業する頃に話題になりつつあった、DNNの活性化関数にReLUを使うのを試してみたいです。
次は、このシステムを構築するのにどういう作業が必要か。
- (ラベル付き)音声コーパスを用意する
- 音素バイグラムの生起確率を計算する
- (物理)トライフォンをリストアップする
- 音声コーパスから音響特徴量を抽出する
- 各音響特徴量をトライフォンの各状態に割り当てる
(状態はとりあえず時間で3等分) - ルールベースクラスタリングにより状態を共有する
- DNNの学習データを用意するため、特徴量系列の強制アライメントを行う
…ために、各状態の出力確率モデルをGMMとしてパラメータを学習、
学習したモデルを元にHMMの強制アライメントを行いパラメータを再学習、
これを繰り返す(これってEMアルゴリズムって言うんですかね?) - 学習したGMM-HMMを用いて特徴量系列の強制アライメントを行う
- 音響特徴量と対応する状態ベクトル(?)を与えてDNNのパラメータを学習する
- 学習したDNNに評価データの音響特徴量を入力し、
出力をHMMの各状態の出力確率としてデコーディング
…って感じになると思うんですが、全てのプロセスを実装したことは無いので、どこかで躓くような気はしています。あ、トライフォン間の遷移確率には音素バイグラムを使います。
DNNの構築には話題のTensorFlowを使ってみようかなと思っています。TensorFlowのフロントエンドはPythonで実装されているようなのですが、Pythonはほとんど触ったことがないのでその勉強もしながらやる形になりそうです。