はじめての音声認識

Problem

HARK を使って音声を認識してみたいが,やり方が分からない.

Solution

HARK を使って音声認識をするためには,大きく分けて二つの処理が必要と なる.

  1. HARK を使って波形から認識のための特徴量を抽出する

  2. Julius_mft を使って特徴量の認識を行う

処理に必要な各種ファイルやパラメータ設定などが複雑であるので, 全てを一から準備するより 付録 の サンプルを参考に適宜変更を加えると良い.

特徴量抽出


HARK でサポートする特徴量 MSLS,MFCC を音声から抽出する ネットワークの作成方法について説明する.ここでは, 一般的に用いられる MSLS,$\Delta $ MSLS,$\Delta $パワー もしくは MFCC,$\Delta $ MFCC,$\Delta $パワーを抽出 するネットワークについて説明する.

\includegraphics[width=\textwidth ]{fig/recipes/LearningHARK-recog-msls.png}
: MSLS
\includegraphics[width=\textwidth ]{fig/recipes/LearningHARK-recog-mfcc.png}
: MFCC

図 #.#.##.#.# は周波数領域の音声から MSLS,MFCC をそれぞれ抽出するネットワーク の例である.PreEmphasis ,MelFilterBank ,Delta ,FeatureRemover モジュールと MSLSExtraction もしくは MFCCExtraction モジュール を用いて特徴量を抽出している.最後の SpeechRecognitionClient モジュールは,抽出した特徴量を Julius_mft にソケット通信により送信 するためのモジュールである.音源方向ごとの認識を行うため,入力には 特徴量の他に音源定位結果も必要である.

特徴量抽出が正しくできているかを確認するためなど,ファイルに 特徴量を保存したい場合には,SaveFeatures , SaveHTKFeatures モジュールを使用すると良い.

認識


認識は音声認識エンジン Julius を基に拡張された Julius_mft を用いて行う.基本的な使い方は Julius と同様であるため, Julius を使ったことのないユーザーは, Julius のウェブページ を参考に基本的な Julius の使い方を習得するとよい.

HARK で抽出した特徴量をソケット通信で受け取り認識を行うためには 設定ファイルの入力形式を “mfcnet” にする必要がある. 以下は設定の例である.

-input mfcnet -plugindir /usr/lib/julius_plugin -notypecheck -h hmmdefs -hlist triphones -gram sample -v sample.dict

このうち,はじめの 3 行は HARK から特徴量を送信して認識を 行うために必要となる.1 行目は特徴量をソケット通信で受けとるため, 2 行目はソケット通信を可能とするプラグインのインストールされている フォルダへのパスを指定するため,3 行目は Julius_mft の型チェックで HARK で抽出した MSLS 特徴量を使用するための設定である.このうち,2 つ目の パスは各自の環境に応じて適切に設定する必要がある.

Discussion

最もシンプルな方法の一つは,AudioStreamFromWave モジュールを使用して モノラルの音声を読み込み,図 #.#.#PreEmphasis モジュールにつなぐ (PreEmphasis モジュールに時間領域の音声波形を渡す)方法である.分離音の認識を行いたい 場合は,GHDSS モジュールの出力 (周波数領域の波形) を図  #.#.# もしくは #.#.#Synthesize モジュールにつなげば良い.

See Also

Julius_mft の設定に関しては,すでに述べた様に Julius とほとんど同じであるため, Julius のウェブページ を参考にするとよい. 特徴量については,特徴量抽出を, 認識に用いる音響モデルや言語モデルの作成については, 音響モデルと言語モデルを参考にすると良い. 認識の前に定位や分離などを行っている場合は,それぞれの段階で 正常に処理できているか一つ一つ確認する必要がある ( 「うまく録音できない」 「うまく定位できない」 「うまく分離できない」 「うまく認識できない」)