晚上好。 我正在尝试使用简单的延迟来制作混响效果,但是尽管使用了 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
实例同时播放声音,也可以由睡眠时间抵消。