由SSML控制合成效果

更新时间:2019-06-18 12:42:10

1 简介

SSML(Speech Synthesis Markup Language)是一种基于XML的标记语言。 与纯文本的合成相比,使用SSML可以充实合成的内容,为最终合成效果带来更多变化。SSML不仅让人控制语音合成能读什么,更让人可以控制语音合成可以怎么读,包括控制断句分词方式、发音、速度、停顿、声调、音量等特征,甚至加入背景音乐。

语音合成服务的SSML实现基于W3C 的语音合成标记语言版本1.0,但并不支持所有的W3C包含的标记类型,而是从业务角度出发,将支持的标记类型最大程度与业务需求绑定。

2 使用方式

说明:

将带标签的文本作为参数值,上传至语音合成服务即可.

  1. <speak>请闭上眼睛休息一下<break time="2000ms"/>好了,请睁开眼睛。</speak>

语音合成服务所支持的SSML标签请阅读如下章节,使用方式与上述示例相同。

3 标签

3.1 speak

  1. 描述

    <speak>标签是所有待支持SSML标签的根节点。一切需要调用SSML标签的文本都要包含在<speak></speak>中。

  2. 语法

    1. <speak>需要调用SSML标签的文本</speak>
  3. 属性

    <speak>标签可以使用以下属性:

    属性名称 属性类型 属性值 是否必需 描述
    voice String 线上可调用的发音人的名称代号(voice的属性值需要为全小写的voice参数值,如”siyue”) 语音合成特有标签。在合成时,指定发音人,优先级高于接口请求参数voice指定的发音人。(xiaowei和xiaomeng暂不支持在voice中设置)
    encodeType String pcm
    wav
    mp3
    语音合成特有标签。在合成时,指定音频文件格式,优先级高于接口请求参数format指定的文件格式。
    sampleRate String 8000
    16000
    语音合成特有标签。在合成时,指定音频的采样率,优先级高于接口请求参数sample_rate指定的音频采样率。
    rate String [-500, 500]之间的任意整数。0是默认值,大于0表示加快语速,小于0表示减慢语速。 语音合成特有标签。在合成时,指定音频的语速,优先级高于接口请求参数speech_rate指定的语速。
    pitch String [-500, 500]之间的任意整数。0是默认值,大于0表示升高音高,小于0表示降低音高。 语音合成特有标签。在合成时,指定音频的音高,优先级高于接口请求参数pitch_rate指定的音高。
    volume String [0, 100]之间的任意整数。50是默认值,大于50表示增大音量,小于50表示减小音量。 语音合成特有标签。在合成时,指定音频的音量,优先级高于接口请求参数volume指定的音量。
    effect String robot
    lolita
    lowpass
    echo
    eq
    lpfilter
    hpfilter
    语音合成特有标签。使用该标签可以使合成的语音产生不同的声音效果。
    • robot是机器人音效。
    • lolita是萝莉音效。
    • lowpass是低通音效。
    • echo是回声音效。
    • eq是均衡器。
    • lpfilter是低通滤波器。
    • hpfilter是高通滤波器。
    备注:
    1. 其中eq、lpfilter、hpfilter是高级效果器,您可以通过effectValue自定义效果器的效果。
    2. 一个SSML只支持一种音效,不可以写多个effect属性。
    3. 选择使用音效功能会增加系统延时。
    effectValue String 当用户选择使用高级音效eq, lpfilter, hpfilter时,可以使用该参数修改效果器的默认效果。 • eq(均衡器): 系统默认使用8个band,对应的频率为[“40Hz”, “100Hz”, “200Hz”, “400Hz”, “800Hz”, “1600Hz”, “4000Hz”, “12000Hz”],对应的带宽为[“1.0q”, “1.0q”, “1.0q”, “1.0q”, “1.0q”, “1.0q”, “1.0q”, “1.0q”]。用户在使用过程中,需要输入的是8个band对应的gain。gain的调整范围在[-20dB, 20dB]之间。例如effectValue=”1 1 1 1 1 1 1 1”。输入是一个以空格分割的8个整数组成的string。数值为0表示不调整对应频率的gain。
    • lpfilter: 输入低通滤波器的频率值。可以是(0, 目标采样率/2]之间的任意整数。例如effectValue=”800”。
    • hpfilter: 输入高通滤波器的频率值。可以是(0, 目标采样率/2]之间的任意整数。例如effectValue=”1200”。
    bgm String 线上可调用的背景音乐的名称,请阅读下面bgm属性说明。 语音合成特有标签。为合成的语音添加指定的背景音乐。
    backgroundMusicVolume String [0, 100]之间的任意整数。50是默认值,大于50表示增大音量,小于50表示减小音量。 语音合成特有标签。控制背景音乐的音量。

    bmg属性说明:

    服务内嵌URL 目前语音合成服务内嵌了几款背景音乐供您体验:
    http://nls.alicdn.com/bgm/1.wav
    http://nls.alicdn.com/bgm/2.wav
    http://nls.alicdn.com/bgm/3.wav
    自定义背景音URL 您可以根据需求,使用自定义的背景音。需要将背景音存放在云空间, 使用HTTP/HTTPS协议访问。
    您需要对上传的音频版权承担相应的法律责任。
    对音频要求:
    1. 采样率16KHz、单声道wav格式
    2. 大小不超过2MB
    3. 合成时长超出背景音时长时,背景音将循环合成
    (如果您的背景音不是wav格式,可使用ffmpeg将其转为wav格式:ffmpeg -i 输入音频 -acodec pcm_s16le -ac 1 -ar 16000 目标.wav)

    说明:标签内的URL如果包含XML的特殊字符,需要做字符转义。常用的共有5个:< > & " '

  4. 标签关系 <speak>标签可以包含文本和以下标签:

    • break
    • s
    • w
    • phoneme
    • say-as
  5. 示例

    • 空属性

      1. <speak>
      2. 需要调用SSML标签的文本
      3. </speak>
    • voice属性

      1. <speak voice="xiaogang">
      2. 我是男声。
      3. </speak>
    • encodeType属性

      1. <speak encodeType="mp3">
      2. 我可以生成压缩格式的音频。
      3. </speak>
    • sampleRate属性

      1. <speak sampleRate="8000">
      2. 看看我的文件大小吧,是16000采样率音频的一半。
      3. </speak>
    • rate属性

      1. <speak rate="200">
      2. 我的语速比正常人快。
      3. </speak>
    • pitch属性

      1. <speak pitch="-100">
      2. 我的音高却比别人低。
      3. </speak>
    • volume属性

      1. <speak volume="80">
      2. 我的音量也很大。
      3. </speak>
    • 属性组合,用空格隔开

      1. <speak rate="200" pitch="-100" volume="80">
      2. 所以放在一起,我的声音是这样的。
      3. </speak>
    • effect属性

      1. <speak effect="robot">
      2. 你喜欢机器人瓦力吗?
      3. </speak>
    • bgm属性

      1. <speak bgm="http://nls.alicdn.com/bgm/2.wav" backgroundMusicVolume="30" rate="-500" volume="40">
      2. <break time="2s"/>
      3. 阴崖老木苍苍烟
      4. <break time="700ms"/>
      5. 雨声犹在竹林间
      6. <break time="700ms"/>
      7. 绵蕝固知裨国计
      8. <break time="700ms"/>
      9. 绵州风物总堪怜
      10. <break time="2s"/>
      11. </speak>

