スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【同じタグを付けた記事の一覧】

Windows の音声認識を JavaScript で(基礎編)

2012年01月28日(土)00時55分

予定

今回は Windows の音声認識機能について調べたことを少し書いてみようかと思います。
一応、何回かに分けて書く予定で「基礎編」としていますが、実際に他にも何かを書くかどうかは今のところ未定です。
もし続いた場合には「音声認識」タグが目次代わりになりますので、他のネタを見たいというときには、「音声認識」をクリックしていただけますと、一覧していただけるかと思います。

Windows の音声認識機能と JavaScript

Windows では Vista 以降は標準で、WinXP 以前でも Speech SDK 5.1 のページにある「SpeechSDK51.exe」と「SpeechSDK51LangPack.exe」をインストールすることで無償で日本語の音声認識が可能です。
また Windows には、これも標準で JavaScript の実行環境が存在しています。
このため Windows では、メモ帳で数行の JavaScript ソースを書き、拡張子を「JS」にしたファイル名で保存て実行するだけで、簡単に音声認識を試すことができます。
ということで、とりあえず認識した内容を表示し続けるだけのスクリプトを書いてみました。

サンプルの内容

今回のサンプルは、実行するとまずコンソール画面が開きます。
そして「プロファイルの選択→音源(マイク)の選択」と続き、それが終わると認識された文字の表示が繰り返されます。
終了の手段は用意されていないため、終わらせるときはコンソール画面を閉じてください。

実行前の準備

前述の通り、WinXP には標準では日本語の音声認識エンジンが入っていませんので、Speech SDK 5.1 のページから「SpeechSDK51.exe」と「SpeechSDK51LangPack.exe」をダウンロードして、インストールしておく必要があります。
それから、コントロールパネルから音声認識機能の設定画面を開き、標準で使用する認識エンジンを日本語のものに変更しておく必要もあります。

サンプルの実行

DictJS00.js ← 矢印左側の文字の上で右クリックし、「対象をファイルに保存(A)…」して保存します。
保存したスクリプトファイルを右クリックし「プロパティ」を見たときに、「セキュリティ:このファイルは他のコンピュータから取得したものです。このコンピュータを保護するため、このファイルへのアクセスはブロックされる可能性があります。」と書かれている場合は「ブロックの解除」をしてください(しなくても使えますが)。 
これ以降はサンプルの内容についての補足説明を書いていきます。

必要最小限のコード

サンプルでは、コンソールの表示やマイクの選択処理などで長くなっていますが、音声認識のために本当に必要な部分だけを書くと以下の6行になります(マイク入力が一本しか存在しない場合)。

var RecoContextObj=WScript.CreateObject("SAPI.SpInProcRecoContext","Recog_");
RecoContextObj.Recognizer.AudioInput=RecoContextObj.Recognizer.GetAudioInputs().Item(0);
var RecoGrammarObj=RecoContextObj.CreateGrammar();
RecoGrammarObj.DictationSetState(1);
while(true)WScript.Sleep(1000);
function Recog_Recognition(StreamNumber,StreamPosition,RecognitionType,Result){WScript.Echo(Result.PhraseInfo.GetText());}

まず、一行目で音声認識用のオブジェクトである「SAPI.SpInProcRecoContext」を生成します。
ここで、CreateObject 関数の第二引数に「"Recog_"」を指定しているため、RecoContext オブジェクトで発生したイベントを、「Recog_」を頭に付けた関数で受けることができるようになります。
二行目はマイクの設定です。
ここでは本来、マイクの一覧の中から、使用できるマイクの番号を正しく選択する必要があります。
三行目は認識用の文法オブジェクトの生成、四行目でその文法オブジェクトのステータスに1を設定することで音声認識が開始されます。
五行目はスクリプトが終了しないように永久ループをしているだけで、処理内容自体に意味はありません。
そして永久ループ中に音声認識オブジェクトが音声を認識する都度、六行目の Recog_Recognition 関数が呼び出されます(「Recog_」が頭に付いているからです)。
この Recog_Recognition 関数内では「Result.PhraseInfo.GetText()」で認識した文字列が取得できます。

