我正在开发一个语音合成项目,我决定尝试使用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
,除了我提到的内存泄漏之外没问题,而且我现在可能已经解决了这个问题,因为这是一个爱好应用程序,而不是用于工作。
答案 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 虚拟机中测试我的应用程序时,我一次又一次地偶然发现了这个问题。