3.2 break

  1. 描述

    用于在文本中插入停顿,该标签是可选标签。

  2. 语法

    1. # 空属性
    2. <break/>
    3. # 带time属性
    4. <break time="string"/>
  3. 属性

    属性名称 属性类型 属性值 是否必需 描述
    使用无属性的break标签时,停顿时长为”1s”。
    time String [number]s
    [number]ms
    以秒或毫秒的单位来设置停顿的长度 (如 “2s” 或 “50ms”)。
    以毫秒为单位的话,number数值范围是[50, 10000]的整数。
    以秒为单位的话,number数值范围是[1, 10]的整数。
    • [number]s:停顿的持续时长,以秒为单位。
    • [number]ms:停顿的持续时长,以毫秒为单位。
  4. 标签关系

    <break>是空标签,不可以包含任何标签。如果SSML结构中存在<s>标签,请把<break>写在<s>里面,表示对当前段落或句子设置停顿。

  5. 示例

    1. <speak>
    2. 请闭上眼睛休息一下<break time="500ms"/>好了,请睁开眼睛。
    3. </speak>

3.3 s

  1. 描述

    用于表示文本的句子结构,该标签是可选标签。

  2. 语法

    1. <s>文本</s>
  3. 属性

  4. 标签关系 <s>标签可以包含文本和以下标签:

    • break
    • w
    • phoneme
    • say-as
  5. 示例

    1. <speak><s>这是第一句话</s><s>这是第二句话</s></speak>

