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 回答