スポンサーサイト

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

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

Windows の音声認識を JavaScript で(カナ取得編)

2012年03月08日(木)01時03分

3種類の文字列

例えば「2012年」を表現する文字列として、アラビア数字による「2012年」よりも、漢数字の「二千十二年」という表記の方が適している場面もあるかと思います。
あるいは、ひらがなの「にせんじゅうにねん」という読み仮名が必要なこともあるかもしれません。
Windows の音声認識では、内部的にこういった漢数字や読み仮名の情報も生成されており、今回はそれを取得する方法に関するお話です。
この記事は、前回までに書いてきた一連の音声認識の記事の続きになりますので、必要に応じて「基礎編」「録音再生編」「WAVE ファイル入力編」「HTA 編」を参照ください。

サンプルの内容

今回のサンプルは、できることは前回「HTA 編」の「DictHTA00.txt」とほぼ同じで、マイクから入力された音声を文字列化して表示、を繰り返します。
ただ、テキスト表示領域が3段に分かれており、上から「アラビア数字」「漢数字」「読み仮名」を表示します。

サンプルの実行

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

DictHTA01

「漢数字」および「読み仮名」の取得

Windows の音声認識は、内部的に「単語単位」で分割されており、認識結果として返されるのは、それらの各単語情報の集合体(配列)です。
つまり、「今日の天気は晴れです」と言った場合、「今日/の/天気/は/晴れ/です」に分割されて、それぞれの単語情報が「PhraseInfo.Elements」というプロパティに配列としてまとめられて返されます。
そして、各単語情報には「DisplayText」と「LexicalForm」というプロパティがあり、「DisplayText」には漢数字が、「LexicalForm」には読み仮名が格納されています。
つまり、各単語情報からこれらの文字列を読み出し、つなぎ合わせることで、漢数字文字列や読み仮名を取得することができるわけです。
例えば、「漢数字」文字列を変数「TempText」に取得する場合、認識時に呼び出されるイベントハンドラ内で以下のように記述します。

for(var i=0;i<Result.PhraseInfo.Elements.Count;i++)TempText+=Result.PhraseInfo.Elements.Item(i).DisplayText;

同様に、「読み仮名」文字列を取得する場合には、「DisplayText」を「LexicalForm」に替え、以下のようにします。

for(var i=0;i<Result.PhraseInfo.Elements.Count;i++)TempText+=Result.PhraseInfo.Elements.Item(i).LexicalForm;

「アラビア数字」および「漢数字」の取得

前回までのサンプルでは、認識文字列の取得に GetText 関数を使用してきました。
この GetText 関数は3つの引数をとることができ、一つ目は文字列の取得開始位置、二つ目は取得文字数、そして三つ目は文字を置き換えるかどうか、となっています。
ここで第三引数に「true」、つまり「文字を置き換える」ことを指示すると、「アラビア数字」文字列が得られます。
例えば以下のような記述で、変数「TempText」に「アラビア数字」文字列を取得します。

TempText=Result.PhraseInfo.GetText(0,-1,true);

ここで、以下のように第三引数を「false」にすると「漢数字」文字列、つまり「DisplayText」をまとめたものと同じ文字列が得られます。

TempText=Result.PhraseInfo.GetText(0,-1,false);

英語認識では

ちなみに英語認識の場合、「読み仮名」に相当するものがありません(しいて言うならば発音記号かと思いますが)。
で、SDK 付属の HELP ファイルでは、「two dollars」と発話した場合、DisplayText プロパティに「$2」が設定され、LexicalForm プロパティに「two dollars」が設定される、というようなことが書かれています。
つまり英語認識では、GetText 関数の第三引数が、「true = DisplayText」「false = LexicalForm」と一対一で対応しているわけです。
…というはずなのですが、実際に「WinXP + Microsoft English Recognizer v5.1」の環境下で、「fifty dollars」と発話して認識させてみたところ、GetText 関数(第三引数「true」)のみ「$50」となり、DisplayText プロパティと LexicalForm プロパティではどちらも「fifty dollars」となっていました。
ただ、「ampersand」とすると、GetText 関数と DisplayText プロパティが「&」で、LexicalForm プロパティのみ「ampersand」となりましたので、単に GetText 関数のみがアラビア数字化(あるいは記号化)される、というわけでもないようです。

区切り記号

なお、今回のサンプルを英語音声認識に使用すると、二段目と三段目の表示領域には、例えば「Iloveyou」といったように、全てつながった状態で出力されます。
これは、DisplayText プロパティで単語ごとに「I/love/you」と渡されてくるものを、サンプル中ですべて連ねて出力しているためで、日本語だと分かち書きをしないためそれで構わないのですが、英語の場合は以下のようにして、各単語の後ろにスペース等の区切り記号を付加する方が見やすくなると思います。

