目次
Julius は録音済みの音声波形データに対して認識処理が行える.また,音声入力デバイスから音声を直接取り込みながらオンライン認識を行うこともできる.あらかじめ抽出した特徴ベクトル列ファイルを入力とすることもできる.
これらの音声入力の選択は,-input
オプションで行う.本章では音声データの入力について述べる.
なお,説明中に出てくるJuliusの各オプションの詳細は,リファレンスマニュアルの 「オーディオ入力」の項目も参考にすることを推奨する.
音声波形入力は,あらかじめ録音された音声波形ファイルを入力として与える方法のほか,録音デバイスからの直接音声入力やネットワーク経由の音声受信を行うことができる.以下に与えることのできる音声波形データに共通の仕様について述べた後,各入力方法について詳しく述べる.
入力のサンプリングレート (Hz) は,オプション -smpFreq
あるいは -smpPeriod
で指定できる.また,
-htkconf
で HTK Config ファイルを与えた場合,その中の
SOURCERATE
の値からセットされる.無指定時のデフォルトは 16,000 である.
使用する音響モデルの学習条件に合わせてサンプリングレートを設定する必要がある.入力のサンプリングレートが音響モデルの学習データのレートと一致しない場合,うまく認識できない.たとえば,音響モデルが16kHz のデータで学習されたものである場合,Juliusが取り込む音声入力も 16kHz である必要がある.
また,複数の音響モデルを用いる場合,すべての音響モデルに対して同一のサンプリングレートをそれぞれ指定する必要がある.これは,複数の音響モデルは一つの音声入力を共有するためである.この場合,サンプリングレートは音響モデルごとに(オプション-AM
のあとに) 指定する.また
GMM については-AM_GMM
で指定する.なお,複数モデル認識では,サンプリングレートの他に,分析条件の -fshift
および-fsize
も同一である必要がある.詳しくは次章の特徴量抽出の節を参照のこと.
マイクロフォンなどのキャプチャデバイスから直接音声を取り込む場合,上記で指定されたサンプリングレートが録音デバイスにセットされ,そのサンプリングレートでの録音が開始される.一方,ファイル入力の場合は,そのファイルのサンプリングレートが指定値と一致するかチェックされ,一致しない場合はエラーとなる.[2]
サンプリングレート変換については,48kHzから16kHzへのダウンサンプリングのみサポートしている.オプション -48
を指定することで,
48kHz で入力を取り込み,Julius内部で 16kHz へリアルタイムにダウンサンプリングしながら認識を行える.
-input rawfile
を指定すると,音声波形ファイルの認識が行える.起動後にプロンプトが標準出力に出力されるので,音声波形ファイルのパス名を与えると,そのファイル内の音声データに対して認識を行い,プロンプトに戻る.
デフォルトでは,1ファイルを1発話として認識を行う.このため,入力ファイルはあらかじめ発話単位で区切られている必要がある.1ファイルの最大長は 320,000 サンプル(16kHzサンプリングで 20 秒)である. [3] また, Julius は最初と最後に一定長の無音が存在するという前提で認識処理を行うので,ファイルの先頭と末尾には数百ミリ秒程度の無音区間があることが望ましい.
ファイル中に複数の発話が含まれる場合,無音区間をスキップしたり細かく区切りながら認識を行うことが可能である.オプション
-cutsilence
で,マイク入力時と同じ仕組みで振幅と零交差数により音声区間を切り出しながら認識できる.また,GMM に基づく VAD
を用いて音声区間のみを認識することもできる.単語N-gramを用いた認識では,
ショートポーズセグメンテーション(-spsegment
) を指定すれば,講演音声のような無音をほとんど挟まない連続発話であっても,短いポー
ズで細かく区切りながら逐次認識することができる.
複数ファイルを連続して認識させるには,認識したいファイル名を一行に1つずつ記述したテキストファイルを用意し,オプション
-filelist
で与える.
読み込み可能なファイル形式は,デフォルトでは以下のとおり.
Microsoft WAVE形式 WAVファイル(16bit, 無圧縮PCM, monoral のみ)
ヘッダ無しRAWファイル:データ形式は signed short (16bit),Big Endian, monoral
また,コンパイル時に Julius に libsndfile を組み込むことで,上記に加えて AU, AND, NIST, ADPCM などの他の形式のファイルを読みこめる. libsndfile は Julius をソースからコンパイルする際に libsndfile のライブラリおよびヘッダがあれば自動的に組み込まれる.
RAWファイル形式はいくつか注意が必要である.Julius では RAW 形式に対して Big Endian バイトオーダを前提としており,Little Endian のデータは正しく読み込むことができない.16bit,monoのRAWファイルのLittle Endian から Big Endian への変換は,たとえば soxを用いて以下のように行うことができる.
%
sox -t .raw -s -w -c 1infile
-t .raw -s -w -c 1 -xoutfile
なお,RAWファイルには対してはデータ形式やサンプリングレートのチェックが行われないため,入力データが上記の形式に沿っているか,所望のサンプリングレートで録音されたものか,の点に注意すること.
オプション -input mic
を指定することで,マイクロフォンやライン入力などの録音デバイスから音声ストリームをキャプチャしながら認識できる.この直接入力は,Linux, Windows, Mac OS X, FreeBSD および
Solaris でサポートされている.
直接入力では,入力ストリームに対して音声区間の切り出しが行われ(デフォルトではレベルと零交叉に基づく検出が行われる),検出された音声区間ごとに認識処理を行う.また,特徴量抽出および第1パスの認識処理は入力と並行してリアルタイムに行われる.音声区間検出の調整やリアルタイム認識の注意事項については,別章を参照のこと.
動作には,16bit, モノラル(1チャンネル)で,かつ必要なサンプリングレートでの録音がサポートされている必要がある.
Julius は入力デバイスの選択や録音ボリュームの調整を行わない(一部OSを除く). 録音のシステム設定は,Julius 外で行う必要がある.
録音デバイスの特性や歪みは音声認識精度に大きな影響を与えるため,事前に録音品質のテストを行うことが望ましい.また,正しく音声を切り出すにはボリューム等を適切に設定する必要がある.Juliusに付属の
adinrecや adintool は,音声の録音を行えるツールであり,Julius と同一のライブラリを使用しているので,これでファイルに録音するなどして,正しく録音できているかチェックすることが望ましい.また,Julius にオプション -record
を与えることで,
認識した音声データを直接ファイルに保存することができる.
以下のサウンドインタフェース・ドライバに対応している.
ALSA ドライバ
OSS 準拠ドライバ
標準では ALSA インタフェースを使用する.
コンパイル時に configure
に
--with-mictype=oss
をつけることで,
OSS インタフェースを使うJuliusをコンパイルすることができる.
サウンドカードで 16bit, モノラルの録音がサポートされている必要がある. [4] USB オーディオでも動作する.[5]
環境変数ALSADEV
で録音デバイスを変更できる.
例えば,複数のサウンドカードが存在する場合,
ALSADEV="plughw:1,0"
のように指定することで,
2枚目のサウンドカードの録音デバイスを指定できる.
なおデフォルトとの録音デバイス名は "default"
である.
OSSの場合,デフォルトは
/dev/dsp
であり,環境変数
AUDIODEV
で変更できる.
デバイスからの直接認識では,入力遅延について注意が必要である.通常,PC
のオーディオ入力では適度な大きさのデータ片 (chunk / fragment) ごとに処理が行われ,その分の遅延が発生する.Linux (ALSA/OSS) および Windows では,このデータ片の大きさ(=遅延幅)を環境変数
LATENCY_MSEC
で指定できる(単位:ミリ秒).短い値を設定することで入力遅延を小さくできるが,CPU の負荷が大きくなり,また環境によってはプロセスやOSの挙動が不安定になることがある.最適な値はOS
やデバイスに大きく依存する.デフォルト値は,Linux では 50 (ミリ秒) である.
Windows ではシステムのデフォルト値が用いられるが,動作環境によっては数百ミリ秒になることもある.
-input adinnet
で,ネットワークソケットから音声データを受け取ることができる.プロトコルは Julius 独自のシンプルなプロトコルを用いており,送受信部は付属のツール adintool
に試験的に実装されている.例えば,adintool
を用いて以下のようにネットワーク入力が行える.
Juliusで音声受信・認識:%
julius .... -input adinnet -freqsrate
adintoolで音声入力・送信:%
adintool -in mic -out adinnet -serverserver_hostname
-freqsrate
なお,Julius 側でサンプリングレートとチャンネル数のチェックは行われないため,クライアント側とJulius側でサンプリングレートを一致させる必要がある点に注意すること.
Linux では,esd (EsounD daemon) を介して音声を取り込むことができる.
esd は多くのLinux デスクトップ環境で利用されている音声デバイス共有用オーディオサーバである.この機能を使うには,
configure
に--with-mictype=esd
をつけてコンパイルし,起動時に -input mic
を指定する.
音声信号ではなく,特徴抽出済みの特徴量ベクトル列を直接Juliusに与えて認識を行うことができる.この場合,Julius は特徴量抽出を行わず, 入力のベクトル列はそのままHMMに照合され,認識が実行される. このため,Julius で抽出がサポートされていない特徴量を持ちいた認識が可能である.
ファイル形式は,HTK 形式の特徴量ファイルをサポートする.
-input htkparam
あるいは -input mfcfile
を指定する.ファイル名の与え方は音声波形ファイル入力のときと同様である.
複数ファイルを連続して認識する場合,音声ファイル入力と同様にオプション -filelist
を使用する.
特徴量ファイル入力の場合,その特徴量の型が,音響モデルが要求する特徴量の型と一致するかのチェックが行われる.型が完全一致する場合,そのまま認識を行う.一致しない場合,ベースフォームが同じでかつ以下のいずれかの処理を入力に行えば一致させられる場合は,その処理を行ってから認識を行う.
一次差分 (_D) の追加あるいは削除
二次差分 (_A) の追加あるいは削除
エネルギー項の抑圧 (_N)
上記の処理によっても一致させられない場合,あるいはベースフォームが異なる場合は,エラーを出力してそのファイルの処理をスキップする.なお,このパラメータチェックは,オプション -notypecheck
を指定すれば無効化できる.
上記までは Julius に組み込まれている音声入力方法について説明したが, 4.1 以降では,外部プラグインによって新たに入力を拡張することができる. プラグインでは,音声波形信号入力のほか,特徴量ベクトル列のリアルタイム入力もサポートする.プラグインを作成することで,対応する音声デバイスを拡張したり,ネットワークから特徴量を受け取るようなことが可能となる. 詳細は,プラグインの章を参考にされたい.
[2] ただし,RAW 形式のファイル入力やネットワーク入力の場合,入力音声データのヘッダ情報が無いためこのチェックが行われない.
[3] この最大長制限はソースコード中の
libsent/include/sent/speech.h
で
MAXSPEECHLEN
として定義されている.この値を変えてコンパイルすることで上記の上限を変更可能である.
[4] ただし,Linux/OSS では,ステレオ録音しかサポートされていない場合,左チャンネルを認識するよう動作する.
[5] ただし,音声認識で用いるサンプリング周波数(16kHz であることが多い)での録音がデバイス側でサポートされている必要がある.44.1kHzや48kHz等の録音のみサポートするデバイスの場合,うまく動作しないことがある.