SpeechSynthesizer.SelectVoice() Сбой "Нет соответствующего голоса установлен или голос был отключен"
Я модифицирую код BabySmash Scott Hanselman Хансельмана для поддержки других языков.
- Я установил речевую платформу и новый язык для этих шагов.
Язык теперь отображается в реестре:
Язык теперь может быть выбран и воспроизведен Windows:
System.Speech.Synthesis.SpeechSynthesizer.GetInstalledVoices()
теперь возвращает голос.- тем не мение
SelectVoice()
в приведенном ниже коде выдает ошибку "System.ArgumentException: не удается установить голос. Соответствующий голос не установлен или голос был отключен".
string phrase = null;
SpeechSynthesizer speech = new SpeechSynthesizer();
CultureInfo keyboardCulture = System.Windows.Forms.InputLanguage.CurrentInputLanguage.Culture;
InstalledVoice neededVoice = speech.GetInstalledVoices(keyboardCulture).FirstOrDefault();
if (neededVoice == null)
{
phrase = "Unsupported Language";
}
else if (!neededVoice.Enabled)
{
phrase = "Voice Disabled";
}
else
{
speech.SelectVoice(neededVoice.VoiceInfo.Name);
}
speech.Speak(phrase);
Я пытался обновить до
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Speech.dll
,Я проверил, что версии
Microsoft.Speech.dll
и языковой пакет совпадает.Этот код работает для голосов по умолчанию, которые я уже установил.
В отчаянии я даже пытался вызвать
System.Speech.Internal.Synthesis.VoiceSynthesis.GetVoice()
непосредственно через отражение, но та же самая ошибка.
Буду очень признателен за любую помощь! Благодарю.
5 ответов
Ха -ха, я чувствую себя особенным: этот пост на Python фактически решил мою проблему: сборка конфигурации платформы должна быть x64, а не Any CPU
!
Проблема в том, что часть голосов прописана не для всех приложений. Здесь есть хорошая статья об этом: https://www.ghacks.net/2018/08/11/unlock-all-windows-10-tts-voices-system-wide-to-get-more-of-them . /
Но для тех, кто найдет этот ответ, когда вышеуказанная ссылка не работает:
Есть два ключа реестра, которые задействованы.
- Компьютер\HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Речь \Голоса\Токены
- Компьютер\HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Speech_OneCore \Voices\Tokens
Первый используется при запросе с вызовом API GetInstalledVoices() . Второй используется приложением настроек Windows.
Чтобы сделать незарегистрированные голоса доступными для GetInstalledVoices() , вам необходимо скопировать данные нужных голосов из Speech_OneCore в узел Speech (и его аналог x86, если необходимо).
- Шаг 1. Откройте редактор реестра Windows (regedit.exe).
- Шаг 2. Откройте список доступных голосов в папке Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens.
- Шаг 3: Экспортируйте ключ нужного вам голоса
- Шаг 4: Измените экспортированный файл реестра и замените
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore \Voices\Tokens\ с
- HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Речь \Голоса\Токены\
- Шаг 5: Также добавьте обе записи для 32-битных приложений (если они вам нужны), продублировав записи и заменив
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore \Voices\Tokens\ с
- HKEY_LOCAL_MACHINE\SOFTWARE\ WOW6432Node \Microsoft\Speech \Voices\Tokens\
- Шаг 6: Импортируйте измененный файл в реестр.
Теперь он должен работать (может потребоваться перезагрузка)
Другим решением является установка (x64) битной версии Microsoft Speech Platform SDK и Microsoft Server Speech Platform Runtime. Я думаю, что вы установили (x86) биты обоих, и plataform пытается прочитать его в (x64) битах.
У меня была та же проблема, что и у вас, но наоборот, и это работает для меня!
В моем случае вместо библиотеки System.Speech.Synthesis мне нужно использовать Microsoft.Speech.Synthesis. Для этого нам нужно перейти в Обозреватель решений на VisualStudio -> Ссылки и Обзор для Microsoft.Speech.dll
using Microsoft.Speech.Synthesis;
После этого у вас будут доступны другие языки исполнения.
SpeechSynthesizer synth = new SpeechSynthesizer();
// Output information about all of the installed voices.
foreach (InstalledVoice voice in synth.GetInstalledVoices())
{
VoiceInfo info = voice.VoiceInfo;
Console.WriteLine(" Name: " + info.Name);
Console.WriteLine(" Culture: " + info.Culture);
Console.WriteLine(" Age: " + info.Age);
Console.WriteLine(" Gender: " + info.Gender);
Console.WriteLine(" Description: " + info.Description);
Console.WriteLine(" ID: " + info.Id);
}