3.4 sub

  1. 描述

    使用别名来替换标签内文本。

  2. 语法

    1. <sub alias="string"></sub>
  3. 属性

    属性名称 属性类型 属性值 是否必需 描述
    alias String 替换后的内容 用于替换标签内的文本
  4. 标签关系

    <sub>标签仅包括文本。

  5. 示例

    1. <speak><sub alias="网络协议标准">W3C</sub></speak>

3.5 w

  1. 描述

    用于表示文本的词语结构,该标签是可选标签。

  2. 语法

    1. <w>文本</w>
  3. 属性

  4. 标签关系

    <w>标签仅包括文本。

  5. 示例

    1. <speak>南京市长<w>江大桥</w>今天发表了演讲。</speak>

3.6 phoneme

  1. 描述

    用于控制标签内文本的读音,该标签是可选标签。

  2. 语法

    1. <phoneme alphabet="string" ph="string">文本</phoneme>
  3. 属性

    属性名称 属性类型 属性值 是否必需 描述
    alphabet String py py表示拼音
    ph String 标签内文本对应的拼音串 拼音用法的赋值规范:
    1.字与字的拼音用空格分隔,拼音的数目必须与字数相等。
    2.每个拼音由发音和调组成,调为1~5的数字编号,其中”5”表示轻声。
  4. 标签关系

    <phoneme>标签仅包括文本。

  5. 示例

    1. <speak>
    2. <phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme>
    3. </speak>

3.8 soundEvent

  1. 描述

    提示音标签,可以在SSML合成过程中,通过该标签在任意位置插入提示音。

  2. 语法

    1. <soundEvent src="URI"/>
  3. 属性

    属性名称 属性类型 属性值 是否必需 描述
    src String URI提示音资源路径 ,使用HTTP/HTTPS协议访问。
    您需要对上传的音频版权承担相应的法律责任。
    对音频要求:
    1. 采样率16KHz、单声道wav格式;
    2. 大小不超过2MB。
  4. 标签关系

    <soundEvent>是空标签,不可以包含任何标签。

  5. 示例

    1. <speak>
    2. 一匹马受了惊吓<soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>人们四散躲避
    3. </speak>

3.7 say-as

  1. 描述

    用于指示出标签内文本的信息类型,进而按照该类型的默认发音方式来发音。

  2. 语法

    1. <say-as interpret-as="string">文本</say-as>
  3. 属性

    属性名称 属性类型 属性值 是否必需 描述
    interpret-as String cardinal
    digits
    telephone
    name
    address
    id
    characters
    punctuation
    date
    time
    currency
    measure
    指示出标签内文本的信息类型:
    • cardinal: 按整数或小数发音;
    • digits: 按数字发音;
    • telephone: 按电话号码常用方式发音;
    • name: 按人名发音;
    • address: 按地址发音。
    • id: 适用于账户名、昵称等。
    • characters: 将标签内的文本按character一一读出。
    • punctuation: 将标签内的文本按标点符号的方式读出来。
    • date: 按日期发音。
    • time: 按时间发音。
    • currency: 按金额发音。
    • measure: 按计量单位发音。
  4. 每种say-as类型支持的范围

