使用Microsoft.Speech SpeechSynthesizer的例外

时间:2013-05-18 04:13:49

标签: c# text-to-speech speech-synthesis

我正在开发一个语音合成项目,我决定尝试使用Microsoft.Speech命名空间而不是内置的System.Speech命名空间,因为Microsoft没有修复内存泄漏here和建议使用Microsoft.Speech作为解决方法。

当我运行以下程序时,我会在调用NullReferenceException时收到GetInstalledVoices

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Speech.Synthesis;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SpeechSynthesizer synth = new SpeechSynthesizer();
            synth.GetInstalledVoices();
        }
    }
}

当我运行下一个程序时,我会在调用UnauthorizedAccessException时收到Speak(我以管理员身份运行)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Speech.Synthesis;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SpeechSynthesizer synth = new SpeechSynthesizer();
            synth.Speak("exception");
        }
    }
}

我在Windows 8 x64上运行VS Express 2012,该项目已配置为x64。我安装了x64运行时和SDK for Microsoft语音,并安装了来自http://www.microsoft.com/en-us/download/details.aspx?id=27224的en-us语言包。我甚至尝试下载x86运行时和SDK并将我的项目更改为x86,但这会产生PlatformNotSupportedException

我是否缺少其他一些安装,或者我的平台上是否支持Microsoft.Speech命名空间?如果我将using Microsoft.Speech.Synthesis更改为using System.Speech.Synthesis,除了我提到的内存泄漏之外没问题,而且我现在可能已经解决了这个问题,因为这是一个爱好应用程序,而不是用于工作。

4 个答案:

答案 0 :(得分:1)

我花了一些时间,但我意识到我只安装了 MSSpeech_SR_en-US_TELE.msi ,这意味着SpeechRecognition。您需要在安装程序中向下滚动并同时安装文本到语音,例如“MSSpeech_TTS_en-US_Helen.msi”。

答案 1 :(得分:0)

我正在使用eSpeak,而只是从我的.Net程序中弹出他们的命令行程序。这对我来说是一个更好的解决方案,因为eSpeak及其相关的语音很容易安装在多台计算机上 - 如果我使用的是Microsoft语音解决方案,我会被这台计算机上的默认语音所困扰,除非我们为每台计算机购买语音。还有一种机器人声音的eSpeak声音更适合我的项目,因为猜猜是什么,它是一个会说话的机器人头!

答案 2 :(得分:0)

我遇到了同样的问题,并注意到这是第一次运行。因此,为了解决这个问题,我做了一个List<InstalledVoice> InstalledVoices;声明为全局属性的声明。

然后在Form.Load()中,我有这个:

while (InstalledVoices == null)
{
    InstalledVoices = SpeechSynth.GetInstalledVoices().ToList();
}

当我在其上运行调试输出时,它一次失败,然后第二次成功。

这保证您具有已安装音色的集合,并且没有空引用。 SpeechSynth是SpeechSynthesizer类的实例。我将每个InstalledVoice存储在Dictionary<string, VoiceInfo>中,以供以后参考。

答案 3 :(得分:0)

确保您已安装 Windows 更新。

我试图在没有任何更新的情况下安装 Windows 7,但像 SpeechSynthesizer.SelectVoice(SomeVoiceName) 这样的东西会失败。

唯一的解决方案是获取自动 Windows 更新。不确定哪个更新完全解决了问题。

但是当我在没有更新的 Windows 7 虚拟机中测试我的应用程序时,我一次又一次地偶然发现了这个问题。