Входная строка синтезатора речи имеет неправильный формат

Вот мой код:

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

Я не могу понять, что именно вызывает эту ошибку:

"Входная строка имеет неверный формат."

Строка, которая вызывает эту ошибку, возникает, когда я вызываю _synth.Speak(_prompt);
РЕДАКТИРОВАТЬ: я попробовал этот код на своем настольном компьютере, и он работает нормально, поэтому что-то не так с моей установкой на моем ноутбуке. Тем не менее, я не слишком уверен, как это исправить...

РЕДАКТИРОВАТЬ:

Трассировка стека:

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

person Bob    schedule 24.04.2012    source источник
comment
В качестве примечания я попробовал этот точный код на своем другом компьютере, и он, похоже, работал нормально.   -  person Bob    schedule 24.04.2012
comment
Любая документация по этому методу?   -  person Tudor    schedule 24.04.2012
comment
Какая строка выдает ошибку? Вы уверены, что это из того блока кода?   -  person recursive    schedule 24.04.2012
comment
@MrLister да, я использую эту библиотеку.   -  person Bob    schedule 25.04.2012
comment
@recursive Это последняя строка, в которой я действительно вызываю синтезатор речи: _synth.Speak(_prompt);   -  person Bob    schedule 25.04.2012
comment
Можете ли вы скопировать стек вызовов исключения? Это может показать, что ошибка произошла внутри библиотеки. Честно говоря, не похоже, что этот код является проблемой.   -  person Adam V    schedule 25.04.2012
comment
Я уже видел сообщение об этой ошибке. По крайней мере, в этом случае программист пытался заставить польскую машину говорить по-английски. Что-нибудь похожее? Он также не опубликовал трассировку стека, поэтому ее невозможно диагностировать.   -  person Hans Passant    schedule 25.04.2012
comment
@Adam Адам - ​​Да, я считаю, что это проблема с библиотекой. Я возился с другими движками преобразования текста в речь, и мне пришлось установить несколько вещей... это может быть причиной. Я удалил другие двигатели, но все равно не повезло. Есть ли способ переустановить исходную библиотеку?   -  person Bob    schedule 25.04.2012
comment
@HansPassant - Да, я считаю, что это проблема с библиотекой. Я возился с другими движками преобразования текста в речь, и мне пришлось установить несколько вещей... это может быть причиной. Я удалил другие двигатели, но все равно не повезло. Есть ли способ переустановить исходную библиотеку?   -  person Bob    schedule 25.04.2012


Ответы (4)


Реестр вашей машины перепутан, он содержит неверные данные конфигурации голоса. Соответствующий ключ — HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens. Внизу вы найдете установленные голоса. На английской машине обычно есть MS-Anna, но могут быть и другие, если вы приобрели больше.

Перепутанное значение — это Attribute\Language, это не шестнадцатеричное число, как должно быть. Как и "409", шестнадцатеричное значение LCID для английского языка.

Вы можете исправить это, удалив добавленные вами голоса, удалив плохие голоса в реестре или исправив значение языка. Переустановка сложна, это часть установки Windows на Vista и выше. Вам понадобится помощь от superuser.com, если вы не можете это исправить. Или ваш установочный DVD.

person Hans Passant    schedule 25.04.2012
comment
Я проверил значение реестра для языка, и, похоже, оно уже установлено на 409. Также работает предварительный просмотр преобразования текста в речь в свойствах речи Windows 7, так что, возможно, библиотека .dll перепуталась? - person Bob; 25.04.2012
comment
Это сборка фреймворка, вам придется очень постараться, чтобы все испортить. Проверьте все голоса в списке, а не только первый. Используйте инструмент SysInternal ProcMon, чтобы увидеть, как код фреймворка читает реестр. В 64-битной операционной системе возможны сложности. - person Hans Passant; 25.04.2012
comment
Единственным голосом, занесенным в реестр, является MS Анна. Как именно я вижу код фреймворка, читающий реестр с помощью ProcMon? - person Bob; 25.04.2012
comment
Вы были правы, я обнаружил, что на самом деле у меня установлено некоторое программное обеспечение Loquendo TTS. После удаления все работает нормально. - person Bob; 26.04.2012
comment
@Chirs кажется, что у меня та же проблема, что странно, исключение возникает при нацеливании на .NET 4. Если я переключусь на .NET 3.5, тогда это сработает. - person Zmaster; 14.10.2012
comment
Приложения .NET 4 по умолчанию используют платформу x86, в отличие от 3.5, где по умолчанию используется AnyCPU. Таким образом, приложение будет читать разные ключи реестра в 64-разрядной версии Windows. - person Hans Passant; 14.10.2012

Я решил зайти в реестр голосовых ключей и после резервного копирования этого ключа удалил один за другим все голоса, каждый раз пытаясь ввести код, пока ошибка не исчезла. Ошибка была в голосе Локендо. После этого я попытался восстановить резервную копию (все голоса), снова ища ошибку и... ОС ответила, что значение не может быть записано, потому что оно используется другим приложением... Вот и волшебство: все заработало!

person tedebus    schedule 07.11.2012

У меня такая же проблема. Ханс Пассант указал нам на тот факт, что этот API анализирует строковые значения из реестра для обнаружения установленных языков. У меня тоже были установлены языковые пакеты Loquendo TTS. Используя PROCMON методом проб и ошибок, мне удалось точно определить ключ реестра, вызвавший ошибку (язык). API ожидает, что эта строка будет содержать только числовые символы для целочисленного преобразования. Попытка разобрать и преобразовать эту строку ("40c") вызывает исключение FormatException:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Speech\Voices\Tokens\LQBernard\Attributes] «Язык» = «40c»

изменился на:

«Язык» = «40» (удален завершающий символ «с»).

Я повторил этот процесс для обоих установленных языковых пакетов French Loquendo TTS (Bernard и Juliette), и это решило проблему для меня.

person fstarnaud    schedule 17.10.2012
comment
Не совсем отвечает на вопрос. - person John Saunders; 17.10.2012
comment
Позволю себе не согласиться. У Боба было исключение FormatException при попытке использовать API синтеза речи. Ханс Пассант указал нам на тот факт, что этот API анализирует строковые значения из реестра для обнаружения установленных языков. У нас с Бобом были установлены языковые пакеты Loquendo TTS. Используя PROCMON методом проб и ошибок, мне удалось точно определить ключ реестра, вызвавший ошибку (язык). Попытка проанализировать и преобразовать в целое число строку, содержащую нечисловые символы, вызывает исключение FormatException. CQFD. - person fstarnaud; 27.10.2012
comment
Хорошо, я признаю это. Но было неясно, как это отвечает на вопрос. Если вы отредактируете свой ответ, чтобы включить информацию, которую вы включили в комментарий, я смогу удалить отрицательный голос. - person John Saunders; 27.10.2012

Это может не быть источником вашей проблемы, но похоже, что в API вы должны просто вызвать

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

и избегайте всего лишнего кода... вы пытались удалить точку?

person therealmitchconnors    schedule 24.04.2012
comment
Удаление периода ничего не дает. Я пробовал множество различных комбинаций, от полных предложений до простых фраз, и все равно выдает ошибку. - person Bob; 25.04.2012
comment
Похоже, что @therealmitchconnors на самом деле предлагает вам полностью удалить класс Prompt и напрямую Speak класс string, чтобы увидеть, не вызывает ли это проблему. - person Adam V; 25.04.2012