我在墨西哥西班牙语中尝试使用文本到语音合成时遇到问题。我首先检查是否安装了西班牙语音:
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
并没有说实话,因为西班牙语并没有真正安装。
有没有可靠的方法来确保它确实存在?
答案 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),这意味着将此代码放在静态初始化程序中并不是一个好主意。