SpeechSynthesizer.SpeakAsync方法不立即说话

本文关键字:SpeakAsync 方法 SpeechSynthesizer | 更新日期: 2023-09-27 18:07:18

我试图使用SpeakAsync()方法来讲一些文本。然而,直到我调用Speak(),它才开始说话。我不想调用Speak()。如果我从这段代码中删除Speak()方法,就不会调用任何东西:

        using (SpeechSynthesizer synth = new SpeechSynthesizer())
        {
            synth.SelectVoice("ScanSoft Emily_Dri20_22kHz");
            synth.Rate = 10;
            synth.Volume = 100;
            synth.SpeakAsync("oh, i'm a lumberjack and i'm okay!  I sleep all night and I work all day!");
            synth.SpeakAsync("If he was dying he wouldn't bother writing ah!  He'd just say it!");
            synth.Speak("i don't want to go on the cart.");
            synth.SpeakAsync("We don't have a lord.  We're an anarcho-syndicalist commune.");
            synth.SpeakAsync("If you do not show us the grail, we shall take your castle by force!");
            synth.Speak("what do you mean, an african swallow or a european swallow?");
更新:

似乎其他人也有这个问题,但还没有找到解决方案:

其他有此问题的人

SpeechSynthesizer.SpeakAsync方法不立即说话

这是因为Speak是一个阻塞调用,它保持程序运行。由于您将它作为控制台应用程序运行,因此在代码末尾添加Console.ReadKey();,以确保应用程序在用户按下键之前保持运行。

否则,主线程将退出,因为SpeakAsync立即返回,所以你的程序正在飞过所有这些行,然后退出,这就是为什么你没有听到任何声音。

基于注释更新-

using块几乎立即释放了SpeechSynthesizer,这就是为什么什么都听不到的原因。您可以将Console.ReadKey();放在using块的右括号之前,或者删除using块并稍后手动处理它。