【发布时间】:2019-08-11 07:56:51
【问题描述】:
我正在使用 Microsoft sapi 库开发文本转语音应用程序。我实现了口语功能,发现重音字符 (à,á,â,ä,é,è,ê,í,ì,î,ó,ò,ô,ö,ù,ú,û,ü ) 不说话。
这是我的代码:
int ttsSpeak( const char* text ) //Text to Speech speaking function
{
if( SUCCEEDED(hr) )
{
hr = SpEnumTokens( SPCAT_VOICES, NULL, NULL, &cpEnum );
cpEnum->Item( saveVoice, &cpVoiceToken );
cpVoice->SetVoice( cpVoiceToken ); //Initialization of the voice
string str( text );
cout << str;
std::wstring stemp = std::wstring( str.begin(), str.end() );
LPCWSTR sw = ( LPCWSTR )stemp.c_str(); //variable allowing to speak my entered text
printf( "Text To Speech processing\n" );
hr = cpVoice->Speak( sw, SPF_DEFAULT, NULL ); //speak my text
saveText = text;
cpEnum.Release();
cpVoiceToken.Release();
}
else
{
printf( "Could not speak entered text\n" );
}
return true;
}
我调试了我的应用程序,发现变量 str 获取了重音字符。但是,我创建了一个名为stemp 的wstring 变量,在其中转换了我的字符串,并且这里的重音字符被替换为一个空方块。然后,创建一个 LPCWSTR 变量(指向常量宽字符串的长指针)以朗读输入的文本。下面是我的变量值的图片。
也许我的代码有问题,但我能做些什么来确保重音字符被读出?
【问题讨论】:
-
std::wstring( str.begin(), str.end() );仅在源字符串仅包含 ASCII 符号时才能正常工作。一般情况下需要进行编码转换。 -
最可能的罪魁祸首是字符编码。简单地扩大每个字符不会产生正确的字符串。
-
我需要在
string str( text );和std::wstring( str.begin(), str.end() );之间进行编码转换对吧?我该怎么做? -
即使您正确地转换了字符串,您也可能需要选择正确的规范化形式,因为带重音的拉丁字母通常可以在 Unicode 中以几种不同的方式表示。 Microsoft 文档没有提到 API 需要哪种形式,但一个很好的猜测是 NFC。
标签: c++ text-to-speech sapi