是否可以忽略使用SAPI的Microsoft Text To Speech中的单词?

时间:2019-03-26 13:53:56

标签: c++ text-to-speech sapi speech-synthesis

我正在使用Microsoft SAPI开发文本语音转换应用程序。 ISpVoice::Speak的效果很好,但是会大声说一些不应该使用的特殊字符。这些语音字符是(/,* _)

我发现可以创建规则,但是只能使用语音识别(source)。我想知道是否可以在“文本到语音”中实现它。如果有帮助,请看下面的代码。

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 :(得分:0)

感谢Eric的评论,我设法解决了我的问题。如果您在引擎说出文字之前修改了文字,则可以删除所需的字符。这是允许预处理文本的代码

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