如何做有关SAPI SPEAK的背景工作

时间:2019-05-21 23:49:29

标签: vb.net

我想在Visual Basic .NET中创建一个说SAPI的后台工作程序,以便允许我的客户端在听SAPI对话的同时继续做某事。 我已经达到了这一点,但是问题是,如果我想重现其他讲话,则无法取消当前讲话并发生异常。

我有以下代码:

'MODULE IMPORTED IN THE MAIN WORK: argsBackgroundWorker.vb
Public Class argsBackgroundWorker
    Public text_to_speak As String
End Class

Private talk As argsBackgroundWorker = New argsBackgroundWorker()

    Private Sub sapitalk_background_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles sapitalk_background.DoWork
        If (My.Settings.help_voice = True) Then 'PASS TRUE
            Dim reproduceText
            Dim text As argsBackgroundWorker = e.Argument

            'I have put this code to cancel... So? :(
            If sapotalk_background.CancellationPending Then Exit Sub

            reproduceText = CreateObject("Sapi.spvoice")
            reproduceText.speak(talk.text_to_talk)
        Else
            sapitalk_background.CancelAsync()
        End If
    End Sub

    Private Sub btn_saysomething_Click(sender As Object, e As EventArgs) Handles btn_saysomething.Click
        'Support in order to cancel tasks.
        sapitalk_background.WorkerSupportsCancellation = True

        talk.text_to_speak = "SOMETHING SOOOOOO SOO SOOOOOO LONG..."

        'Cancel another text being spoken.
        sapitalk_background.CancelAsync()

        'Then, talk the new text.
        sapitalk_background.RunWorkerAsync(talk)        
    End Sub

Private Sub principal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Support in order to cancel tasks.
        sapitalk_background.WorkerSupportsCancellation = True

        talk.text_to_speak = "SOMETHING SOOOOOO SOO SOOOOOO LONG..."

        'Cancel another text being spoken.
        sapitalk_background.CancelAsync()

        'Then, talk the new text.
        sapitalk_background.RunWorkerAsync(talk)   
End Sub

它在作为背景说话时效果很好,但是请注意,当我编译该应用程序时,它开始说很长的文字。而且,如果我单击一个按钮以取消当前的发言并说出另一个文本,则该操作将失败并显示正在运行当前的后台工作程序。

1 个答案:

答案 0 :(得分:0)

我唯一的想法是

While Not sapitalk_background.IsBusy
  sapitalk_background.RunWorkerAsync(talk)     
End While

如果卡在该循环中直到声音停止,那么我认为一旦声音在bg线程上运行就无法停止。