基本的にC#版と同じですが、チルト制御の代わりに音声合成ができるようにしてみました。
音声合成のために「http://www.microsoft.com/en-us/download/details.aspx?id=27224」から「MSSpeech_TTS_ja-JP_Haruka.msi」をダウンロードしてインストールしてください。
続いてサンプルプログラムです。
MainWindow.xaml
------------------------------------------------------------------------------
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Height="66" HorizontalAlignment="Left" Margin="12,94,0,0" Name="textBox1" VerticalAlignment="Top" Width="479" FontSize="40" Text="" TextAlignment="Center" />
<TextBox Height="24" HorizontalAlignment="Left" Margin="148,193,0,0" Name="textBox2" VerticalAlignment="Top" Width="195" TextAlignment="Center" />
</Grid>
</Window>
------------------------------------------------------------------------------
C#版と同じ内容です。テキストボックスを2つ配置しています。
MainWindow.xaml.vb
------------------------------------------------------------------------------
Imports Microsoft.Kinect
Imports Microsoft.Speech.AudioFormat
Imports Microsoft.Speech.Recognition
Imports Microsoft.Speech.Synthesis
Imports System.IO
Imports System.Media
Class MainWindow
Inherits Window
Private kinect As KinectSensor
Private audio As KinectAudioSource
Private sre As SpeechRecognitionEngine
Private voice As SpeechSynthesizer
Private player As SoundPlayer
Const sreName As String = "SR_MS_ja-JP_Kinect_11.0"
''' <summary>
'''
''' </summary>
''' <remarks></remarks>
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
If KinectSensor.KinectSensors.Count = 0 Then
MessageBox.Show("KINECTが見つかりません。")
Exit Sub
End If
End Sub
''' <summary>
'''
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
''KINECTの初期化
kinect = KinectSensor.KinectSensors(0)
''認識エンジンの初期化
sre = New SpeechRecognitionEngine(sreName)
''音声合成エンジンの初期化
voice = New SpeechSynthesizer
''音声再生用
player = New SoundPlayer
''認識させたい単語
Dim word As Choices = New Choices
With word
.Add("おはよう")
.Add("こんにちは")
.Add("こんばんは")
.Add("キネクト")
.Add("終わり")
.Add("STOP")
.Add("START")
End With
''グラマービルダーの設定
Dim gb As GrammarBuilder = New GrammarBuilder
''言語を認識エンジンに合わせる
gb.Culture = sre.RecognizerInfo.Culture
''単語を登録
gb.Append(word)
''グラマーの準備
Dim g As Grammar = New Grammar(gb)
''認識エンジンにグラマーを登録
sre.LoadGrammar(g)
''イベントの登録
''音声認識用
AddHandler sre.SpeechRecognized, AddressOf sre_SpeechRecognized
AddHandler sre.SpeechRecognitionRejected, AddressOf sre_SpeechRecognitionRejected
''音声合成用
AddHandler voice.SpeakCompleted, AddressOf voice_SpeakCompleted
''KINECTの開始
kinect.Start()
''KINECTのマイク設定
audio = kinect.AudioSource
audio.AutomaticGainControlEnabled = False
audio.EchoCancellationMode = EchoCancellationMode.None
''音声入力の開始
Dim s As Stream = audio.Start()
''入力フォーマットの設定
Dim speechAudioFormat As SpeechAudioFormatInfo = New SpeechAudioFormatInfo(EncodingFormat.Pcm,
16000,
16,
1,
32000,
2,
Nothing)
''認識エンジンに入力ストリームとフォーマットを指定
sre.SetInputToAudioStream(s, speechAudioFormat)
''音声認識開始(非同期、複数認識で)
sre.RecognizeAsync(RecognizeMode.Multiple)
End Sub
Sub sre_SpeechRecognitionRejected(ByVal sender As Object, ByVal e As SpeechRecognitionRejectedEventArgs)
textBox1.Text = "認識できません。"
End Sub
Sub sre_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs)
''認識信頼度が0.7以上の時認識したと判断する
If e.Result.Confidence >= 0.7 Then
''音声合成の準備
player.Stream = New MemoryStream()
voice.SetOutputToWaveStream(player.Stream)
''音声の合成(内部でWAVデータとしている)
voice.SpeakAsync(e.Result.Text & " を認識しました")
''結果の表示
textBox1.Text = e.Result.Text
textBox2.Text = e.Result.Confidence.ToString()
End If
End Sub
Sub voice_SpeakCompleted(ByVal sender As Object, ByVal e As SpeakCompletedEventArgs)
''WAVデータを最初から再生
player.Stream.Position = 0
player.Play()
End Sub
Private Sub Window_Closed(sender As System.Object, e As System.EventArgs) Handles MyBase.Closed
If kinect Is Nothing = False Then
If kinect.IsRunning = True Then
kinect.Stop()
sre.RecognizeAsyncStop()
kinect.Dispose()
End If
End If
End Sub
End Class
------------------------------------------------------------------------------
赤字の部分は音声合成を利用するための記述になります。
音声認識の部分はC#版と同じです。コメントを読めば何をしているのか理解できるかと思います。
認識できた言葉に応じて自動応答ができるようにもなりますね。
0 件のコメント:
コメントを投稿