MZ Platformアプリの個人的な作成事例

音声認識

音声認識エンジンのJulius を呼び出すアプリケーション(Windows版)を作成しました。

Juliusの機能の詳細についてはリンク先をご覧ください。

準備として、リンク先からディクテーションキットと文法認識キットのWindows版を入手する必要があります。

概要

JuliusのEXEファイルを外部プログラム通信コンポーネントから起動して、 結果をテキストエリアに表示します。起動後にマイクから音声を入力すると、 テキストエリアに認識結果が出力されます。

コマンドラインアプリケーション実行のGUI化

このアプリケーションでは、JuliusのEXEファイルを起動して、 ディクテーションキットと文法認識キットの二種類を試せるようにしました。 どちらも起動コマンドは次のようになります。 それぞれ適切な設定ファイルを準備することで起動の仕方をカスタマイズすることが可能なようです。

(実行用のパス)julius.exe -C (設定ファイル).jconf

ディクテーションキットは、入力した音声をそのまま日本語の文字列に変換してくれます。 このアプリケーションではキットに含まれるfast.jconfを用いて起動しています。 Windowsのコマンドプロンプトでコマンドを入力して、マイクから音声を入力すると下図のように動作します。

一般的な音声認識ソフトウェアだと、自分でたくさん文章を読んで学習させてからでないと、 ここまで正確に認識できないのではないかと思いますが、Juliusは結構簡単に認識してくれます。 ただし、カタカナ語などはあまり正確に認識してくれない印象です。 まだあまり使い方を理解していないので、ちゃんと調べたらもっとうまく使えるのかもしれません。

一方、文法認識キットは、文法として登録された単語の組み合わせの中で近い文章として認識してくれます。 このアプリケーションではキットに含まれるtestmic.jconfを用いて起動しています。 Windowsのコマンドプロンプトでコマンドを入力して、マイクから音声を入力すると下図のように動作します。 この例では果物を何個くださいという文の文法が対象になっています。

当然ですが、ディクテーションより安定して正確な文章として認識してくれる印象です。 この方法は音声によるコマンド入力として使えそうなので、 その場合は独自の文法定義をファイルとして作成する方法をJuliusのサイトで勉強する必要があります。

以上のような二種類の処理を、GUIから起動して結果を表示します。 ディクテーションの方は「口述筆記開始」ボタンを、文法認識の方は「文法認識開始」ボタンを押すと、 前述のコマンドを実行します。

ディクテーションを実行したときの出力例は下図になります。この結果は前述のコマンド実行の出力に対応します。

文法認識を実行したときの出力例は下図になります。この結果も前述のコマンド実行の出力に対応します。

このような処理の記述について、下図を用いて説明します。 ディクテーションと文法認識の起動処理はコマンド文字列の引数のファイル名が違うだけなので、 ここではディクテーションの処理だけを示します。

一般的にコマンドラインアプリケーションの起動では、外部プログラム通信を使います。 「通信先プログラムの設定」メソッドで、前述のコマンドを設定し、「startProgram」メソッドで起動します。 このとき、指定したい引数の種類によって使うメソッドを変える必要があります。 ここでは対話モードと実行フォルダを指定する必要があったので、3引数のメソッドを選択しました。

Juliusは起動後にマイクからの入力に応答して文字列を出力します。 このような動作のときには外部プログラム通信の対話モードで起動して、 出力された結果をデータ生成イベントで取得する必要があります。 ただし、最終的に対話モードと非対話モードのどちらを選択するかは、 実際に動作するか試してみる必要があるので、一概には言えません。 試してみて動く方でお使いいただくしかありませんのでご留意ください。

出力テキストの抽出

このアプリケーションでは、出力された文字列から認識された文字列を抽出して表示します。 ディクテーションの抽出結果例は概要の図に示した通りで、文法認識の抽出結果例は下図のようになります。

前述の二種類の出力例を見るとわかるように、いずれも認識途中に「pass1_best:」が、 認識されると「sentence1:」がキーワードとして出力され、認識結果は「sentence1:」の後ろの文字列になっています。 そこで、これらのキーワードを使って出力テキストから認識結果の文字列を抽出することができます。 具体的には、出力テキストを文字列格納変数に入れて、 キーワードが含まれている場合にそれぞれの位置で前後の文字列を捨てるように部分文字列を取得すればOKです。 処理の図は少々長くなるので省略します。

このアプリケーションでは二種類の出力で処理を共通にしているため、 文法認識では<s>と</s>というタグで囲まれた文字列になっています。 これの意味は理解していないですが、毎回出るようなものであれば処理で省くように記述する必要があります。

作成日 2012-10-02

最終更新日 2012-10-02