【问题标题】:Exceptions Using Microsoft.Speech SpeechSynthesizer使用 Microsoft.Speech SpeechSynthesizer 的异常
【发布时间】:2021-02-10 05:37:20
【问题描述】:

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

当我运行下面的程序时,当它调用GetInstalledVoices 时,我得到一个NullReferenceException

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();
        }
    }
}

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

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.Synthesis 更改为using System.Speech.Synthesis,除了我提到的内存泄漏之外,一切都很好,我现在可能可以摆脱它,因为这是一个爱好应用程序,不是为了工作。

【问题讨论】:

  • 您是否尝试在 x86 中构建应用程序?
  • @FelicePollano,是的,但它给了我一个PlatformNotSupportedException,即使我当时指向的是 x86 SDK 程序集。
  • 我想我看到了泄漏,ConvertTextFrag.FreeTextSegment() 方法中缺少一行代码。添加 fragment.Free() 应该可以修复泄漏。有点遗憾,这无法解决,似乎没有人对此足够关心以通过 Microsoft 支持解决此问题。可能有太多的爱好项目。反馈文章已经提到了声音问题,听起来你也看到了。

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


【解决方案1】:

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

【讨论】:

  • 无论如何,我这样做了,但仍然遇到同样的问题。但是,我后来意识到我安装了平台的 V11,但安装了语音包的 V10。卸载V10语音,重新安装V11版本,就可以了。
【解决方案2】:

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

【讨论】:

  • @RobertHarvey,是的,并且由提问者回答,不少于。老实说,作为刚开始玩语音的人,微软似乎不太关心如何让这项工作非常好,因此“使用其他东西”成为一个可行的答案。
【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

    确保您已安装 Windows 更新。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 2015-09-18
      • 2012-07-16
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多