Есть ли возможность игнорировать слова в Microsoft Text To Speech с использованием SAPI?

#c #text-to-speech #sapi #speech-synthesis

#c #преобразование текста в речь #sapi #синтез речи

Вопрос:

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

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

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

      cpEnum->Item( saveVoice, amp;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 processingn" );
      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 textn" );
   }

   return true;
}
  

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

Комментарии:

1. Почему бы вам просто не выполнить предварительную обработку текста, прежде чем произносить его?

2. Когда вы говорите «предварительная обработка текста», вы имеете в виду его изменение? Ваш вопрос вернул меня в нужное русло, и мне удалось решить мою проблему 🙂 Я опубликую свое решение.

Ответ №1:

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

   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 = ' ';
     }
  }