2012年2月6日月曜日

Microsoft Speech Platform 11.0 で音声認識させる

前回の記事では 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 クラスは認識させたい文法(文章)において、複数パターンある場合に利用するクラスです。ここで登録した単語は、どれを喋っても認識される形になります。

実際に実行すると次のように動作しました。

RecorginizeSample1

最初「きたあにじゃ」とエミュレートした際は失敗で、「北兄者」とエミュレートした際に成功となっているのがわかると思います。これは喋らせる際にもあった読み方の問題が原因です。「北兄者」と設定してはいますが読まれ方が想定している「きたあにじゃ」ではなかったため、認識に失敗しています。

このような場合は、別途読みに対する文字列を設定する事で対応を行います。

   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 クラスを利用して、読みと単語を与えています。このように書き換えて実行すると次のような結果になります。

RecorginizeSample2

今度は「きたあにじゃ」を認識し「北兄者」を認識しませんでした。そして「きたあにじゃ」を認識した際に、認識結果として 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 件のコメント:

コメントを投稿