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

私は声のキー登録に行くことを解決し、そのキーのバックアップの後、エラーが消えるまでコードを試すたびにすべての声を1つずつ削除しました. エラーはロケンドの声でした。その後、もう一度エラーを探してバックアップ (すべての音声) を復元しようとしましたが、OS は、値が別のアプリケーションで使用されているため、値を書き込めないと答えました... それは魔法のことです: すべて正常に機能しました!

于 2012-11-07T12:37:50.677 に答える
1

お使いのマシンのレジストリがめちゃくちゃです。無効な音声構成データが含まれています。関連するキーはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens. その下に、インストールされているボイスがあります。通常、英語のマシンには MS-Anna がありますが、さらに購入した場合は他のマシンが存在する可能性があります。

めちゃくちゃな値は Attribute\Language です。本来あるべき 16 進数ではありません。"409" のように、英語の LCID の 16 進数値。

追加した音声をアンインストールするか、レジストリ内の悪い音声を削除するか、言語の値を修正することで修正できます。再インストールはトリッキーです。これは、Vista 以降の Windows セットアップの一部です。修正できない場合は、superuser.com の助けが必要です。またはセットアップ DVD。

于 2012-04-25T02:57:23.050 に答える
1

私も同じ問題を抱えていました。Hans Passant は、この API がレジストリからの文字列値を解析して、インストールされている言語を検出するという事実を指摘してくれました。私も Loquendo TTS 言語パックをインストールしていました。PROCMON と試行錯誤を使用して、エラーの原因となった正確なレジストリ キー (Language) を特定することができました。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 に答える