SAPI5 と Microsoft Speech Platform と音声認識

今回使用しているのは、「SAPI5」と呼ばれる Windows 標準の音声機能関連のインターフェイスです。
「SAPI5」というのは、「Speech Application Program Interface ver.5」の略です。
また、その後継(とも言い切れないのですが)として、Microsoft Speech Platform(以下 MSSP)というものもリリースされています。
この MSSP は、内部的には SAPI5 とほとんど同じであるようで、使用時における違いは、オブジェクト生成時に「SAPI」となっている部分を「Speech」に変更することぐらいです。
例えば、上述の6行サンプルでは、一行目で「SAPI.SpInProcRecoContext」というオブジェクトを生成していますが、これを「Speech.SpInProcRecoContext」とすれば、MSSP を使用することになります。
また、SAPI5 と MSSP のオブジェクトを混ぜて使っても、試した限りでは特に問題はありませんでした。
ということで、以降とりあえず「SAPI5」と表記していますが、MSSP も同じことです。
ただし、MSSP 用の音声認識エンジンは、今のところ、自由にしゃべった内容を文字列化する「口述筆記」モードが使えず、あらかじめ登録した単語のどれに近いか?を認識する「コマンド認識」モードのみのようです(多分)。
そのため、今回のサンプルなどを MSSP 用に書き換えるとエラーとなります。

RecoContext と Recognizer と Grammar

SAPI5 の音声認識は、「RecoContext」と「Recognizer」と「Grammar」という三つのオブジェクトの連携で構成されます。
構造的には、RecoContext オブジェクトが他の二つを管理する形になっていますが、実質的な中核は Recognizer オブジェクトで、この Recognizer オブジェクトが認識エンジンを直接管理しているようです。
RecoContext オブジェクトはこの Recognizer オブジェクトと使用者(や他のオブジェクト)との仲介役で、Recognizer オブジェクトが発生したイベントや認識した内容を、RecoContext オブジェクトが通知してきます。
この RecoContext オブジェクトの生成は、Recognizer オブジェクトが持つ CreateRecoContext 関数を使用することで行います。
それ以外に、RecoContext オブジェクトを直接生成することもでき、この場合は内部で自動的に Recognizer オブジェクトが生成されています。
Grammar オブジェクトは、RecoContext オブジェクトの CreateGrammar 関数を使用することで生成できますが、これは「コマンド認識」のときに使用するもので、「口述筆記」の場合はとりあえず作っておく、という程度でほとんど使いません。

Shared系とInProc系

SAPI5 の音声認識オブジェクトには、「SpSharedRecoContext」や「SpSharedRecognizer」といった頭に「SpShared」が付くものと、「SpInProcRecoContext」や「SpInProcRecognizer」といった頭に「SpInProc」か付くものの二種類が存在します(以下「Shared 系」「InProc 系」と呼びます)。
この二つは、オブジェクト生成時に「SAPI.SpShared~」とするか「SAPI.SpInProc~」とするかで分かれ、それぞれが持っているプロパティやメソッドは同じです。
違いは音源(マイクや入力ソース)の扱いで、Shared 系はこの管理を OS に任せ、InProc 系は手動で行います。
つまり、Shared 系は OS がマイクとして認識しているもの(コントロールパネルなどから設定できる既定のデバイス)が自動的に使われるため、音源を管理する手間が省けます。
逆に言うと入力ソースを自分で設定することが出来ず、「AudioInput」というプロパティはありますが、これを変更するとエラーになります。
そして InProc 系ではこの「AudioInput」を変更することができ、というよりもこのプロパティを自身の責任で適切に設定しないと動作しません。
ということで、Speech SDK 5.1 についてくるヘルプでは、普通にマイク入力からの音声認識をする用途では Shared 系を使い、電話取り次ぎシステムのように入力先が固定で勝手に変更されては困るようなものや、WAVE ファイルの直接認識のようにそもそもマイクなどはいらないような用途には InProc 系を使いましょう、と書かれています(ちなみにヘルプには Shared 系はマイクを「共有」するので複数のアプリケーションが共存できるが、InProc 系は音源を「専有」するのでほかのアプリケーションはその音源を使えなくなる、というようなことが書かれていますが、複数の InProc 系使用アプリケーションを同時起動しても、その全てにマイク入力がきていたりしましたので、このあたりの事情はよくわかりません)。

