第3章 音声データ入力

目次

基本フォーマット
ビット数
チャンネル数
サンプリングレート
ファイル入力
サポートするファイル形式
録音デバイスからの直接入力
録音デバイスの条件
OSごとの詳細
入力遅延の調整
ネットワーク・ソケット経由の入力
ネットワーク経由
esd
標準入力
DATLINK/NetAudio
特徴量ファイル入力
プラグインによる入力拡張について

Julius は録音済みの音声波形データに対して認識処理が行える.また,音声入力デバイスから音声を直接取り込みながらオンライン認識を行うこともできる.あらかじめ抽出した特徴ベクトル列ファイルを入力とすることもできる. これらの音声入力の選択は,-input オプションで行う.本章では音声データの入力について述べる.

なお,説明中に出てくるJuliusの各オプションの詳細は,リファレンスマニュアルの 「オーディオ入力」の項目も参考にすることを推奨する.

基本フォーマット

音声波形入力は,あらかじめ録音された音声波形ファイルを入力として与える方法のほか,録音デバイスからの直接音声入力やネットワーク経由の音声受信を行うことができる.以下に与えることのできる音声波形データに共通の仕様について述べた後,各入力方法について詳しく述べる.

ビット数

量子化ビット数は,16ビット固定である.

チャンネル数

チャンネル数は,1チャンネル(モノラル)のみサポートする.

サンプリングレート

入力のサンプリングレート (Hz) は,オプション -smpFreq あるいは -smpPeriod で指定できる.また, -htkconfHTK Config ファイルを与えた場合,その中の SOURCERATE の値からセットされる.無指定時のサンプリングレートのデフォルトは 16,000 Hzである.

使用する音響モデルの学習条件に合わせてサンプリングレートを設定する必要がある.入力のサンプリングレートが音響モデルの学習データのレートと一致しない場合,うまく認識できない.たとえば,使用する音響モデルが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 で与える.

サポートするファイル形式

読み込み可能なファイル形式は,デフォルトでは以下のとおり.

  • .wavファイル:

    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 1 infile -t .raw -s -w -c 1 -x outfile

なお,RAWファイルには対してはデータ形式やサンプリングレートのチェックが行われないため,入力データが上記の形式に沿っているか,所望のサンプリングレートで録音されたものか,の点に注意すること.

録音デバイスからの直接入力

オプション -input mic を指定することで,マイクロフォンやライン入力などの録音デバイスから音声ストリームをキャプチャしながら認識できる.この直接入力は,Linux, Windows, Mac OS X, FreeBSD および Solaris でサポートされている.

直接入力では,入力ストリームに対して音声区間の切り出しが行われ(デフォルトではレベルと零交叉に基づく検出が行われる),検出された音声区間ごとに認識処理を行う.また,特徴量抽出および第1パスの認識処理は入力と並行してリアルタイムに行われる.音声区間検出の調整やリアルタイム認識の注意事項については,別章を参照のこと.

録音デバイスの条件

動作には,16bit, モノラル(1チャンネル)で,かつ音響モデルが要求するサンプリングレート(デフォルトは16kHz)での録音がサポートされている必要がある.

Julius は, OS の入力デバイスの選択やミキサー,録音ボリュームの調整を行わない(一部OSを除く).録音のシステム設定は,Julius 外で行う必要がある.

録音デバイスの特性や歪みは音声認識精度に大きな影響を与えるため,事前に録音品質のテストを行うことが望ましい.また,正しく音声を切り出すにはボリューム等を適切に設定する必要がある.Juliusに付属の adinrecadintool は,音声の録音を行えるツールであり,Julius と同一のライブラリを使用しているので,これでファイルに録音するなどして,正しく録音できているかチェックすることが望ましい.また,Julius にオプション -record を与えることで, 認識した音声データを直接ファイルに保存することができる.

OSごとの詳細

Linux

以下のサウンドインタフェース・ドライバに対応している.

  • ALSA ドライバ

  • OSS 準拠ドライバ

デフォルト (-input mic) では ALSA インタフェースを使用する.-input oss / -input alsa で明示的に選択することもできる.OSS をデフォルトにしたい場合はコンパイル時にconfigure に --with-mictype=oss をつければよい.

サウンドカードで 16bit, モノラルの録音がサポートされている必要がある. [4] USB オーディオでも動作する.[5]

ALSA のデフォルトの録音デバイス名は "default" である.これは環境変数 ALSADEV で変更可能である. 例えば,複数のサウンドカードが存在する場合,ALSADEV="plughw:1,0"のように指定することで,2枚目のサウンドカードの録音デバイスを指定できる. OSSの場合,デフォルトは /dev/dsp であり,環境変数 AUDIODEVで変更できる.

Windows

Windows では,DirectSound API を使用して音声を録音する. PortAudio ライブラリを使用している.

Portaudio V19 を使用している場合,APIは高速な順(ASIO,DirectSound, MME の順)で調べられ,最初に見つかったものが選択される.録音デバイスはを環境変数PORTAUDIO_DEVで明示的に指定することもできる. 具体的な指定方法は起動時のログに出力されるので参照のこと.

Mac OS

Mac OS X v10.3.9 および v10.4.1 で動作確認されている.CoreAudio API を使用している.

