Есть ли возможность игнорировать слова в Microsoft Text To Speech, используя SAPI? - PullRequest
0 голосов
/ 26 марта 2019

Я разрабатываю приложение для преобразования текста в речь с использованием Microsoft SAPI.ISpVoice::Speak прекрасно работает, однако некоторые специальные символы произносятся вслух и не должны быть.Эти разговорные символы (/, * _)

Я обнаружил, что можно создавать правила, но только с использованием распознавания речи ( источник ).Интересно, возможно ли реализовать это в Text-To-Speech.Вот некоторый код, если он помогает.

int ttsSpeak( const char* text ) //Text to Speech speaking function
{
   if( SUCCEEDED(hr) )
   {
      hr = SpEnumTokens( SPCAT_VOICES, NULL, NULL, &cpEnum );

      cpEnum->Item( saveVoice, &cpVoiceToken ); //get saveVoice token defined at line 136
      cpVoice->SetVoice( cpVoiceToken ); //Initialization of the voice

      int wchars_num = MultiByteToWideChar( CP_ACP, 0, text, -1, NULL, 0 );
      wchar_t* wstr = new wchar_t[ wchars_num ];
      MultiByteToWideChar( CP_ACP, 0, text, -1, wstr, wchars_num );

      //skip characters ( /, *, _ )

      printf( "Text To Speech processing\n" );
      hr = cpVoice->Speak( wstr, SPF_DEFAULT, NULL );

      saveText = text;

      cpEnum.Release();
      cpVoiceToken.Release();
      delete new wchar_t[ wchars_num ];
   }
   else
   {
      printf( "Could not speak entered text\n" );
   }

   return true;
}

Можно ли пропустить произносимые символы вслух?Например, я создаю файл XML, в котором я могу определить, что может сказать движок, а что нет.

1 Ответ

0 голосов
/ 27 марта 2019

Мне удалось решить мою проблему благодаря комментарию Эрика.Если вы изменили текст до того, как движок произнесет его, вы можете удалить нужные символы.Вот код, который позволяет предварительно обработать текст

  string strText( text ); //transform the const char* text into string
  string specialChars = "/*_"; //define the characters you want to skip
  string::iterator it; //declare iterator
  for( it = strText.begin(); it < strText.end(); it++ ) //loop through the sentence
  {
     bool found = specialChars.find( *it ) != string::npos;
     if( found )
     {
        *it = ' ';
     }
  }
...