3

这是我的代码:

string _message = "Hello world.";
SpeechSynthesizer _synth = new SpeechSynthesizer();
Prompt _prompt = new Prompt(_message);
_synth.Speak(_prompt);

我一生都无法弄清楚究竟是什么导致了这个错误:

“输入字符串的格式不正确。”

导致此错误的行是当我调用_synth.Speak(_prompt);
EDIT 时:我已在台式计算机上尝试过此代码,它工作正常,因此我在笔记本电脑上的安装有问题。我仍然不太确定如何解决这个问题......

编辑:

堆栈跟踪:

System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffe
r& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo in
fo)
   at System.Speech.Internal.SapiAttributeParser.GetCultureInfoFromLanguageStrin
g(String valueString)
   at System.Speech.Synthesis.VoiceInfo..ctor(VoiceObjectToken token)
   at System.Speech.Internal.Synthesis.VoiceSynthesis.BuildInstalledVoices(Voice
Synthesis voiceSynthesizer)
   at System.Speech.Internal.Synthesis.VoiceSynthesis..ctor(WeakReference speech
Synthesizer)
   at System.Speech.Synthesis.SpeechSynthesizer.get_VoiceSynthesizer()
   at System.Speech.Synthesis.SpeechSynthesizer.Speak(Prompt prompt)
   at TTSTesting.Program.Speak(String _message) in C:\Users\ctanaka\Desktop\TTST
esting\TTSTesting\Program.cs:line 22
4

4 回答 4

3

我决定进入语音密钥寄存器,在备份该密钥后,我一个接一个地删除了所有尝试代码的语音,直到错误消失。错误出现在 Loquendo 声音中。之后,我尝试恢复备份(所有声音)以再次寻找错误并且......操作系统回答无法写入一个值,因为它正在被另一个应用程序使用......这就是神奇的事情:一切正常!

于 2012-11-07T12:37:50.677 回答
1

您机器的注册表乱了,它包含无效的语音配置数据。相关键是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens. 在下方,您会找到已安装的声音。英语机器通常在那里有 MS-Anna,但如果您购买更多,可能还有其他机器。

混乱的值是 Attribute\Language,它不是应有的十六进制数。像“409”一样,英文的 LCID 的十六进制值。

您可以通过卸载添加的声音、删除注册表中的坏声音或修复语言值来修复它。重新安装很棘手,这是 Vista 及更高版本 Windows 设置的一部分。如果您无法修复它,您将需要 superuser.com 的帮助。或您的安装 DVD。

于 2012-04-25T02:57:23.050 回答
1

我有同样的问题。Hans Passant 向我们指出了这样一个事实,即这个 API 从注册表中解析字符串值以检测已安装的语言。我也安装了 Loquendo TTS 语言包。使用 PROCMON 和反复试验,我设法查明导致错误的确切注册表项(语言)。API 期望此字符串仅包含用于整数转换的数字字符。尝试解析和转换此字符串 ("40c") 会触发 FormatException:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Speech\Voices\Tokens\LQBernard\Attributes] "语言"="40c"

变成:

"Language"="40"(删除了尾随的 'c' 字符)。

我为我安装的两个法语 Loquendo TTS 语言包(Bernard 和 Juliette)重复了这个过程,并为我解决了这个问题。

于 2012-10-17T02:53:06.653 回答
0

这可能不是您问题的根源,但在 API 中看起来您应该可以调用

new SpeechSynthesizer().Speak("Hello world.");

并避免所有额外的代码...您是否尝试过删除句点?

于 2012-04-24T19:48:52.130 回答