Vista 以降は InProc 系で

ということで、「普通の音声認識なら Shared 系を使いましょう」と言いたいところなのですが、これだと Win7(多分 Vista でも)で困ったことが起こります。
というのも、Win7 では Shared 系のオブジェクトを生成した瞬間に、「マイクユーザーインターフェイス」というものが起動してしまうのです。
実は、Windows は Vista から、OS のアクセシビリティ向上の一環として、音声認識による操作が OS の機能の一部として組み込まれており、アプリケーションが音声認識機能を利用しようとすると、この音声操作機能が起動してしまい、これは OS の機能ですから、アプリケーションより優先的に音声信号を奪ってしまうため、アプリケーションに届かなくなります(アプリケーションは認識結果、つまり文字列だけを受け取ることになります)。
もちろん、OS の音声操作機能を必要としている方にとっては、個別のアプリケーションが勝手にその機能を制限してしまっては問題がありますから、その意味でこの「OS 優先」は理にかなった仕組みではあるのですが、一方で結果の文字列だけでなく、認識過程での情報まで利用するアプリケーションを作るような場合ですと、とても困ることになります。
で、どうするかということなんですが、とりあえず InProc 系を使えば、この「マイクユーザーインターフェイス」の起動を避けることができますので、WinXP だけでなく Vista や Win7 でも使うのであれば、InProc 系で作るのが無難かと思います(他にも方法はあるのかもしれませんが)。

InProc 系は RecoContext オブジェクト直接生成で

で、「InProc系を使う」というのはいいのですが、何故かこの InProc 系は「Recognizer オブジェクト生成 → RecoContext オブジェクト生成」という手順ではうまくいきません。
具体的に書きますと、Recognizer オブジェクトの CreateRecoContext 関数で RecoContext オブジェクトを生成した場合、RecoContext オブジェクトの認識イベントが、どの関数にも関連付けられていない状態で生成されます。
そのため、生成後に例えば「WScript.ConnectObject(RecoContextObj,"Recog_");」のようにして、自作の関数をイベントハンドラとして登録する必要があるのですが、これがエラーになるのです(WinXP で Shared 系を使えば問題なく動作します)。
そこで、InProc 系を使う場合には CreateObject 関数で直接 RecoContext オブジェクトを生成(同時に Recognizer オブジェクトも生成される)し、その際に第二引数で指定することで、イベントハンドラが登録された状態で生成させるしかありません(多分)。

言語変更不可

しかしながら、これで問題になることが一つあり、それは「言語(認識エンジン)の変更ができない」ということです。
言語(認識エンジン)の変更するため、生成した RecoContext オブジェクトの Recognizer オブジェクトの、そのまた Recognizer プロパティを再設定すると、0x80045014 というエラーになってしまいます(0x80045014 は SPERR_ENGINE_BUSY)。
そのため、これを変更したい場合、まず Recognizer オブジェクトを生成し、直後に Recognizer プロパティの認識エンジンを変更、その後に CreateRecoContext 関数で RecoContext オブジェクトを生成する必要があるのですが、前述の通り、この手順ではその後のイベントハンドラの登録でエラーになります。
つまりは「言語変更ができない」ということになります。
といっても、Win7(Vista も?)の場合、一部の上位エディション以外は、日本語用の認識エンジンしかついていないのですが。

関連記事

【同じタグを付けた記事の一覧】
ソースコード プログラミング JavaScript 音声技術 音声認識

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
161位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
19位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。