スポンサーサイト

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

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

Windows の音声認識を JavaScript で(言語変更編)

2013年08月23日(金)00時31分

認識言語変更不可!?

ここしばらくは「SAPI5 と C++」について書いていましたが、今回は「Microsoft Speech Platform(以下 MSSP)と JavaScript」の話です。
以前「Windows の音声認識を JavaScript で(基礎編)」において「言語変更不可」という問題について書きました。
今もってその問題自体は解決していないのですが、とりあえず裏技的な手法によって複数言語を切り替えることはできます。
ということで、今回はその方法についてのメモです。

何が問題なのか

本題に入る前に、「言語変更不可」という結論にならざるを得なかった理由をまとめてみます。
これにはまず前提として、MSSP(あるいは SAPI5)での音声認識では、Recognizer オブジェクトと RecoContext オブジェクトの二つのオブジェクトが、密接に連携し合って動作する、ということがあります。
Recognizer オブジェクトは認識エンジンを管理しています。
RecoContext オブジェクトはその Recognizer オブジェクトを管理しており、認識結果に対するユーザー(プログラマ)との懸け橋となっています。
イメージとしては、認識エンジンが核となり、その周りを Recognizer オブジェクトが包み込み、さらにそれを RecoContext オブジェクトが包んで外壁となっているような感じです。
そしてその外壁である RecoContext オブジェクトは単体では生成できません。
RecoContext オブジェクトを生成すると、必ず中身の Recognizer オブジェクトが、その核である認識エンジンを伴って生成されます。
その時、核として選択される認識エンジンは、OS で標準の認識エンジンとして設定されているもので、また、一度外壁たる RecoContext オブジェクトができてしまえば、その中身である Recognizer オブジェクトや、核となる認識エンジンは変更できなくなります。
ですので、もし認識エンジンを変更したい場合は、まず Recognizer オブジェクトを生成し、外壁である RecoContext オブジェクトを作る前に認識エンジンを変更し、それから Recognizer オブジェクトの CreateRecoContext 関数を使って、外壁である RecoContext オブジェクトを作ることになります。
ところが、この方式で作った RecoContext オブジェクトは、なぜかどうやってもイベント発生時に通知してこなくなるのです。
生成後に、通知関数のアドレスを上書きしてみたり、通知イベントの種類を変更してみたり等、いろいろと試してはみたのですが、自分の持つ知識・技術の範囲では、どうにもうまくいきませんでした。

まとめますと

  • RecoContext オブジェクトを直接生成すると認識エンジンが変更できない。
  • 「Recognizer オブジェクト生成 → 認識エンジン変更 → RecoContext オブジェクト生成」の順だと RecoContext オブジェクトがイベントハンドラを呼び出さなくなる。

ということになります。

結果として、標準設定された言語の認識エンジンしか使えない、ということになってしまうわけです。

同時使用や MSSP

それでもまあ、例えば英語認識だけで済む作業であれば、実行前にコントロールパネルから認識言語を変更しておけばいいのですが、もし「英語もしくは日本語の例文が流れ、その翻訳文を答える」というような、複数言語の認識が必要な処理となると、それでは対応できません。
また、MSSP に至っては「コントロールパネル等で標準を変更する」という機能自体がありませんので、「実行前に…」という対処もできないのです。

標準設定とレジストリ

で、考えました。
「標準で使用される認識言語」は、おそらく Windows のことですから、レジストリのどこかに記されていることでしょう。
ですので、RecoContext オブジェクトを生成する直前にその値を変更し、生成後に元に戻すようにすることで、本来の設定とは違う言語を標準として RecoContext オブジェクトを生成できるはずです。
という仮説をもとに、実際に試してみたところ成功しました、というのが今回の本題です。
もっとも、どう見てもスマートな方法ではありませんし、レジストリを操作するという点で危険性も(微々たるものとは思いますが)高くなります。
何より、いくらなんでももっとまっとうなやり方があるのではないか?という気はするのですが、とはいえ今のところ、自分にはこれくらいしか解決策が思いつかないので仕方ありません。

DefaultTokenId

ということで調べてみたところ、MSSP の標準認識言語は「HKCU\Software\Microsoft\Speech Server\v11.0\Recognizers\DefaultTokenId」に記録されていました。
幸いにも「HKCU(= HKEY_CURRENT_USER)」、つまりユーザー管理領域ですので、おそらくこれを変更するのに管理者権限等は不要かと思われます。
この情報を使い、MSSP で「英語」の認識エンジンをもつ RecoContext オブジェクトを生成するには、以下のようにします。

