2

我正在做一个语音合成项目,我决定尝试使用 Microsoft.Speech 命名空间而不是内置的 System.Speech 命名空间,因为 Microsoft 没有修复这里的内存泄漏,并建议使用 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。我为 Microsoft 语音安装了 x64 运行时和 SDK,并从http://www.microsoft.com/en-us/download/details.aspx?id=27224安装了 en-us 语言包。我什至尝试下载 x86 运行时和 SDK 并将我的项目更改为 x86,但这会导致PlatformNotSupportedException.

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

4

4 回答 4

1

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

于 2014-02-22T23:31:22.397 回答
0

我改用eSpeak,只是从我的 .Net 程序中向他们的命令行程序发起攻击。这对我来说是一个更好的解决方案,因为 eSpeak 及其相关的语音很容易安装在多台计算机上 - 如果我使用 Microsoft Speech 解决方案,我会被该计算机上的默认语音卡住,除非我们为每台计算机购买语音. 还碰巧听起来像机器人的 eSpeak 声音更适合我的项目,因为猜猜看,它是一个会说话的机器人头!

于 2013-05-22T15:25:22.580 回答
0

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

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

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

当我对此运行调试输出时,它失败了一次,然后第二次成功了。

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

于 2018-12-03T12:26:10.453 回答
0

确保您已安装 Windows 更新。

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

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

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

于 2021-02-09T21:37:20.403 回答