是否可以使用 SAPI 忽略 Microsoft Text To Speech 中的单词?
Is there a possibility to ignore words in Microsoft Text To Speech using SAPI?
我正在使用 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 文件,我可以在其中定义引擎可以说什么,不能说什么。
感谢 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 = ' ';
}
}
我正在使用 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 文件,我可以在其中定义引擎可以说什么,不能说什么。
感谢 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 = ' ';
}
}