1

VB.netでSpeechSynthesizer()を使用しています

スピーカーがすべてのデータを話し終えたことをどのように検出できますか?

私はこのコードを持っています:

        repetitionCounter = 0
        Do
            speaker.SpeakAsync(textIntroduction.Text)
            repetitionCounter += 1
            If repetitionCounter = repeatXNumberOfTimes Then
                MsgBox("Done")
                Exit Do
            End If
        Loop

ただし、Doが開始されるとすぐに、MsgBoxがすぐに起動します。これは、.SpeakAsyncコマンドがメモリに読み込まれるため、repeatXNumberOfTimesがすぐに完了するためだと思います。

コードを次のように変更できます。

      speaker.Speak(textIntroduction.Text)

これで動作します。ただし、フォームが「ロックアップ」し、フォームを操作できなくなります。Application.DoEvents()を実装しようとしましたが、フォームはまだ「ロックアップ」しています。

フォームをロックせずにスピーカーがスピーチを終了したときに通知を受け取るにはどうすればよいですか?

また、スピーカーにテキストを無限に再生させたい場合、これをどのように実装する必要がありますか?

*更新

これが私のコードです:

     Dim speaker As New SpeechSynthesizer()
     Public Event SpeakCompleted As EventHandler(Of SpeakCompletedEventArgs)
     Dim handler As EventHandler(Of SpeakCompletedEventArgs)

Form_Load()で、次のコードを追加しました。

     AddHandler speaker.SpeakCompleted, handler

それはどのように行われるべきですか?SpeakCompletedイベントが発生したときに実行されるコードはどこに記述すればよいですか?

4

1 に答える 1

2

SpeakCompletedイベントを確認する必要があります。

リンクから:

SpeechSynthesizerは、SpeakAsync()またはSpeakSsmlAsync(String)メソッドのいずれかが完了すると、SpeakCompletedイベントを発生させます。SpeakCompletedEventArgsを使用して、SpeakCompletedイベントのハンドラーを作成できます。


イベントを作成する必要はありません。イベントはすでにSpeachSynthesizerの一部です。この単純なコマンドラインの例のように、イベントの署名に一致するサブルーチンを作成し、それをイベントに追加するだけです。

Imports System.Speech.Synthesis

Module Module1
    Dim speaker As New SpeechSynthesizer()
    Sub Main()

        AddHandler speaker.SpeakCompleted, AddressOf SpeachComplete
        speaker.SpeakAsync("This is a test speach to see if the speach complete event raises")

        Console.ReadLine()
    End Sub

    Private Sub SpeachComplete(sender As Object, e As SpeakCompletedEventArgs)
        MsgBox("Speach Done")
    End Sub

End Module
于 2012-07-14T16:17:41.090 に答える