专栏首页喔家ArchiSelf生动化你的表达——DuerOS中的SSML应用

生动化你的表达——DuerOS中的SSML应用

在对话式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规范中给出的一个示例:

<?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。命令参考如下:

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

本文分享自微信公众号 - 喔家ArchiSelf(wireless_com),作者:老曹

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 老曹眼中的开发学习环境

    “工其事必先利其器”,对于一个全栈而言,一个与自己匹配的开发和学习环境,能够极大地提高个人的工作效率,很多时候都可以做到事半而功倍。环境也是一个外延很广的概念,...

    半吊子全栈工匠
  • 分布式系统的时间问题

    1 什么是时间? 2 物理时间:墙上时钟 3 逻辑时钟:为事件定序 4 Turetime:物理时钟回归 5 区块链:重新定义时间 6 其他影响 6.1 NT...

    半吊子全栈工匠
  • 7行Python的人脸识别

    随着去年alphago 的震撼表现,AI 再次成为科技公司的宠儿。AI涉及的领域众多,图像识别中的人脸识别是其中一个有趣的分支。百度的BFR,Face++的开放...

    半吊子全栈工匠
  • Struts2(接受表单参数)请求数据自动封装和数据类型转换

    Struts2请求数据自动封装:   (1)实现原理:参数拦截器   (2)方式1:jsp表单数据填充到action中的属性;        普通的成员变量,...

    别先生
  • 解决:Caused by: redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key

    3. 错误的原因是我在set的时候先放入的是A类型的数据。后来我由于代码写错了,又想要放入B类型的数据。放入失败并报错。

    微风-- 轻许--
  • 超详细hadoop集群服务器安装配置教程

    虚拟机以及Linux系统安装在之前的两篇分享中已经详细的介绍了方法,并且每一步的都配图了。如果有朋友还是看不懂,那我也爱莫能助了。本篇主要就hadoop服务器操...

    用户3392176
  • 高速违规哪里逃?浙江高速启用巡逻机器人

    在长假黄金周期间,许多地方的高速公路都会出现堵车情况,且不说在这期间属于车流高峰时期,同样对于一些技术不好、开车习惯不好的车主来说,违法占道等行为都会造成堵车事...

    机器人网
  • 第21次文章:工厂模式

    在我们GOFO23种设计模式中,上期着重介绍了创造型模式中的单例模式,这周我们着重介绍另一种创造型设计模式——工厂模式。

    鹏-程-万-里
  • 剑指offer 树的子结构

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    week
  • 微信「看一看」多模型内容策略与召回

    相信对于不少人而言微信已经成为获取资讯的主要场景。与此同时,由于微信用户群体的庞大,也吸引了大量的内容生产者在微信公共平台创造内容,以获取用户关注、点赞、收藏等...

    week

扫码关注云+社区

领取腾讯云代金券