FreeBSD

FreeBSD 3.2-RELEASEにおいて,sndドライバで動作確認されている.コンパイル時に自動判別がうまく動かない場合は --with-mictype=ossを指定すること.

Sun Solaris

デフォルトのデバイス名は /dev/audio である.環境変数 AUDIODEV で変更できる.Solarisでは例外的に Julius はミキサー設定を変更し,録音デバイスがマイクに自動的に切り替わる.

入力遅延の調整

デバイスからの直接認識では,入力遅延について注意が必要である.通常,PC のオーディオ入力では適度な大きさのデータ片 (chunk / fragment) ごとに処理が行われ,その分の遅延が発生する.Linux (ALSA/OSS) および Windows では,このデータ片の大きさ(=遅延幅)を環境変数 LATENCY_MSECで指定できる(単位:ミリ秒).短い値を設定することで入力遅延を小さくできるが,CPU の負荷が大きくなり,また環境によってはプロセスやOSの挙動が不安定になることがある.最適な値はOS やデバイスに大きく依存する.デフォルト値は,Linux では 50 (ミリ秒) である. Windows ではシステムのデフォルト値が用いられるが,動作環境によっては数百ミリ秒になることもある.

ネットワーク・ソケット経由の入力

ネットワーク経由

-input adinnetで,ネットワークソケットから音声データを受け取ることができる.プロトコルは Julius 独自のシンプルなプロトコルを用いており,送受信部は付属のツール adintool に試験的に実装されている.例えば,adintool を用いて以下のようにネットワーク入力が行える.

Juliusで音声受信・認識:
% julius .... -input adinnet -freq srate
adintoolで音声入力・送信:
% adintool -in mic -out adinnet -server server_hostname -freq srate

なお,Julius 側でサンプリングレートとチャンネル数のチェックは行われないため,クライアント側とJulius側でサンプリングレートを一致させる必要がある点に注意すること.

esd

Linux では,esd (EsounD daemon) を介して音声を取り込むことができる. esd は多くのLinux デスクトップ環境で利用されている音声デバイス共有用オー ディオサーバである. コンパイル時に esd のライブラリ・ヘッダがあれば有効化され,オプション -input esd で使用できる.さらに,--with-mictype=esd をつけてコンパイルすれば,-input micのデフォルトを esd にできる.

標準入力

標準入力からRAW形式あるいはWAV形式の音声入力を受け取ることができる.これには-input stdinを指定する.RAWファイルの場合、サンプリングレートがチェックされないので注意すること.

DATLINK/NetAudio

DATLINKに付属のNetAudioサーバから音声を受け取り認識することができる.これには, コンパイル時に DATLINK/Netaudio のライブラリを組み込んだ上で, -input netaudioを指定する.

特徴量ファイル入力

音声信号ではなく,特徴抽出済みの特徴量ベクトル列を直接Juliusに与えて認識を行うことができる.この場合,Julius は特徴量抽出を行わず, 入力のベクトル列はそのままHMMに照合され,認識が実行される. このため,Julius で抽出がサポートされていない特徴量を持ちいた認識が可能である.

ファイル形式は,HTK 形式の特徴量ファイルをサポートする. -input htkparam あるいは -input mfcfile を指定する.ファイル名の与え方は音声波形ファイル入力のときと同様である. 複数ファイルを連続して認識する場合,音声ファイル入力と同様にオプション -filelist を使用する.

特徴量ファイル入力の場合,その特徴量の型が,音響モデルが要求する特徴量の型と一致するかのチェックが行われる.型が完全一致する場合,そのまま認識を行う.一致しない場合,ベースフォームが同じでかつ以下のいずれかの処理を入力に行えば一致させられる場合は,その処理を行ってから認識を行う.

  • 一次差分 (_D) の追加あるいは削除

  • 二次差分 (_A) の追加あるいは削除

  • エネルギー項の抑圧 (_N)

上記の処理によっても一致させられない場合,あるいはベースフォームが異なる場合は,エラーを出力してそのファイルの処理をスキップする.なお,このパラメータチェックは,オプション -notypecheck を指定すれば無効化できる.

プラグインによる入力拡張について

上記までは Julius に組み込まれている音声入力方法について説明したが, 4.1 以降では,外部プラグインによって新たに入力を拡張することができる. プラグインでは,音声波形信号入力のほか,特徴量ベクトル列のリアルタイム入力もサポートする.プラグインを作成することで,対応する音声デバイスを拡張したり,ネットワークから特徴量を受け取るようなことが可能となる. 詳細は,プラグインの章を参考にされたい.



[2] ただし,RAW 形式のファイル入力やネットワーク入力の場合,入力音声データのヘッダ情報が無いためこのチェックが行われない.

[3] この最大長制限はソースコード中の libsent/include/sent/speech.hMAXSPEECHLEN として定義されている.この値を変えてコンパイルすることで上記の上限を変更可能である.

[4] ただし,Linux/OSS では,ステレオ録音しかサポートされていない場合,左チャンネルを認識するよう動作する.

[5] ただし,音声認識で用いるサンプリング周波数(16kHz であることが多い)での録音がデバイス側でサポートされている必要がある.44.1kHzや48kHz等の録音のみサポートするデバイスの場合,うまく動作しないことがある.