//レジストリ操作用オブジェクト。
var Shell=new ActiveXObject("WScript.Shell");
//標準の設定値を退避。
var OldRecognizer=Shell.RegRead("HKCU\\Software\\Microsoft\\Speech Server\\v11.0\\Recognizers\\DefaultTokenId");
//英語の認識エンジンが標準となるようレジストリ値を変更。
Shell.RegWrite("HKCU\\Software\\Microsoft\\Speech Server\\v11.0\\Recognizers\\DefaultTokenId","HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech Server\\v11.0\\Recognizers\\Tokens\\SR_MS_en-US_TELE_11.0","REG_SZ");
//その状態でRecoContextオブジェクトを生成。
var RecoContextObj=new ActiveXObject("Speech.SpInProcRecoContext");
//退避しておいた元の認識エンジンに戻す。
Shell.RegWrite("HKCU\\Software\\Microsoft\\Speech Server\\v11.0\\Recognizers\\DefaultTokenId",OldRecognizer,"REG_SZ");

また、SAPI5 であれば、レジストリは「HKEY_CURRENT_USER\Software\Microsoft\Speech\Recognizers\DefaultTokenId」となりますので、以下のようにします。

//レジストリ操作用オブジェクト。
var Shell=new ActiveXObject("WScript.Shell");
//標準の設定値を退避。
var OldRecognizer=Shell.RegRead("HKCU\\Software\\Microsoft\\Speech\\Recognizers\\DefaultTokenId");
//英語の認識エンジンが標準となるようレジストリ値を変更。
Shell.RegWrite("HKCU\\Software\\Microsoft\\Speech\\Recognizers\\DefaultTokenId","HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Recognizers\Tokens\MS-1033-80-DESK","REG_SZ");
//その状態でRecoContextオブジェクトを生成。
var RecoContextObj=new ActiveXObject("SAPI.SpInProcRecoContext");
//退避しておいた元の認識エンジンに戻す。
Shell.RegWrite("HKCU\\Software\\Microsoft\\Speech\\Recognizers\\DefaultTokenId",OldRecognizer,"REG_SZ");

MSSP での注意

なお、MSSP ではこれらのレジストリを、「インストール時」ではなく「初回起動時(オブジェクト生成時)」に生成するらしく、この点に注意が必要となります。
つまり、例えば上記の方法で作ったスクリプトをテストしようと「仮想環境を用意 → MSSP のインストール → スクリプトの実行」のようなことをすると、スクリプト実行2行目でエラーとなります。
これは、単にインストールしただけでは関連レジストリが生成されておらず、「DefaultTokenId」もないのでその読み込みに失敗するためです。
ですので、もし失敗したらレジストリ生成用の空オブジェクトを作る、といった処理が必要になります。

サンプル HTA

というようなことを踏まえて、日英二つの認識エンジンを同時使用するサンプルを書いてみました。
起動すると以下の日本語・英語を認識します(実行にはあらかじめ MSSP のランタイムおよび MSSP 用の日本語と英語の認識エンジンがインストールされている必要があります)。

日本語 英語
密の味 A Taste Of Honey
抱きしめたい I Want To Hold Your Hand
涙の乗車券 Ticket To Ride
悲しみはぶっとばせ You've Got To Hide Your Love Away
ノルウェーの森 Norwegian Wood
ひとりぼっちのあいつ Nowhere Man
愛こそはすべて All You Need Is Love
ジョンとヨーコのバラード The Ballad Of John And Yoko

日英が対になっているように見えますが、別に連動しているわけではなく、バラバラに同時認識します。
また、認識した文章の発音も表示するようにしてあります。

サンプルの実行

DictHTA02.txt ← 矢印左側の文字の上で右クリックし、「対象をファイルに保存(A)…」して保存します。
保存した TEXT ファイルを右クリックし「プロパティ」を見たときに、「セキュリティ:このファイルは他のコンピュータから取得したものです。このコンピュータを保護するため、このファイルへのアクセスはブロックされる可能性があります。」と書かれている場合は「ブロックの解除」をしてください(しなくても使えますが)。
保存した「DictHTA02.txt」の拡張子(末尾の3文字)を「txt」から「hta」に変更し「DictHTA02.hta」とし、実行します。

関連記事

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

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
03 | 2017/04 | 05
- - - - - - 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 - - - - - -
月別アーカイブ
プロフィール

電脳太助

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

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

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

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

音楽管理(65)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(34)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(26)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(17)
画像管理(15)
WindowsLiveWriter(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
ウォークマン(9)
fi-6130(9)
FLAC(9)
Gracenote(8)
英語音読学習計画(8)
Prolog(8)
JavaScript(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
wxWidgets(7)
spcbght(7)
DCP-J552N(6)
W63CA(6)
MP3Gain(6)
WinRT(6)
iGoinLM(6)
VirtualBox(6)
WindowsLiveMesh(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
楽器演奏(5)
Mery(5)
LAME(5)
音楽技術(5)
GalateaProject(4)
LLVM(4)
nLite(4)
MIDI(4)
ホームページ(4)
WindowsLiveSkyDrive(4)
GalateaTalk(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アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
112位
アクセスランキングを見る>>

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