Microsoft 语音.合成异步语音不是异步



晚上好。 我正在尝试使用简单的延迟来制作混响效果,但是尽管使用了 SpeakAsync 方法,代码仍无法继续执行。

我在任何地方都找不到关于这个问题的文档,所以我非常感谢你能提供的任何提示。 谢谢你的时间!我在Visual Studio 2017中使用System.Speech版本4.0.0。我的目标是运行时 4.5.2

Imports System.Speech.Synthesis
Imports System.Threading
Imports System.Threading.Tasks
Module Module1
Sub main()
    Dim SpeechString As String = "This is a test phrase, there are many 
like it, but this one is mine."
    Call OutSpeech(1, 100, SpeechString)
End Sub

Sub OutSpeech(SpeechRate As Integer, SpeechVolume As Integer, SpeechText As String)
    Dim SpeechHolder As New SpeechSynthesizer
    SpeechHolder.Rate = SpeechRate
    SpeechHolder.Volume = SpeechVolume
    SpeechHolder.SpeakAsync(SpeechText)
    Thread.Sleep(100)
    SpeechHolder.SpeakAsync(SpeechText)
    Console.ReadLine()
End Sub

终端模块

按顺序调用SpeechHolder.SpeakAsync(SpeechText)只会对输出进行排队,并且语音不会重叠。

混响效果是一种回声效果,其中快速波在短时间内合并在一起。因此,要获得类似混响的效果,请生成两个或多个相同的声音,每个声音之间都有延迟。

Reverb()方法将调用两次OutSpeech(),设置适当的延迟(100ms似乎适合获得结果(。

Sub Reverb()
  Dim Delay As Integer = 100
  Dim SpeechString As String = "This is a test phrase, there are many like it, but this one is mine."
  OutSpeech(1, 100, Delay, SpeechString)
  OutSpeech(1, 100, Delay, SpeechString)
End Sub

OutSpeech() 方法变为异步方法,因此在创建新的合成器时,调用将重叠。
将创建两个任务。一个用于设置延迟,一个用于 (a( 在合成器"说话"时等待,测试SpeechHolder.State

Async Sub OutSpeech(SpeechRate As Integer, SpeechVolume As Integer, Delay As Integer, SpeechText As String)
    Using SpeechHolder As SpeechSynthesizer = New SpeechSynthesizer
        SpeechHolder.Rate = SpeechRate
        SpeechHolder.Volume = SpeechVolume
        Await Task.Run(Async Function() As Task(Of Boolean)
                       SpeechHolder.SpeakAsync(SpeechText)
                       Await Task.Delay(Delay)
                       Await Task.Run(Sub()
                                          While SpeechHolder.State = SynthesizerState.Speaking
                                          End While
                                      End Sub)
                       Return True
                   End Function)
    End Using
End Sub
深入研究它

似乎System.Speech.dll排队说话操作。因此,即使语音将异步开始,它也一次只会播放一个。

这是我在我认为这是必须发生的事情之前进入反编译程序集的情况:

private void AddSpeakParameters(VoiceSynthesis.Parameters param)
{
    lock (this._pendingSpeakQueue)
    {
        this._pendingSpeakQueue.Enqueue(param);
        if (this._pendingSpeakQueue.Count == 1)
        {
            this._evtPendingSpeak.Set();
        }
    }
}

您可以使用多个 SpeechSynthesizer 实例同时播放声音,也可以由睡眠时间抵消。

相关内容

  • 没有找到相关文章

最新更新