为Android TTS引擎指定发音的最佳做法?

gre*_*egS 17 android text-to-speech ssml

总的来说,我对Android的默认文本到语音引擎(即com.svox.pico)印象非常深刻.正如预期的那样,它会错误地发音一些词(就像我一样),因此偶尔需要一些发音指导.所以我想知道最好的做法是用语音拼写出pico TTS引擎错误发音的那些词.

例如,查查拉卡鸟的正确发音是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
Run Code Online (Sandbox Code Playgroud)

这是我的问题.

  • 是否有Android TTS引擎识别的标准拼音?
  • 如果没有,是否有制作自发音拼写,这将使更多的拼写可能是正确的未来TTS引擎/版本的一些一般的规则?
  • 似乎Android TTS引擎忽略了文本案例.指定重点的最佳方法是什么?

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

V/TtsService(294):TTS处理:姜查姜查洛克
V/TtsService(294):TtsService.setLanguage(ENG,USA)
I/SVOX微微引擎(294):语言已经被加载(EN-US == EN-US )
I/SynthProxy(294):将语速设置为100
I/SynthProxy(294):将音高设置为100

[UPDATE]

我尝试将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);
Run Code Online (Sandbox Code Playgroud)

正如Android Eve所说,TTS引擎只读取XML主体(即关于大型汽车和巨额银行账户的评论).我没有意识到TTS引擎能够解析XML文档.但是,我没有听到任何强调TTS输出.

[更新2]

我在这里简化了Android TTS是否支持语音合成标记语言的问题.

gre*_*egS 7

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

嗨格雷格,

Pico引擎使用XSAMPA字母表识别标签.

从正字法中得出某个发音没有简单的规则,但你可以使用直观的拼写和反复试验.大写和连字符将引入比解决它们更多的问题.使用不同的拼写并引入额外的单词边界(空格)可以起作用.

强调标记和感叹号不会改变合成结果.请改用,和命令.


TextToSpeech的这些测试中,使用SSML音素标签指定发音的正确语法的一些示例.

即使使用这些简单的测试SSML文档,也会向logcat发布有关SSML文档格式不正确的警告消息.所以我向Android问题跟踪器打开了一个关于这些看似不正确的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); 
Run Code Online (Sandbox Code Playgroud)

虽然更多的例子会有所帮助,但x-SAMPA的一个很好的参考资料是http://en.wikipedia.org/wiki/Xsampa. 如果我编写了几十个例子,我会将它们发布到维基百科页面.


And*_*Eve 1

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

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

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我不明白如何在这种情况下使用你的例子。根据(松散地)您的建议,我尝试调用 mTts.speak("ha ha ha &lt;emphasis&gt;ha&lt;/emphasis&gt; ha ha", TextToSpeech.QUEUE_ADD, null),但输出包含强调标记的读取。您是说将 XML 文档字符串作为第一个参数传递给 TextToSpeech.speak() 会导致 TTS 引擎读取 XML 正文并使用解析的标签控制读取吗? (5认同)