Microsoft Speech SDK で音声認識

VC6/応用サンプルソースコードについて

最終更新: 2015-04-02 (木) 10:52:16 (1357d)

概要

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

以上のファイルには、 異なるトピックに焦点を当てて Microsoft Speech SDK を使用した単純なサンプルプログラムが8つ入っている。 このページでは各サンプルプログラムの概要について説明する。

以上のファイルには、各サンプルを格納した Dictation1 ~ Dictation8 というディレクトリの他に、 common というディレクトリが存在する。 このディレクトリに入っているコードは、 これまでに説明してきた MSSDK を扱うためのクラスをライブラリとしてまとめたものである。

1.一般的な文法を扱う音声認識

Microsoft Speech SDK 基礎のVC6/一般的な文法を扱う音声認識に相当する。 自由に話をして構わない。どのような文に対しても対応して認識結果がテキストとして出力される *1

2.文法を指定した音声認識

Microsoft Speech SDK 基礎のVC6/指定文法を扱う音声認識およびVC6/指定文法音声認識の結果からプロパティ情報を取得するに相当する。 起動するには、コマンドライン引数として以下のように、

Dictation.exe grammar.xml

文法ファイルを指定して実行する。 サンプルとして、example1.xml, example2.xml, example3.xmlの3つのファイルを添付した。 いずれも単純な文法だが、文法通りの発話がしっかりと認識されることと、 文法に記述したプロパティ情報などが正常に取得されることを確認できる。

文法を指定した音声認識を理解したら、 自分で文法ファイルを作ってみることをお勧めする。 文法については、Microsoft Speech SDK 5.1 Help の 「目次」→「Application-Level Interfaces」→「Grammar Compiler Interfaces」→「Text Grammar Format」 を参照するとよい。

3.音声認識を利用して他のプログラムを起動する

音声認識でプログラムを起動させるサンプルプログラム。 コマンドを直接音声で入力するわけではなく、認識した結果得られるプロパティ情報をコマンドとして実行する。 とりあえず「開けノートパッドぉぉぉ~」、「動け電卓ぅぅぅ~」と叫ぶと、Windows 付属のノートパッドや電卓が起動する。 プロパティ情報を元にプログラムを起動するコードとして、Dictation7/CoutDictator.cpp の一部を以下に示す。

HRESULT CoutDictator::recognized(CSpEvent& event) {
// ...

// COMMANDプロパティにしたがってプログラムを実行する
PhraseProperty property=recognition.getProperty("COMMAND");
		string commandString=property.getValStr();

// プログラムを起動する
STARTUPINFO si;PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));si.cb = sizeof(si);
char* command=new char[commandString.length()+1];
strcpy(command, commandString.c_str());
CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
delete command;
CloseHandle(pi.hProcess);CloseHandle(pi.hThread);

// ...
}

以上に示す通り。COMMAND プロパティの VALSTR 値をコマンドしてプログラムを起動するため、 文法を変更することで起動フレーズや起動プログラムを変更できる。 使用する文法は command.xml と決まっており、 command.xml を書き換えることで起動フレーズや起動プログラムが変更できることを確認しよう。

4.認識対象となった音声を録音する

音声認識した音声を録音するサンプルプログラム。 どんな発音であっても録音できた方がいいので、 文法を指定した音声認識ではなく一般的な文法を扱う音声認識を使って音声認識をさせている。 録音した結果は WAV 形式で、

speech1.wav, speech2.wav, speech3.wav, ...

と順番にファイルに保存されていく。

5.ファイルから読み込んだ文法を実行時に動的に変更する

文法ファイルの内容を実行時にプログラムで書き換えるサンプルプログラム。 文法自体は文法を指定した音声認識の example1.xml と等価になる。 書き換える際に重要な点は、RULE タグの DYNAMIC 属性を TRUE にしておくことである。 以下に example.xml の一部を示す。

<RULE NAME="NAME" DYNAMIC="TRUE">
<!-- プログラムによって挿入される -->
</RULE>

プログラムによる文法の書き換えについては、Microsoft Speech SDK 5.1 Help の 「目次」→「Application-Level Interfaces」→「Grammar Compiler Interfaces」→「ISpGrammarBuilder」 →「Example application」を参照するとよい。

6.ファイルを一切使わず、実行時に文法を生成する

文法ファイルを一切使用せず、 ゼロからプログラムで文法を指定するサンプルプログラム。 文法自体は文法を指定した音声認識の example1.xml と等価になる。

7.ループする文法を生成する

ループ文法(?)の例。 今までの文法との違いは可変長であるということ。 「あ」と「い」を交互に繰り返し「終わり」で終わる文を認識する。 実際に受理される文の例を以下に示す。

  • 終わり
  • あ終わり
  • あい終わり
  • あいあ終わり
  • あいあいあいあいあいあいあい終わり

8.認識結果をメモ帳に出力する

このプログラムは、音声認識によって他のアプリケーションを遠隔操作する最も単純なサンプルである。 このプログラムを起動すると、同時にひとつのメモ帳が起動する。 このメモ帳は、Windows 標準装備のメモ帳(notepad.exe)そのものだ。 このプログラムはそのメモ帳を遠隔操作し、音声認識の結果をメモ帳に貼り付けていく。 メモ帳の遠隔操作については以下のページを参考にしている。

本プログラムとメモ帳間の通信は一方通行であり、 メモ帳に対して直接行った編集内容は本プログラムにフィードバックされない。 そのため、次に音声を認識した瞬間にメモ帳の編集内容は上書きされて消えてしまう。

コメント

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

お名前: