为 Android TTS 引擎指定发音的最佳实践?

Posted

技术标签:

【中文标题】为 Android TTS 引擎指定发音的最佳实践?【英文标题】:best practice for specifying pronunciation for Android TTS engine? 【发布时间】:2011-03-30 13:07:23 【问题描述】:

总的来说,我对 android 的默认文本转语音引擎(即 com.svox.pico)印象深刻。正如预期的那样,它会误读一些单词(就像我一样),因此偶尔需要一些发音指导。因此,我想知道以拼音方式拼写 pico TTS 引擎错误发音的单词的最佳做法。

例如,Chachalaca 鸟的正确发音是 CHAH-chah-LAH-kah。以下是 TTS 引擎生成的内容:

mTts.speak("Chachalaca", TextToSpeech.QUEUE_ADD, null); // output: chuh-KAL-uh-KUH
mTts.speak("CHAH-chah-LAH-kah", TextToSpeech.QUEUE_ADD, null); // output: CHAH-chah-EL-AY-AYCH-dash-kuh
mTts.speak("CHAHchahLAHkah", TextToSpeech.QUEUE_ADD, null); // output: CHA-chah-LAH-ka
mTts.speak("CHAH chah LOCKah", TextToSpeech.QUEUE_ADD, null); // output: CHAH-chah-LAH-kah

这是我的问题。

是否有 Android TTS 引擎可识别的标准拼音? 如果没有,是否有一些用于制作自定义发音拼写的一般规则,以使拼写在未来的 TTS 引擎/版本中更可能是正确的? Android TTS 引擎似乎忽略了文本大小写。指定重点的最佳方式是什么?

顺便说一句,这是 TTS 引擎写入 logcat 的内容:

V/TtsService(294):TTS 处理:CHAH chah LOCKah V/TtsService(294): TtsService.setLanguage(eng, USA, ) I/SVOX Pico 引擎(294):已加载语言(en-US == en-US) I/SynthProxy(294):将语速设置为 100 I/SynthProxy(294):将音高设置为 100

[更新]

我尝试将 XML 文档传递给 TextToSpeech.speak(),如下所示:

            String text = "<?xml version=\"1.0\"?>" +
                "<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" " +
                    "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                    "xsi:schemaLocation=\"http://www.w3.org/2001/10/synthesis " +
                        "http://www.w3.org/TR/speech-synthesis/synthesis.xsd\" " +
                    "xml:lang=\"en-US\">" +

                    "That is a big car! " +
                    "That <emphasis>is</emphasis> a big car! " +
                    "That is a <emphasis>big</emphasis> car! " +
                    "That is a huge bank account! " +
                    "That <emphasis level=\"strong\">is</emphasis> a huge bank account! " +
                    "That is a <emphasis level=\"strong\">huge</emphasis> bank account!" +
                "</speak>";
            mTts.speak(text, TextToSpeech.QUEUE_ADD, null);

正如 Android Eve 所建议的,TTS 引擎只读取 XML 正文(即关于大型汽车和巨大银行账户的 cmets)。我没有意识到 TTS 引擎能够解析 XML 文档。但是,我在 TTS 输出中没有听到任何强调。

[更新 2]

我将问题简化为 Android TTS 是否支持语音合成标记语言here。

【问题讨论】:

【参考方案1】:

JW 在tts-for-android 群回答了我的问题:

嗨,格雷格,

Pico 引擎识别带有 XSAMPA 字母的标签。

没有简单的规则可以从正字法中推导出某个发音,但您可以使用直观的拼写和反复试验。大写和连字符会带来比解决问题更多的问题。使用不同的拼写并引入额外的单词边界(空格)是可行的。

强调标签和感叹号不会改变合成结果。请改用 、 和 命令。


tests of TextToSpeech 中有一些使用 SSML 音素标签指定发音的正确语法示例。

即使使用这些简单的测试 SSML 文档,也会向 logcat 发布有关 SSML 文档格式不正确的警告消息。所以我向Android issue tracker提出了一个关于这些看似不正确的logcat消息的问题。


为 SVOX pico 指定 x-SAMPA 序列的语法是

String text = "<speak xml:lang=\"en-US\"> <phoneme alphabet=\"xsampa\" ph=\"d_ZIn\"/>.</speak>";
mTts.speak(text, TextToSpeech.QUEUE_ADD, null); 

虽然更多示例会有所帮助,但 x-SAMPA 的一个很好的参考是 http://en.wikipedia.org/wiki/Xsampa 如果我编译了几十个示例,我会将它们发布到那个 Wikipedia 页面。

【讨论】:

“TextToSpeech 测试”链接已损坏【参考方案2】:

所有 3 个问题的一个答案:查看 SSML 规范:http://www.w3.org/TR/speech-synthesis/

例如,要指定强调,您可以使用 emphasis 元素,例如

<?xml version="1.0"?>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.w3.org/2001/10/synthesis
                   http://www.w3.org/TR/speech-synthesis/synthesis.xsd"
         xml:lang="en-US">
  That is a <emphasis> big </emphasis> car!
  That is a <emphasis level="strong"> huge </emphasis>
  bank account!
</speak>

【讨论】:

谢谢,但我不明白如何在这种情况下使用您的示例。根据您的建议(大致),我尝试调用 mTts.speak("ha ha ha ha ha ha", TextToSpeech.QUEUE_ADD, null),但输出包含对强调标签的读取。您是说将 XML 文档字符串作为第一个参数传递给 TextToSpeech.speak() 会导致 TTS 引擎读取 XML 正文并使用已解析的标签控制读取?

以上是关于为 Android TTS 引擎指定发音的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

DotNet 4.0调用TTS引擎实现朗读功能更简洁~

Android文字转语音引擎(TTS)使用

Android最佳实践:可以在主线程上初始化TextToSpeech引擎吗?

语音合成模块 文本转TTS 真人发音 SYN6288

20.5 语音合成(百度2016年2月29日发布的tts引擎)

kotlin 协程最佳实践-android官网