2012年9月4日火曜日

KINECTサンプル(VB) Speech for SDK1.5

音声認識サンプルのVB版になります。
基本的に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 件のコメント:

コメントを投稿