在对话式AI系统中,语音交互是主要的输入输出方式。对语音输出而言,有两种主要的方法,一种是事先制作好音频,然后根据用户的请求,播放音频;另一种是通过语音合成中的TTS技术,将文本转化为语音。在很多情况下,制作的音频往往要比语音合成的用户体验要好,因为人的声音中有更多的“色彩”,语音语调中可以有更多的情绪。
但是,预先制作的工作量往往较大,而且由于预制的确定性,导致输出内容的动态性较弱。按需定制,动态输出正是TTS的强大之处。那么,如何让TTS的表达更加生动呢?在对话式AI系统DuerOS中, 内容的生动化表达是通过SSML 实现的。
什么是SSML
SSML是一种标准的,基于XML的标记语言,使用这些标识来命令语音合成器/服务把文本(输入)转化成可读的输出结果。简单来说,就是把带有一定文字标识格式的文本语言转化语音输出结果。
SSML设计的最初目的就是为了帮助开发人员提高合成结果的内容,通过格式化和标准化的标记方式来控制语音输出的各种属性,例如发音,音量等参数设置。因此,SSML设计的几个关键要素如下:
- 一致性:提供可预测的语音输出控制,支持不同的语音合成服务部署
- 兼容性:支持W3C的标准,包括但不仅限于VoiceXML,ACSS和 SMIL
- 通用性:支持各种语音内容
- 国际化:支持各种语言的语音输出
- 自动化和可读性:支持自动化生成和手写文本格式,支持良好的可读性
- 可部署性:能够支持目前现有的技术,尽量减少可选功能数量。
SSML 的工作原理
支持SSML的TTS系统(语音合成处理器)将负责将文档呈现为语音输出,并使用标记中包含的信息按照预期以音频形式呈现文档,主要原理如下:
1)XML解析:XML解析器用于从传入的文本文档中提取文档树和内容。此步骤中获得的结构、标记和属性会影响以下每个步骤。
2)结构分析:文档的结构会影响文档的阅读方式。例如,有一些常见的与段落和句子相关的口语模式。
3)文本规范化:所有书面语言都有特殊的结构,需要将书面形式转换为口语形式。文本规范化是执行此转换的合成处理器的自动过程。例如,当文档中出现“$200”时,可以将其称为“200美元”。到这一步结束时,要说的文本已经完全转换为token,token的具体构成细节是特定于语言的。标记通常用空格分隔,通常是单词。 一般地,SSML中的标记不能跨越其他的标记。
4)文本到音位的转换: 一旦语音合成处理器确定了要说的token集合,就必须为每个token派生发音。发音可以很方便地描述为音素序列,它是语言中用来区分一个词和另一个词的声音单位。每种语言都有一个特定的音位集。
5)韵律分析:韵律是语音输出的一组特征,包括音调(也称为语调或旋律)、时间(或节奏)、停顿、说话速度、对单词的强调和许多其他特征。韵律分析,对于使语言听起来自然,正确传达语音中的意义是非常重要的。
6)波形生成: 语音合成处理器利用音位和韵律信息生成音频波形。此处理步骤有许多方法,因此可能存在相当大的特定于处理器的变化。
SSML中的元素和属性示例
SSML是一种标记语言,所以必须具备一定的文件结构。所有的SSML文件都需要的Speak元素标签入口,更多关于SSML的语法格式,可以参考W3C官方文档,以下是关于SSML主要标签的说明。
SSML具有非常强大的功能支持,比较典型的功能就是录音文件播放功能。其具体的实现方式是通过一个<audio>元素标签提供的URL路径对语音文件进行播放。
下面是W3C规范中给出的一个示例:
代码语言:javascript复制<?xml version="1.0"?>
<speak version="1.1" 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-synthesis11/synthesis.xsd"
xml:lang="en-US">
<!-- Empty element -->
Please say your name after the tone. <audio src="beep.wav"/>
<!-- Container element with alternative text -->
<audio src="prompt.au">What city do you want to fly from?</audio>
<audio src="welcome.wav">
<emphasis>Welcome</emphasis> to the Voice Portal.
</audio>
</speak>
DuerOS中的SSML
在DuerOS的技能开发中,DuerOS会将技能返回的response消息里面的文本信息按照一定的规则转化成语音信息进行播放(可以参考面向接口/协议?看DuerOS的技能开发,用JavaScript打造AI应用-从Nodejs SDK 看DuerOS的技能开发以及从Java SDK看DuerOS的技能开发)。转化后的语音有着与预期相同的特征,如语调、语速、停顿等都相同。
DuerOS支持基础标签和扩展标签两种。基础标签里的所有标签都是SSML标准标签,相当于SSML标签的子集。扩展标签指DuerOS使用标准SSML语言定制的标签。
基础标签
基础标签目前包括6种:
- speak:根标签
- audio:根据url合成已有音频
- say-as:设置数字、符号等的读法
- sub:替换目标单词
- silence:设置静音,在文本播报的开头或者结尾增加静音片段,最大10s
- phoneme:多音字注音
对于audio标签而言,音频以服务器可以访问的的地址给出,目前支持16K采样和24K采样,16bit,单声道,44字节头的wave格式文件。出于性能的约束,要求必须将相应的音频文件上传到百度云bos平台,使用bos提供的地址。单个请求最大限制3个并列的audio资源,单个audio资源大小限制为3M。
使用前需要前把音频转换为支持的格式,推荐使用ffmpeg。命令参考如下:
代码语言:javascript复制ffmpeg -i <input-file> -acodec pcm_s16le -b:a 16k -ar 16000 -ac 1 -flags bitexact <output-file.wav>
audio标签支持单标签和双标签,如果是双标签的话,当音频无法访问时,将合成嵌套文本。
扩展标签
扩展标签目前包括4种:
- background:设置背景声
- say-as: 在属性interpret-as加入两个新值,仅对英文有效
- poem:设置诗词,属性值 “wuyan”代表五言诗;“qiyan”代表七言诗;“songci”代表宋词
- space: 在所包含文本的空格处生成停顿
其中background标签与audio 标签具有类似的性质,要求必须将相应的音频文件上传到百度云bos平台,使用bos提供的资源url地址。
使用约束
DuerOS 中的SSML实现是W3C规范的一个子集,是应用过程中有着如下的约束:
- audio标签不支持嵌套audio/background(内层标签不生效);
- background/标签不支持嵌套自身,内层标签不生效;
- sub/say-as标签不支持嵌套其他任何标签,会引发解析错误,导致标签按字母朗读;
- 非汉字文本内部出现标签影响语义转换,建议使用汉字形式请求;
- &和<符号在XML中为非法字符,使用前需进行转义操作,分别为&和<,另外,>(>)、”(")、’(')也建议使用前进行转义
- 请求文本总长度(不包含SSML标签)应少于1024字节
需要注意的是,文本的长度是按照GBK编码计算的,文本的内容是UTF8编码,在不使用SSML 的时候,文本长度可达4k。
小结
了解SSML的基本原理和元素属性,可以让我们在对话式AI系统中充分地利用TTS技术来提高用户体验。
需要指出的是,这里给出的只是当前DuerOS 平台对SSML的支持状态。随着产品的演进和技术的发展,DuerOS 对SSML的支持将会越来约完善,越来越丰富,语音交互必将越来越生动。
参考资料:
- https://dueros.baidu.com/dbp
- https://www.w3.org/TR/speech-synthesis/
- https://www.wisegeek.com/what-is-ssml.htm
- www.ssml.org