VB.net SpeechSynthesizer通知

时间:2012-07-14 15:30:10

标签: vb.net vb.net-2010 speech-synthesis

我在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事件被触发时,我在哪里编写要执行的代码?

1 个答案:

答案 0 :(得分: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