SpeechSynthesizer.SpeakAsync方法不是马上说的

gon*_*ins 3 .net c# text-to-speech

我试图使用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?");
Run Code Online (Sandbox Code Playgroud)

更新:

似乎其他人遇到此问题,但尚未找到解决方案:

其他人有这个问题

key*_*rdP 5

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

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

根据评论更新 -

using区块SpeechSynthesizer几乎立即处理,这就是为什么什么都听不到.您可以将其放置Console.ReadKey();using块的右大括号之前,也可以移除using块并稍后手动处理.

  • 您的异步代码位于`using'块内,因此几乎立即处理`SpeechSynthesizer`.删除`using'块并手动处理处理或在`using`块关闭之前放置`Console.ReadKey()`. (3认同)