前回の記事では Speech Platform 11.0 にて喋らせることを行いましたので、今回は音声認識を行ってみます。
音声認識を行うのは SpeechRecognitionEngine クラスです。そして利用するには認識させたい文字(または文章)を Grammar として生成、登録する必要があります。
1: Imports Microsoft.Speech.Recognition
2:
3: Module Module1
4:
5: Sub Main()
6: '認識エンジンの生成
7: Dim sre As New SpeechRecognitionEngine
8: ''認識用語句の作成
9: Dim words As New Choices
10: words.Add(New String() {"北兄者", "兄者", "弟者", "葉鍵兄者", "社長"})
11: '認識させたい文法の作成
12: Dim gb As New GrammarBuilder
13: gb.Append(words)
14: Dim gm As New Grammar(gb)
15: sre.LoadGrammar(gm)
16:
17: '認識処理のエミュレートテスト
18: Dim rRes = sre.EmulateRecognize("きたあにじゃ")
19: If (rRes IsNot Nothing) AndAlso (rRes.Text) IsNot Nothing Then
20: Console.WriteLine("認識しました :" + rRes.Text)
21: Else
22: Console.WriteLine("認識しませんでした(きたあにじゃ)")
23: End If
24:
25: rRes = sre.EmulateRecognize("北兄者")
26: If (rRes IsNot Nothing) AndAlso (rRes.Text) IsNot Nothing Then
27: Console.WriteLine("認識しました :" + rRes.Text)
28: Else
29: Console.WriteLine("認識しませんでした(北兄者)")
30: End If
31:
32: Console.ReadKey()
33: End Sub
34:
35: End Module
このようなロジックで音声認識のテストが行えます。テスト、というのは後半にあるエミュレートテストの部分で、 EmulateRecognize メソッドを利用すると指定した文字列で喋った形で認識エンジンへと渡されます。Choices クラスは認識させたい文法(文章)において、複数パターンある場合に利用するクラスです。ここで登録した単語は、どれを喋っても認識される形になります。
実際に実行すると次のように動作しました。
最初「きたあにじゃ」とエミュレートした際は失敗で、「北兄者」とエミュレートした際に成功となっているのがわかると思います。これは喋らせる際にもあった読み方の問題が原因です。「北兄者」と設定してはいますが読まれ方が想定している「きたあにじゃ」ではなかったため、認識に失敗しています。
このような場合は、別途読みに対する文字列を設定する事で対応を行います。
1: '別の読みを設定して文法の作成
2: Dim words As New Choices
3: words.Add(New SemanticResultValue("きたあにじゃ", "北兄者"))
4: words.Add(New SemanticResultValue("あにじゃ", "兄者"))
5: words.Add(New SemanticResultValue("おとうとじゃ", "弟者"))
6: words.Add(New SemanticResultValue("はかぎあにじゃ", "葉鍵兄者"))
7: words.Add(New SemanticResultValue("めんたろう", "社長"))
8:
9: '認識させたい文法の作成
10: Dim gb As New GrammarBuilder
11: gb.Append(words)
12:
13: Dim gm As New Grammar(gb)
14: sre.LoadGrammar(gm)
15:
16: '認識処理のエミュレートテスト
17: Dim rRes = sre.EmulateRecognize("きたあにじゃ")
18: If (rRes IsNot Nothing) AndAlso (rRes.Text) IsNot Nothing Then
19: Console.WriteLine("認識しました :" + rRes.Text)
20: If (rRes.Semantics IsNot Nothing) AndAlso
21: (rRes.Semantics.Value IsNot Nothing) Then
22: Console.WriteLine(" 認識された語句 :" + rRes.Semantics.Value.ToString)
23: End If
24: Else
25: Console.WriteLine("認識しませんでした(きたあにじゃ)")
26: End If
27:
28: rRes = sre.EmulateRecognize("北兄者")
29: If (rRes IsNot Nothing) AndAlso (rRes.Text) IsNot Nothing Then
30: Console.WriteLine("認識しました :" + rRes.Text)
31: If (rRes.Semantics IsNot Nothing) AndAlso
32: (rRes.Semantics.Value IsNot Nothing) Then
33: Console.WriteLine(" 認識された語句 :" + rRes.Semantics.Value.ToString)
34: End If
35: Else
36: Console.WriteLine("認識しませんでした(北兄者)")
37: End If
今度は Choices クラスに単語を追加する際に、SemantecResultValue クラスを利用して、読みと単語を与えています。このように書き換えて実行すると次のような結果になります。
今度は「きたあにじゃ」を認識し「北兄者」を認識しませんでした。そして「きたあにじゃ」を認識した際に、認識結果として SemantecResultValue クラスで登録した「北兄者」という単語が取得できています。
実際に利用する場合、認識処理を起動させ待機状態にし何かしら認識された場合にイベントを受取る事ができます。
1: '認識処理
2: AddHandler sre.SpeechRecognized, AddressOf SpeechRecognized
3: sre.SetInputToDefaultAudioDevice()
4: sre.RecognizeAsync()
5: Console.WriteLine("認識処理開始・・・")
6:
7:
8: ''' <summary>認識時のイベント</summary>
9: Private Sub SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs)
10: Console.WriteLine("認識しました :" + e.Result.Text)
11: End Sub
上記のように、SpeechRecognized イベントが発生しますので、それを利用して認識時の処理を行う事も可能です。
0 件のコメント:
コメントを投稿