SpeechSynthesizer.SelectVoice() Сбой "Нет соответствующего голоса установлен или голос был отключен"

Я модифицирую код BabySmash Scott Hanselman Хансельмана для поддержки других языков.

  1. Я установил речевую платформу и новый язык для этих шагов.
  2. Язык теперь отображается в реестре:

  3. Язык теперь может быть выбран и воспроизведен Windows:

  4. System.Speech.Synthesis.SpeechSynthesizer.GetInstalledVoices() теперь возвращает голос.

  5. тем не мение 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);
  1. Я пытался обновить до C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Speech.dll,

  2. Я проверил, что версии Microsoft.Speech.dll и языковой пакет совпадает.

  3. Этот код работает для голосов по умолчанию, которые я уже установил.

  4. В отчаянии я даже пытался вызвать 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 . /

Но для тех, кто найдет этот ответ, когда вышеуказанная ссылка не работает:

Есть два ключа реестра, которые задействованы.

  1. Компьютер\HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Речь \Голоса\Токены
  2. Компьютер\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) битах.

У меня была та же проблема, что и у вас, но наоборот, и это работает для меня!

Изменение идентификатора пользователя на Localsystem решит мою проблему!

В моем случае вместо библиотеки 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);
        }
Другие вопросы по тегам