InstalledVoices.All返回未安装的语音

时间:2013-09-25 19:45:17

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

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

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并没有说实话,因为西班牙语并没有真正安装。

有没有可靠的方法来确保它确实存在?

1 个答案:

答案 0 :(得分:0)

我从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),这意味着将此代码放在静态初始化程序中并不是一个好主意。