ひらがなだけの音声認識出力を作る(System.Speech)
以上の内容で、出力がひらがな100%になるのではないかと思います。
音声認識の認識結果にはLexicalFormというプロパティがあります。
LexicalFormは正規化されていないテキストを出力するプロパティです。
正規化は、例えば「こんにちわ」という聞き取った結果に対して「こんにちは」と整理したり、「きょうわごがつにじゅうににちです」に対して「今日は5月22日です」と変換するものです。
ダイレクトな聴き取り結果に対して、テキストとしてよりふさわしく調整を行うのが正規化だと思っています。
上のコードの解説をすると、
①For Each Convertion In e.Result.Words
ひらがなの結果であるLexicalFormを取得するためには、RecognizedWordUnitクラスの内容を使う必要があります。
RecognizedWordUnitはどうやら内容を小分けに取得しなければいけないみたいで、そのためにFor Eachを使います。
For Eachの変数Convertionは、最初の試みではRecognizedWordUnit型の変数を宣言したりもしたのですが、WordsプロパティにRecognizedWordUnitがあって、それでここに組み込むだけで自然とその型を身につけるようでもあります。
②
If System.Text.RegularExpressions.Regex.IsMatch(Convertion.Text, "^\p{IsHiragana}*$") = True Then 以下
これは、もう一つのプロパティであるTextの内容がひらがなであるかどうかを見ています。もしひらがなだったら、Convertion.Textの内容を適用するという流れになっています。
Wordsプロパティの中には、すでに正規化されたテキストであるTextと正規化される前のテキストであるLexicalFormが含まれています。
もしひらがなを検知したら、
③If Convertion.LexicalForm <> Convertion.Text Then 以下
そのひらがなの内容がLexicalFormとTextで合っていないときは(例えば、LexicalFormでは「お」だけど、正規化後では「を」になっている場合とか)
Textを適用しようという流れになっています。
そして②で読み取った内容が漢字だったら、それはLexicalFormを適用してひらがなで取得しよう、とのように。
これらの内容は、聞き取った内容の発音記号を取得しよう(Pronunciationプロパティの取得)にも応用できると思う。いろいろな作成に役立てば良いと思う。
音声認識の機能のSystem.Speechの中でSpeechRecognitionEngineとSpeechRecognizerの2つの出力方法に分かれている。後者は特徴的で、一度Windowsの音声認識アシスタントが立ち上がる。
認識結果を比較すると、体感的には後者のSpeechRecognizerの方が良く認識していると思う。声を吹き込むにも工夫があるのかもしれないけども、かなり満足した内容や流れを得られることもある。
それぞれでいろいろ使いながらやってみてほしい。
結局は漢字で出力されるはずの内容を、ひらがなに直しているだけではある。もっと手軽にTwitterに書こうとも思ったけど、よりもこうした内容にした方がいいと思って書いてみた。
もし何らかの追記したい事項があるなら、また書き加えられればと思う。