首页 > 解决方案 > SAPI SPEAK 如何做一个后台工作人员

问题描述

我想在 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

它可以很好地作为背景朗读,但请注意,当我编译应用程序时,它会开始朗读长文本。如果我单击一个按钮来取消当前的讲话并讲另一个文本,它会失败并告诉我它正在运行当前的后台工作人员。

标签: vb.net

解决方案


我唯一的想法是

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

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


推荐阅读