我怎样才能将 wchar_t* 交给 espeak 而不会说错德语字符?
How can I hand a wchar_t* over to espeak without getting German characters spoken incorrectly?
我正在使用 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 存储库安装以替换版本 1.49,但该版本也不起作用。我用的语音是mb-de5.
好吧,这不完全是一个解决方案,而只是一个解决方法,但至少它有效:我交出 string
而不是 wstring
。原始字符串原来是 UTF-8 编码的,因此所有特殊字符都适合 string
响应。 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;
}
我正在使用 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 存储库安装以替换版本 1.49,但该版本也不起作用。我用的语音是mb-de5.
好吧,这不完全是一个解决方案,而只是一个解决方法,但至少它有效:我交出 string
而不是 wstring
。原始字符串原来是 UTF-8 编码的,因此所有特殊字符都适合 string
响应。 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;
}