Microsoft Speech SDK で音声認識

VC6/指定文法を扱う音声認識

最終更新: 2015-04-02 (木) 10:39:14 (2007d)

概要

このページで説明するコード。

認識結果を標準出力に出力するプログラムを作る

これから作るもの

これからマイクからの入力を音声認識し、認識結果テキストを標準出力に出力するプログラムを製作する。 MSSDK による音声認識には、 あらかじめ用意された文法を用いて行う音声認識と独自に文法を指定して行う音声認識とがあるが、 ここでは、fileexample.xml に書かれた文法に従って音声認識を行うサンプルを示す。

大まかな流れとしては、 一般的な文法を用いた音声認識を行うクラスとして Dictator クラスを継承した GeneralDictator クラスを製作し、 main 関数でそれを起動するようにする。

CmdFileDictator クラスを作る

CmdFileDictator クラスは認識結果を標準出力に出力する。 CmdFileDictator クラスの recognized メソッドの実装として、 fileCmdFileDictator.cpp の一部を以下に示す。

HRESULT CmdFileDictator::recognized(CSpEvent& event) {
  USES_CONVERSION;

  HRESULT result;

  // テキストを取得する
  CSpDynamicString text;
  if(FAILED(result=event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &text, NULL))) {
    return result;
  }

  cout << "認識結果:" << W2T(text) << endl;

  return S_OK;
}

recognized メソッドは、音声認識結果が出たときに呼び出されるメソッドなので、 こうすることで音声認識結果がテキストとして標準出力に出力される。 さらに fileexample.xml に書かれた文法を 指定している CmdFileDictator クラスの initializeGrammar メソッドの実装として、 fileCmdFileDictator.cpp の一部を以下に示す。

HRESULT CmdFileDictator::initializeGrammar(const CComPtr<ISpRecoGrammar>& grammar) {
  HRESULT result;

  if(FAILED(result=<Emph>grammar->LoadCmdFromFile(L"example.xml", SPLO_STATIC)</Emph>)) {
    return result;
  }

  if(FAILED(result=<Emph>grammar->SetRuleState(NULL, NULL, SPRS_ACTIVE)</Emph>)) {
    return result;
  }

  return S_OK;
}

LoadCmdFromFile メソッドで fileexample.xml を文法ファイルとして読み込み、 SetRuleState メソッドでその文法を起動している。

main 関数を作る

さて CmdFileDictator クラスを作り終えたら、main 関数で実際に音声認識を行うプログラムを書こう。 filemain.cpp の一部を以下に示す。

int main() {
  // COMを初期化する
  if(FAILED(CoInitialize(NULL))) {
    return 1;
  }
  atexit((void(*)(void))CoUninitialize);

  // ディクテータを構築する
  CmdFileDictator dictator;
  if(!dictator.initialize(0)) {
    return 1;
  }

  cout << "Initialize OK." << endl;

  // ウィンドウメッセージを処理する
  MSG msg;
  while(GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  return 0;
}

まず MSSDK は COM を使うので CoInitialize 関数を使って COM を初期化する。 その後の atexit 呼び出しは、プログラム終了時に CoUninitialize 関数が呼び出されるようにするための命令である。 次に CmdFileDictator クラスのインスタンスを作成し初期化する。 最後に MSSDK が音声認識を行えるようにウィンドウメッセージを処理している。

文法ファイル(example.xml)について

fileexample.xml に書かれている文法は、 以下の二つの発話のみを受理する単純な文法である。

  • 僕の名前は弥*1です
  • 僕の名前は豊*2です

P タグは PHRASE タグの略で、認識対象フレーズを定義する。 L タグは LIST タグの略で、認識対象フレーズをリストアップする。 L タグによってリストアップされたフレーズは、その内のいずれか一つだけが認識されるようになる。 自分で名前を追加して、確かにそれが認識されるかどうかを確認してみよう。

文法を指定して音声認識することを覚えたら、後は文法ファイルを洗練していけばいい。 文法については、Microsoft Speech SDK 5.1 Help の 「目次」→「Application-Level Interfaces」→「Grammar Compiler Interfaces」→「Text Grammar Format」 を参照するとよい。

日本語の音声認識を行う場合に注意すべき点は、 XML の文字コードを適切*3に指定することと、 GRAMMAR タグの LANGID 属性を指定しないことである。 従って、文法ファイルは通常、以下のようになる。 認識対象フレーズには任意の日本語文字列を使うことができる。

<?xml version="1.0" encoding="Shift_JIS"?>

<GRAMMAR>
  <-- ここにルール群が入る -->
</GRAMMAR>

コメント

コメントはありません。 コメント/mssdk/vc6/specified_grammar

お名前: