通过Model Speech Synthesis Markup Language(MSML)标签语言可以控制TTS如何发音,包括控制断句分词方式、停顿和声调等特征,甚至可以实现插入音频等功能。本文为您介绍MSML标签语言的相关内容。
概述
MSML标签分为输入标签和输出标签。
输出标签:指大模型传给通信引擎所使用的标签,需用户按照自身需求进行配置。
输入标签:指通信引擎传给大模型所使用的标签。
目前仅中文及英文声音支持MSML功能,中文和英文所支持的MSML标签及内容也有略有差别,详情请参考TTS输出标签。
所有文本需放在<speak></speak>标签之内,且每个语音合成任务只能包含一个<speak></speak>标签。
标签内的文字内容如果包含XML的特殊字符,需要做字符转义,常用的特殊字符对应关系如下。
"(双引号):"
' (撇号或单引号):'
&(表示和的符号):&
<(小于号):<
>(大于号):>
注意事项
由于大模型语音合成场景主要是流式场景,所以大部分跨过大文本区间的MSML的较难完整进行流式输出,容易造成等待卡顿。
实时语音场景下的语音合成由于是流式场景,需要保障在一句话整体标签闭合完整。
TTS输出标签
根标签-speak标签
描述
所有支持MSML标签的根节点。一切需要调用MSML标签的文本都要包含在<speak></speak>中。
语法
<speak>需要调用MSML标签的文本</speak>标签关系
<speak>标签可以包含文本和以下标签,详情请参见子标签:
<break>
<phoneme>
<say-as>
<sub>
<audio>
示例
<speak> 需要调用MSML标签的文本。 </speak>音频效果
子标签
break标签
描述
用于在文本中插入停顿,该标签是可选标签。
语法
# 空属性 <break/> # 带time属性 <break time="string"/>属性
属性名称
属性类型
属性值
是否必选
描述
time
String
[number]s/[number]ms
否
以秒/毫秒为单位设置停顿的时长 (如“2s”、“50ms”)。
[number]s:以秒为单位,[number]取值范围为[1, 10]的整数。
[number]ms:以毫秒为单位,[number]取值范围为[50, 10000]的整数。
重要:连续出现多个
<break>标签时,停顿时长为各标签停顿时长之和,若总时长超过10秒,则只生效10秒。例如,在以下示例中,连续3个
<break>标签的总停顿时长为15秒,但由于超过10秒,最终有效停顿时长为10秒。<speak> 请闭上眼睛休息一下<break time="5s"/><break time="5s"/><break time="5s"/>好了,请睁开眼睛。 </speak>标签关系
<break>是空标签,不能包含任何标签。如果MSML结构中存在<s>标签,请把<break>写在<s>里面,表示对当前段落或句子设置停顿。
示例
<speak> 请闭上眼睛休息一下<break time="500ms"/>好了,请睁开眼睛。 </speak>音频效果
say-as标签
描述
用于指示出标签内文本的信息类型,进而按照该类型的默认发音方式发音。
语法
<say-as interpret-as="string">文本</say-as>属性
属性名称
属性类型
属性值
是否必选
描述
interpret-as
String
cardinal/digits/telephone/characters/date/time/
是
指示出标签内文本的信息类型:
cardinal:按整数或小数发音
digits:按数字发音。
telephone:按电话号码常用方式发音。
characters:将标签内的文本按字符一一读出。
date:按日期发音。
time:按时间发音。
<say-as>类型支持范围
<say-as>常见符号读法
<say-as>常见计量单位
示例及音频效果
基数(cardinal)
示例:
<speak> <say-as interpret-as="cardinal">12345</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="cardinal">10234</say-as> </speak>英文音频效果:
数字(digits)
示例:
<speak> <say-as interpret-as="digits">12345</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="digits">10234</say-as> </speak>英文音频效果:
电话(telephone)
示例:
<speak> <say-as interpret-as="telephone">12345</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="telephone">10234</say-as> </speak>英文音频效果:
字符(character)
示例:
<speak> <say-as interpret-as="characters">希腊字母αβ</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="characters">*b+3.c$=α</say-as> </speak>英文音频效果:
日期(date)
示例:
<speak> <say-as interpret-as="date">1000-10-10</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="date">10-01-2020</say-as> </speak>英文音频效果:
时间(time)
示例:
<speak> <say-as interpret-as="time">5:00am</say-as> </speak>中文音频效果:
示例:
<speak> <say-as interpret-as="time">0500</say-as> </speak>英文音频效果:
sub标签
描述
使用别名替换标签内文本。
语法
<sub alias="string"></sub>属性
属性名称
属性类型
属性值
是否必选
描述
alias
String
替换后的内容。
是
用于替换标签内的文本。
标签关系
<sub>标签可以包括文本。
示例
<speak><sub alias="网络协议标准">W3C</sub></speak>音频效果
audio标签
描述
提示音标签,可以在MSML合成过程中,通过该标签在任意位置插入提示音。
语法
<audio src="URL"/>属性
属性名称
属性类型
属性值
是否必选
描述
src
String
URL提示音资源路径。
是
您可以根据需求,使用自定义提示音。需要将提示音存放在阿里云OSS上,并且所在的存储空间至少为公共读权限,请参见创建存储空间,使用HTTP/HTTPS协议生成文件访问链接请参见控制台快速入门。
音频要求:
采样率16 kHz、单声道WAV格式。
不超过2 MB。
位深度要求16位。
重要您需要对上传的音频版权承担相应的法律责任。
标签关系
<audio>是空标签,不可以包含任何标签。
示例
<speak> 一匹马受了惊吓<audio src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>人们四散躲避 </speak>音频效果
phoneme标签
描述
用于控制标签内文本的读音,该标签是可选标签。英文文本不支持该标签。
语法
<phoneme alphabet="string" ph="string">文本</phoneme>属性
属性名称
属性类型
属性值
是否必选
描述
alphabet
String
py:拼音。
cmu:英文音标发音。
是
-
ph
String
标签内文本对应的拼音串。
是
拼音用法的赋值规范:
字与字的拼音用空格分隔,拼音的数目必须与字数相等。
每个拼音由发音和音调组成,音调为1~5的数字编号,其中”5”表示轻声。
标签关系
<phoneme>标签可以包括文本。
示例
<speak> 去<phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme> </speak>音频效果
通话控制标签(输出)
通话控制标签主要用于控制引擎进行通话操作,如控制挂断,转接等。
标签 | 用途描述 | 关键属性 | 示例代码 | 备注说明 |
<hangup> | 用于播放完文本之后进行挂断处理。 | 无 | <hangup/> | TTS输出标签的兼容标签。 |
通话行为标签(输入)
通话行为标签主要用于通信引擎识别通话过程中用户的行为,如通话冷场、打断机器人说话、声音情感等。
标签 | 用途描述 | 关键属性 | 示例代码 | 备注说明 |
<silence> | 通话过程发生冷场行为。 | time:时间。 | <silence time="5s"> | - |
<user-interrupt> | 发生了用户打断机器人说话行文。 | 无,标签包含的文本属于被打断前讲的最后一句。 | <user-interrupt/> | - |
<emotion> | 声音情感。 |
| <emotion category="positive" intensity="0.2" > |
|
示例:
[
{
"role": "assistant",
"content": "您好我是某快递客服,您有一个xxxx的包裹正在派送请注意查收。"
},
{
"role": "user",
"content": "<emotion category=\"neutral\" intensity=\"0.898\">我看到。</emotion>"
},
{
"role": "assistant",
"content": "好的,感谢您的理解。如果还有其他问题或需要进一步的帮助,请随时告诉我。祝您生活愉快!"
},
{
"role": "user",
"content": "<emotion category=\"neutral\" intensity=\"0.612\">我说什么时候派送啊?</emotion>"
},
{
"role": "assistant",
"content": "您好,根据您提供的信息,您的包裹正在派送中。具体的派送时间可能会因快递员路线安排、交通状况等因素的影响。如果您需要更准确的派送时间,建议您通过某APP的物流跟踪功能或直接联系快递员获取最新的派送时间。<user-interrupt/>"
},
{
"role": "user",
"content": "<emotion category=\"neutral\" intensity=\"0.976\">行,先这样吧。</emotion>"
}
]