в чем разница между SpVoice и SpeechSynthesizer - PullRequest
10 голосов
/ 12 февраля 2009

В чем разница между этими двумя методами в C # с использованием речевого API или SAPI ?

using SpeechLib;
SpVoice speech = new SpVoice();
speech.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync);

возвращает голоса Apacela и

SpeechSynthesizer ss = new SpeechSynthesizer();
ss.SpeakAsync ("Hello, world");

Не работает с Apacela голоса .

Первый возвращает все голоса, а второй возвращает только несколько голосов. Это связано с SAPI 5.1 и SAPI 5.3?

Поведение одинаково на Vista и XP, на обоих SpVoice удалось обнаружить голос Apacela, но с помощью SpeechSynthesizer голоса не обнаруживаются как на XP, так и на Vista.

Я полагаю, что XP использует SAPI 5.1, а Vista использует SAPI 5.3, тогда почему такое же поведение на всех ОС, но другое поведение с API?

Кроме того, какой API является более мощным и в чем разница между двумя способами / API?

Ответы [ 2 ]

6 голосов
/ 26 февраля 2009

SpeechLib - это Interop DLL, которая использует классический SAPI на основе COM под крышками. System.Speech был разработан Microsoft для взаимодействия с преобразованием текста в речь (и распознавания голоса) непосредственно из управляемого кода.

Вообще, лучше придерживаться управляемой библиотеки (System.Speech) при написании управляемого приложения.

Это определенно не связано с версией SAPI - наиболее вероятная проблема здесь в том, что поставщик голосовых услуг (в данном случае Acapela) должен явно реализовать поддержку определенных функций System.Speech. Возможно, что ваши голоса Acapela поддерживают все, что требуется, но также возможно, что они этого не делают. Лучше всего было бы напрямую спросить группу Акапела .

Голоса зарегистрированы в HKLM \ SOFTWARE \ Microsoft \ Speech \ Tokens, и вы должны увидеть встроенные голоса Windows, а также добавленные вами голоса Acapela. Если вы заметите какие-либо очевидные различия в том, как они зарегистрированы, вы можете заставить работать голоса Acapela, сопоставив их регистрацию, например, с MS-Anna.

Но я бы сказал, что наиболее вероятная возможность заключается в том, что голоса Acapela не были обновлены для поддержки всех интерфейсов, необходимых для System.Speech.

3 голосов
/ 12 февраля 2009

SpeechLib - это библиотека взаимодействия, поэтому она сопоставляется с любой версией SpeechLib, для которой она была создана (вы можете проверить ее свойства).

System.Speech. * - это «официальная» поддержка речи в .NET Framework. SpeechSynthesizer выбирает, какую библиотеку речи использовать во время выполнения (так же, как это делали классы System.Web.Mail).

Я не уверен, почему они возвращают разное количество голосов, но это, вероятно, связано с используемой версией SAPI.

...