Microsoft Text-To-Speech не говорит с ударением - PullRequest
0 голосов
/ 20 марта 2019

Я разрабатываю приложение для преобразования текста в речь, используя библиотеку 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 получает акцентированные символы.Тем не менее, я создаю wstring переменную с именем stemp, где моя строка преобразуется, и здесь символ с акцентом заменяется пустым квадратом.Затем создается переменная LPCWSTR (Long Pointer to Constant Wide String), чтобы произносить введенный текст.Ниже приведена картина значений моих переменных.

Variable values

Возможно, что-то не так в моем коде, но что я могу сделать, чтобы убедиться, что символы с акцентомвысказался?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Нельзя просто скопировать однобайтовую или многобайтовую строку символов (char, std::string) в строку широких символов (wchar_t, std::wstring).Необходимо выполнить правильное преобразование между кодировками или наборами символов.

Необходимо определить правильные кодировки, используемые для обеих строк.В Windows данные std::string обычно находятся в локальной кодировке, например Windows-1252, а данные std::wstring - в формате UTF-16.

В Windows вы можете использовать MultiByteToWideChar дляпреобразование.

Кроме того, вы можете использовать стандартные функции, такие как mbstowcs или std::mbtowc.

0 голосов
/ 21 марта 2019

Я реализовал MultiByteToWideChar, предложенный @rveerd. Вот код:

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

    //processing conversion
    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 );

    printf( "Text To Speech processing\n" );
    hr = cpVoice->Speak( wstr, SPF_DEFAULT, NULL ); //speak my text

    saveText = text;

    cpEnum.Release();
    cpVoiceToken.Release();
    delete new wchar_t[wchars_num];
  }
  else
  {
    printf( "Could not speak entered text\n" );
  }

  return true;
}

Я также нашел более короткий способ конвертировать его. Просто замените код MultiByteToWideChar следующим:

CA2W pszWide( str.c_str(), CP_ACP);
hr = cpVoice->Speak( pszWide, SPF_DEFAULT, NULL );

Редактировать : Я заменил CP_UTF7, потому что он используется редко. CP_UTF8 является предпочтительным. Однако, это не сработало для меня, но я узнал, что CP_ACP работает для меня. Для получения дополнительной информации смотрите ссылку @rveerd опубликовано

...