2012-04-24 26 views
3

は私のコードです:スピーチシンセサイザーは、「入力文字列が正しい形式ではありませんでした」ここ

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

私は私の人生のために、このエラーを引き起こしている正確に何を把握することはできません。

「入力文字列が正しい形式ではありませんでした。私は_synth.Speak(_prompt);
EDITを呼び出すときに、このエラーが発生し

行がある:私は私のデスクトップコンピュータ上でこのコードを試してみましたし、何かが私の私のラップトップにインストールすると間違っているので、それが正常に動作します。それでも私はこの問題を解決するかどうかは、あまりにもわからないんだけど...

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 
+1

サイドノートとして、私はこの正確なコードを自分の他のPCで試してみましたが、問題なく動作していたようです。 – Bob

+0

その方法に関する文書はありますか? – Tudor

+0

これはhttp://msdn.microsoft.com/en-us/library/ms586905.aspxですか? –

答えて

1

あなたのマシンのレジストリが壊れています。無効な音声構成データが含まれています。関連するキーはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokensです。下には、インストールされた音声があります。英語のマシンには一般的にMS-Annaがありますが、購入した場合は他にもあります。

アタックされた値はAttribute \ Languageで、16進数ではありません。 "409"のように、英語のLCIDの16進値。

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

+0

言語のレジストリ値をチェックしたところ、すでに409に設定されているようです。また、Windows 7スピーチプロパティのスピーチプレビューテキストも機能しますので、ライブラリ.dllがうんざりしていますか? – Bob

+0

それはフレームワークアセンブリです、あなたはそれを台無しにするために本当に懸命に働かなければならないでしょう。最初のものだけでなく、リストされているボイスのすべて*を確認してください。 SysInternalのProcMonツールを使用して、レジストリを読み取るフレームワークコードを確認します。 64ビットオペレーティングシステムには複雑な問題があります。 –

+0

レジストリに記載されている唯一の声はMS Annaです。 ProcMonを使用してレジストリを読み取るフレームワークコードは、どのくらい正確に見えますか? – Bob

0

これが問題の原因ではないかもしれないが、それはのように見えますあなただけ

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

を呼び出し、すべての余分なコードを避けることができるはずAPI ...あなたはピリオドを削除しようとしましたか?

+0

期間の削除は何もしないようです。私は、完全な文章から簡単な文章までさまざまな組み合わせを試してきましたが、それでもエラーを投げかけています。 – Bob

+0

@therealmitchconnorsのように、 'Prompt'クラスを完全に削除して'文字列 'を直接' Speak'して、問題を引き起こしているかどうかを確認しているようです。 –

1

私は同じ問題を抱えていました。 Hans Passantは、このAPIがインストールされた言語を検出するためにレジストリから文字列値を解析するという事実を指摘しました。私もLoquendo TTS言語パックをインストールしました。 PROCMONと試行錯誤を使用して、エラー(Language)の原因となった正確なレジストリキーを特定することができました。 APIは、この文字列が整数変換のための数字のみを保持することを期待しています。この文字列( "40C")を解析し、変換しようとFormatExceptionをトリガー:

[HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432NODE \マイクロソフト\スピーチ\声\トークン\ LQBernard \属性] "言語" = "40C"

"言語" = "40"(末尾の 'c'文字が削除されました)に変更されました。

私のインストールしたフランス語のLoquendo TTS言語パック(BernardとJuliette)の両方でこのプロセスを繰り返してくれて解決しました。

+0

質問に本当に答えません。 –

+0

私は違います。 Speech Synthesis APIを使用しようとするとBobにFormatExceptionが発生しました。 Hans Passantは、このAPIがインストールされた言語を検出するためにレジストリから文字列値を解析するという事実を指摘しました。 Bobと私はどちらもLoquendo TTS言語パックをインストールしました。 PROCMONと試行錯誤を使用して、エラー(Language)の原因となった正確なレジストリキーを特定することができました。数値以外の文字を含む文字列を解析して整数に変換しようとすると、FormatExceptionが発生します。 CQFD。 – fstarnaud

+0

よかったら、私はそれを認めます。しかし、それは明らかではなかった_how_これは質問に答える。あなたがコメントに含まれている情報を含めるようにあなたの答えを編集するなら、私はdownvoteを削除することができます。 –

3

私は音声キーレジスタに入ることを決断しました、そして、そのキーのバックアップの後に、エラーが消えるまで、毎回コードを試しているすべての声を1つ削除しました。エラーはLoquendoの声であった。 その後、もう一度エラーを探してバックアップを復元しようとしましたが... OSは別のアプリケーションで使用されていたために値を書き込めないと答えました...それは魔法のことです:すべてうまくいった!

関連する問題