for(var i=0;i<Result.PhraseInfo.Elements.Count;i++)TempText+=Result.PhraseInfo.Elements.Item(i).DisplayText+" ";

英語の発音

ここからはまったくどうでもいい余談ですが、自身の英語発音の問題で、上記「英語認識では」の項を書くのにはとても時間がかかっています。
まず、Microsoft Sam(WinXP 標準の英語音声合成話者)に「50$」を読ませ、それを真似してマイクに話しかけるのですが、何十回やってもうまく認識してもらえず、結局、一時間近く(以上?)はマイクに向かって「fifty dollars」と繰り返すことになりました。
「fifty does」という結果が比較的多かった気がしますので、やはりありがち?な「L」の発音に大きな問題を抱えているようです。
そして、なぜ「fifty」なのか?といいますと、最初は HELP ファイルの例にある「two dollars」や、SMAP(あるいは林田健司?)でなじみのある「$10」で試していたのですが、これらは「dollars」はもとより「two」や「ten」からしてろくに認識してもらえず、他にいくつか試した中では「fifty」が一番マシだった、という悲しい理由だったりします(そしてそれを考えると、もはや「L」の発音がどうこうという程度の話ではない、ともいえます)。
追加して白状しますと、上の項では「&(ampersand)」という語に対する結果も例として挙げていますが、これも実は「10%(ten percent)」で試していた時に誤認識で偶然得られた結果で、その後、再確認のため「ampersand」を繰り返すも二度と成功せず、さらに言えば「ten percent」の方も結局最後まで一度も成功しませんでした。

英語発音の教師としては?

では、これを英語発音矯正のための教師役として使えるか?というと、使えなくはないと思いますが、いくつか問題に感じる点もあります。
まず一番重要な点として、(発音練習用に作られたようなものではない)一般的な音声認識システムであれば、実用性を高めるため、多少あいまいな発音であっても何とか正しく認識するように、様々な工夫を凝らしてあるはずだ、ということがあります(それでもまともに認識されなかった自分の発音も相当なものですが…)。

認識は「文章単位」で

例えば、その「工夫」の一つとして、多くの音声認識システムでは、「単語の繋がり」という情報を持ち、それを使って「より正しそうな結果」を導き出しているそうです。
もし「芥川」という単語を認識することができれば、それには「龍之介」や「賞」が続くことが多いと予想できます。
あるいは「漱石」という語があれば、その前は「夏目」である可能性が高い、というようなことがわかるわけです。
これらの情報を使い、単語単位での認識終了後に、文章全体を前から後ろから、確率の高いつながりで補正するのです。
つまり「文章単位」で認識させた場合、前後の単語がしっかり発音できていれば、挟まれた一語の発音が多少怪しくとも、正しい文章を構築できる可能性がある、ということです(そしてこのことが「発音教師」としての問題点の一つでもあります)。
これをさらに言い換えますと、音声認識利用時には「単語単位」で区切って認識させるより、「文章単位」でまとめて認識させた方が認識率が高くなる、といえます。

知らない単語は認識できない

もう一つ、「発音教師」としての問題点として、認識エンジンの辞書に登録されていない単語は認識できない、ということがあります。
例えば、WinXP の発売時期から考えますと、「Clinton(クリントン)」は認識できる可能性が高いと思いますが、「Obama(オバマ)」はネイティブが正確に発音したとしても、認識できないのではないかと予想されます。
さらに別の問題として、これもまた実用性の問題から、似たような発音になる単語やフレーズであれば、より一般的で使用頻度の高いものに補正されるようになっているであろう、と思われることがあります。
つまり、普通はあまり使われることのない単語や言い回し等は、きちんと発音していても、平易な日常語に誤認される可能性がある、ということです。
そしてまた、これらのこともあり、認識がうまくいかない場合に、それが「自分の発音の問題」なのか、あるいは「認識システムの問題」なのかを判断する必要がある、という困った問題もあります。
これがもし認識システム側の問題で、例えば「この単語はネイティブがきちんと発音しても正しく認識されない」ということであれば、何百回繰り返し練習しても、まさに「時間の無駄」になるわけですが、そもそもそれが確認できるほどの発音ができるのであれば練習する必要もない、という矛盾を抱えていることになります。

関連記事

【同じタグを付けた記事の一覧】
プログラミング JavaScript eラーニング 音声技術 語学学習 音声認識

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
08 | 2017/09 | 10
- - - - - 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拍手ランキング
ユーザータグ

音楽管理(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アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
162位
アクセスランキングを見る>>

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