首页 > 解决方案 > 我怎样才能将 wchar_t* 交给 espeak 而不让德语字符发音不正确?

问题描述

我正在使用 espeak-ng 将德语交通信息转换为语音。请参阅此示例文本:

B6 Weserstraße B71 Seeborg vorübergehende Begrenzung der Breite。B213 Wildeshauser Landstraße Delmenhorst-Deichhorst wegen Baustelle gesperrt。

espeak 方法调用如下所示:

unsigned int spoken_message_uuid = 0;

espeak_ERROR Speak (wstring text)
{
  espeak_ERROR   error = EE_OK;
  unsigned int  *uuid  = &spoken_message_uuid;
  const wchar_t *input = text.c_str ();

  wcout << L"Speaking text:" << endl << input << endl;

  error = espeak_Synth (input, text.length (), 0, POS_CHARACTER, 0, espeakCHARS_WCHAR | espeakENDPAUSE | espeakSSML, uuid, NULL);

return error;
}

我现在的问题如下:所有德语特殊字符(ä、ö、ü、ß)都没有正确说出!相反,A Tilde ein Viertel口语文本中出现了类似的内容,好像 UTF-8 文本被错误地视为 ASCII。

以下是 espeak-ng 和 g++ 的各自版本:

pi@autoradio:/import/valen/autoradio $ espeak-ng --version
eSpeak NG text-to-speech: 1.50  Data at: /usr/lib/arm-linux-gnueabihf/espeak-ng-data
pi@autoradio:/import/valen/autoradio $ g++ --version
g++ (Raspbian 6.5.0-1+rpi1+b1) 6.5.0 20181026
pi@autoradio:/import/valen/autoradio $ apt-cache policy espeak-ng
espeak-ng:
  Installiert:           1.50+dfsg-7~bpo10+1
  Installationskandidat: 1.50+dfsg-7~bpo10+1
  Versionstabelle:
 *** 1.50+dfsg-7~bpo10+1 100
        100 http://deb.debian.org/debian buster-backports/main armhf Packages
        100 /var/lib/dpkg/status
     1.49.2+dfsg-8 500
        500 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages

espeak 已从 Debian 的 buster-backports repo 安装以替换版本 1.49,该版本也不起作用。我使用的声音是 mb-de5。

标签: c++wchar-tespeak

解决方案


好的,这不完全是一个解决方案,只是一种解决方法,但至少它有效:我交出 astring而不是 a wstring。原来的字符串是 UTF-8 编码的,所以所有的特殊字符都适合一个stringresp。char*多变的。这是改编后的代码:

unsigned int spoken_message_uuid = 0;

espeak_ERROR Speak (string text)
{
  espeak_ERROR  error = EE_OK;
  unsigned int *uuid  = &spoken_message_uuid;
  const char   *input = text.c_str ();

  cout << "Speaking text:" << endl << input << endl;

  error = espeak_Synth (input, text.length (), 0, POS_CHARACTER, 0, espeakCHARS_UTF8 | espeakENDPAUSE | espeakSSML, uuid, NULL);

return error;
}

推荐阅读