符号 读法
! 叹号
双引号
# 井号
$ dollar
% 百分号
& and
单引号
( 左括号
) 右括号
*
+
, 逗号
-
.
/ 斜杠
: 零冒号
; 分号
< 小于
= 等号
> 大于
? 问号
@ at
[ 左方括号
\ 反斜线
] 右方括号
^ 脱字符
_ 下划线
` 反引号
{ 左花括号
| 竖线
} 右花括号
~ 波浪线
叹号
左双引号
右双引号
左单引号
右单引号
左括号
右括号
逗号
句号
冒号
分号
问号
顿号
省略号
…… 省略号
左书名号
右书名号
人民币符号
大于等于
小于等于
不等于
约等于
± 加减
×
π
Α 阿尔法
Β 贝塔
Γ 伽玛
Δ 德尔塔
Ε 艾普西龙
Ζ 捷塔
Ε 依塔
Θ 西塔
Ι 艾欧塔
Κ 喀帕
拉姆达
Μ
Ν
Ξ 克西
Ο 欧麦克轮
Ρ
西格玛
Τ
Υ 宇普西龙
Φ fai
Χ
Ψ 普赛
Ω 欧米伽
α 阿尔法
β 贝塔
γ 伽玛
δ 德尔塔
ε 艾普西龙
ζ 捷塔
η 依塔
θ 西塔
ι 艾欧塔
κ 喀帕
λ 拉姆达
μ
ν
ξ 克西
ο 欧麦克轮
π
ρ
σ 西格玛
τ
υ 宇普西龙
φ fai
χ
ψ 普赛
ω 欧米伽

其中say-as measure unit table如下表所示:

格式
类别
举例
缩写
长度
nm(纳米) μm(微米) mm(毫米)cm(厘米) m(米) km(千米) ft(英尺) in(英寸)
面积
cm²(平方厘米) ㎡(平方米)km2(平方千米) SqFt(平方英尺)
体积
cm³(立方厘米) m³(立方米)km3(立方千米) mL(毫升) L(升) gallon(加仑)
重量
μg(微克) mg(毫克) g(克)kg(千克)
时间
min(分) sec(秒) ms(毫秒)
电磁
μA(微安) mA(毫安) Ω(欧姆)Hz(赫兹) KHz(千赫兹) MHz(兆赫兹) GHz(吉赫兹) V(伏) kV(千伏) kWh(千瓦时)
声音
dB(分贝)
气压
Pa(帕)kPa(千帕) Mpa(兆帕)
中文单位
支持不限于上述类别的中文单位,例如“米”“秒”“美元”“毫升每瓶”等,以及中文量词,例如“架”“场”“头”“部”“盆”等

5.标签关系

<say-as>标签仅包括文本。

6.示例

4 综合示例

本示例将详细展示SSML的使用方法,您可以直接拷贝到管控台的项目功能配置中,测试效果。

注意:

  1. <speak>
  2. 相传北宋年间,
  3. <say-as interpret-as="date">1121-10-10</say-as>
  4. <say-as interpret-as="address">开封城</say-as>
  5. 郊外的早晨笼罩在一片
  6. <sub alias="双十一">11.11</sub>
  7. 前买买买的欢乐海洋中。一支运货的骡队刚进入城门
  8. <soundEvent src="http://nls.alicdn.com/sound-event/bell.wav"/>
  9. 一个肤白貌美
  10. <phoneme alphabet="py" ph="de5"></phoneme>
  11. 姑娘便拦下第一排的小哥<say-as interpret-as="name">阿发。</say-as>
  12. </speak>
  13. <speak voice="xiaomei">
  14. “亲,本店今日特惠,鞋履全场
  15. <say-as interpret-as="digits">199</say-as>
  16. <say-as interpret-as="cardinal">100</say-as>
  17. 走过路过不要错过”。
  18. </speak>
  19. <speak voice="sicheng" rate="150">
  20. “不啦不啦,赶着上货,已经
  21. <say-as interpret-as="time">09:59:59</say-as>
  22. 了,再晚就供应链断裂了”。
  23. </speak>
  24. <speak>
  25. <say-as interpret-as="name">阿发</say-as>
  26. 擦了擦汗,带着运货队伍,径直穿过闹巷,耳边充斥着各种叫卖声:
  27. </speak>
  28. <speak voice="ninger" rate="200">
  29. 最新花色现染布匹,买两尺送一尺;
  30. </speak>
  31. <speak voice="xiaobei">
  32. 爆款纱帽头盔,7天无理由退货;
  33. </speak>
  34. <speak voice="sijia">
  35. 专治大小方脉,调理男人妇人疑难杂症。
  36. </speak>
  37. <speak>
  38. 突然,一匹马不知怎么受了惊,在路上嘶鸣狂奔
  39. <soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>
  40. 一个孩子也吓坏了,跌跌撞撞地扑向大人怀里
  41. <break time="50ms"/>大喊道:
  42. </speak>
  43. <speak voice="sitong" rate="150">
  44. “妈妈,妈妈!”
  45. </speak>
  46. <speak>
  47. 这时,
  48. <say-as interpret-as="name">阿发</say-as>
  49. 心想
  50. </speak>
  51. <speak effect="robot" pitch="-100">
  52. “吓死宝宝了!”
  53. </speak>
  54. <speak>
  55. 于是他赶紧捂住了
  56. <phoneme alphabet="py" ph="he2 bao1">钱包</phoneme>
  57. 继续赶路送货。一路上,
  58. <say-as interpret-as="address">开封城</say-as>
  59. 的繁荣景象给
  60. <say-as interpret-as="name">阿发</say-as>
  61. 留下了深刻的印象。
  62. </speak>
  63. <speak bgm="http://nls.alicdn.com/bgm/2.wav" backgroundMusicVolume="30" rate="-200">
  64. 物换星移,繁华落尽,于是他在购物狂欢之余握起画笔,勾勒出一幅长卷,并命名为《清明上河图》。
  65. </speak>