Произнести предложение без ограничения по времени - PullRequest
0 голосов
/ 09 июля 2019

В настоящее время я разрабатываю приложение UWP DLL с использованием пространства имен Windows::Media::SpeechSynthesis. Я создал функцию, которая позволяет мне произносить введенный текст, который выглядит следующим образом:

int TextToSpeechUwpDll::ttsSpeak( const char* text )
{
   SpeechSynthesizer ^speak = ref new SpeechSynthesizer();
   MediaPlayer ^player = ref new MediaPlayer;

   int wchars_num = MultiByteToWideChar( CP_ACP, 0, text, -1, NULL, 0 );
   wchar_t* texts = new wchar_t[wchars_num];
   MultiByteToWideChar( CP_ACP, 0, text, -1, texts, wchars_num );
   String ^sentence = ref new String( texts );

   task<SpeechSynthesisStream ^> speakTask = create_task( speak->SynthesizeTextToStreamAsync( sentence ) );
   speakTask.then( [player, sentence]( SpeechSynthesisStream ^speechStream )
   {
      player->Source = MediaSource::CreateFromStream( speechStream, speechStream->ContentType );
      player->AutoPlay = true;
      player->Play();
      Sleep( 3000 );
   } );

   return true;
}

Тем не менее, Sleep( 3000 ); необходимо удалить, потому что когда я ввожу предложение, оно произносится только в течение 3 секунд, что означает, что если оно длиннее, то остальные не будут произноситься. Я пытался удалить эту строку, но когда я делаю это, ничего не говорится вообще. Звук не выходит. Увеличение продолжительности не решает мою проблему. Что мне нужно, так это умение произносить предложение без ограничения по времени. У кого-то была эта проблема раньше?

1 Ответ

0 голосов
/ 10 июля 2019

Вы должны объявить личное свойство о вашем MediaPlayer ^ player , чтобы хранить его в случае, если локальная переменная "player" выпущена.

в .ч

class TextToSpeechUwpDll
{​
//......

private:​
 MediaPlayer ^player = ref new MediaPlayer();​
};

в .cpp

SpeechSynthesizer ^speak = ref new SpeechSynthesizer(); 

char* text = "helloworld";​
int wchars_num = MultiByteToWideChar(CP_ACP, 0, text, -1, NULL, 0);​
wchar_t* texts = new wchar_t[wchars_num];​
MultiByteToWideChar(CP_ACP, 0, text, -1, texts, wchars_num);​
String ^sentence = ref new String(texts);​
​
task<SpeechSynthesisStream ^> speakTask = create_task(speak->SynthesizeTextToStreamAsync(sentence));​
speakTask.then([this, sentence](SpeechSynthesisStream ^speechStream)​
 {​
  player->Source = MediaSource::CreateFromStream(speechStream, speechStream->ContentType);​
  player->AutoPlay = true;​
  player->Play();​
 });
...