Возможно ли асинхронное озвучивание текста с помощью SAPI 5.4? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть форма, и я хочу разрешить пользователю получать асинхронный (возможно перекрывающийся) вывод текста в речь на основе контекста текстового поля при каждом нажатии кнопки.Я пытаюсь сделать это через SAPI 5.4 (Interop.SpeechLib.dll).Я признаю, что System.Speech или другие более «современные» функции будут работать намного лучше, но это мое текущее ограничение.Вот упрощенная версия моей функции:

private void VoiceText(string myText)
{
    SpVoice voice = new SpVoice(); // Create new SPVoice instance
    voice.Volume = 100; // Set the volume level of the text-to-speech voice
    voice.Rate = -2; // Set the rate at which text is spoken by the text-to-speech engine
    voice.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync); // Voice text (asynchronously?)
}

Использование SVSFlagsAsync DOES разрешает выполнение последующего кода, однако фактическое голосование всегда выводится синхронно (без перекрытия и существуют короткие паузы между экземплярами голосового вызова).Я пытался вызвать эту функцию как асинхронную задачу, а также в отдельном потоке, и все же это поведение остается.Это просто ограничение SpVoice?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете отменить любой запущенный в данный момент запрос TTS, используя флаг SVSFPurgeBeforeSpeak на вашем вызове Speak, например:

voice.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
...