【问题标题】:InstalledVoices.All returns voices that are not installedInstalledVoices.All 返回未安装的声音
【发布时间】:2016-09-06 22:59:14
【问题描述】:

我在尝试使用墨西哥西班牙语的文本到语音合成时遇到问题。我首先检查是否安装了西班牙语语音:

String Text = "some text in Spanish";

IEnumerable<VoiceInformation> spanishVoices = from voice in InstalledVoices.All
    where voice.Language == "es-MX"
    select voice;

if (spanishVoices.ElementAt(0) != null)
    synth.SetVoice(spanishVoices.ElementAt(0));

await synth.SpeakTextAsync(Text);

现在,调试器显示 spanishVoices.ElementAt(0) 不为空,但我得到一个 System.IO.DirectoryNotFoundException,如果我注释掉 if 块不会发生这种情况(并且我得到的文本发音就像它是写的一样英文)。

查看手机语音设置后发现手机需要下载西班牙语语音。完成此操作后,应用程序按预期工作。

所以,问题在于InstalledVoices.All 没有说实话,因为西班牙语并没有真正安装。

有什么可靠的方法可以确定它是真的吗?

【问题讨论】:

  • 我怀疑异常已经达到了预期效果。
  • 您是否看到与SpeechSynthesizer.GetInstalledVoices() 相同的行为?

标签: windows-phone-8 text-to-speech


【解决方案1】:

我从 7.5 开始就在 WP 上工作,它一直是一个令人沮丧和有问题的平台。

我能想到的唯一方法是列出真正那里的声音:

var voices = new List<VoiceInformation>();
using (var s = new SpeechSynthesizer())
{
    foreach (var v in InstalledVoices.All)
    {
        try
        {
            s.SetVoice(v);
            s.SpeakTextAsync(" ").AsTask().Wait();
            voices.Add(v);
        } catch (Exception) { }
    }
}

请注意,设置声音不会失败,需要运行 TTS 才能失败...看起来平台认为声音在那里,但文件与“语音库”不是。

另请注意,由于抛出异常(源自 COM),这段代码需要几秒钟才能运行,这意味着将这段代码放在静态初始化程序中并不是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多