0

У меня есть следующий код C++/CX:функция SpeechSynthesizer :: SynthesizeTextToStreamAsync принимает навсегда

Windows::Media::SpeechSynthesis::SpeechSynthesizer^ synth = ref new Windows::Media::SpeechSynthesis::SpeechSynthesizer(); 
Platform::String^ text = "This is a string of text."; 
concurrency::create_task(synth->SynthesizeTextToStreamAsync(text)) 
    .then([&](Windows::Media::SpeechSynthesis::SpeechSynthesisStream^ stream) { 
     mediaElement->AutoPlay = true; 
     mediaElement->SetSource(stream, stream->ContentType); 
     mediaElement->Play(); 
    }); 

Если я правильно понимаю, предполагается синтезировать строку This is a string of text. в поток, который затем воспроизводиться через MediaElement. Однако, после выполнения этого кода, лямбда, указанная в task.then(), никогда не запускается. Я что-то упускаю?

ответ

2

Это прекрасно работает для меня. Несколько возможностей:

  1. Вы не имеете возможности Microphone и вы глотания в Access Denied исключение (*)
  2. Calling Play бросает и вы глотания исключение (**)
  3. Вы работает на устройстве, которое не имеет разговорный язык по умолчанию установлен (DefaultVoice == nullptr)

(*) Несмотря на то, что вы на самом деле не с помощью микрофона для синтеза речи, то, как система речи работает в ОС Windows Телефон вам нужна эта возможность

(**) Вы никогда не должны звонить Play сразу после установки Source; вы должны дождаться, когда событие MediaOpened будет поднято (или в этом случае полагаться на AutoPlay, чтобы выполнить эту работу).

+0

У меня есть функция «Микрофон», заявленная в моем '.appxmanifest'. Я попытался вручную настроить голос из списка «AllVoices» и поместить весь код в блок try/catch, и никаких исключений не было. Проблема заключается не в самом 'MediaElement', а просто в методе' SynthesizeTextToStreamAsync() '. Как я уже сказал, он работает вечно и никогда не запускает лямбда, указанную в 'task.then()'. – Arielle

+0

Я действительно ударил эту проблему, и мне пришлось перезагрузить устройство/эмулятор, чтобы исправить это. В основном вызов Synthesize работал один раз, но потом больше никогда. Попробуйте перезапустить и убедитесь, что вы закрыли объект SpeechSynthesizer, когда это сделано. –

+0

Спасибо за вашу помощь. – Arielle

Смежные вопросы