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