文本转语音通过语音合成标记语言(SSML)改进合成 知识点详解

Posted S 占占

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本转语音通过语音合成标记语言(SSML)改进合成 知识点详解相关的知识,希望对你有一定的参考价值。

1. 创建SSML文档

speak是根元素,speak元素包含重要信息,例如版本,语言和标记词汇定义。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="string"></speak>
属性说明:
version:指示用于解释文档标记的 SSML 规范的版本。 当前版本为 1.0。
xml:lang: 指定根文档语言。
xmlns:指定文档的url,用于定义SSML文档的标记词汇(元素类型和属性名称)

2. 选择文本转语言所用的语音

voice元素用于指定文本转语音所用的语音。

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        This is the text that is spoken.
    </voice>
</speak>
voice标签中name属性标识用于文本转语音时输出的语音

3. 使用多个语音

在speak元素中,可以为文本转语音指定多种语音。这些语音可采用多种语言,
必须将文本包装在voice元素中。

实例:

 	<voice name="en-US-JennyNeural">
        Good morning!
    </voice>
    <voice name="en-US-ChristopherNeural">
        Good morning to you too Jenny!
    </voice>
如上代码,speak标签中的两个voice标签name属性标记了语音的类型

4. 调整讲话风格

默认情况下,对于神经语音,文本转语音服务使用中性讲话风格。可以调整
简化风格来表达不同的情感(例如愉悦、同情和冷静生气等),或者使用 
**mstts:express-as** 元素针对不同场景(例如自定义服务、新闻广播和语音助手)
优化语音。

目前以下神经语音支持讲话风格调整:

  • en-US-AriaNeural

  • en-US-JennyNeural

  • en-US-GuyNeura

  • en-US-SaraNeural

  • ja-JP-NanamiNeural

  • pt-BR-FranciscaNeural

  • zh-cn-XiaoxiaoNeural

  • zh-cn-YunyangNeural

  • zh-cn-YunyeNeural

  • zh-cn-YunxiNeural

  • zh-cn-XiaohanNeural

  • zh-cn-XiaomoNeural

  • zh-cn-XiaoxuanNeural

  • zh-cn-XiaoruiNeural

  • zh-cn-XiaoshuangNeural

     1.若想进一步调整讲话强度,可以使用styledegree 指定更强或更温柔的风格。(目前中文神经语音支持说话风格调整)
     2.除了调整说话风格和风格程度,还可调整 role 参数,使语音模拟不同的年龄和性别。 例如,男性语音可以提高音调和改变			
     语调来模拟女性语音,但语音名称不会更改。 目前,这些中文(普通话,简体)神经语音支持角色调整:
     zh-cn-XiaomoNeural,zh-cn-XiaoxuanNeural
    
<mstts:express-as styledegree="1" role="角色" style="讲话风格"></mstts:express-as>
如上代码所示:
1.属性style指定讲话风格
讲话风格参考:[讲话风格](https://docs.azure.cn/zh-cn/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp#adjust-speaking-styles)
2.属性styledegree指定说话强度在0.01-2(默认值为1)
3.属性role指定讲话角色扮演。 语音将充当不同的年龄和性别,但语音名称不会更改。
	(目前role仅支持zh-cn-XiaomoNeural 和 zh-cn-XiaoxuanNeural)
	角色定义:
	role="Girl"	该语音模拟女孩。
	role="Boy"	该语音模拟男孩。
	role="YoungAdultFemale"	该语音模拟年轻成年女性。
	role="YoungAdultMale"	该语音模拟年轻成年男性。
	role="OlderAdultFemale"	该语音模拟年长的成年女性。
	role="OlderAdultMale"	该语音模拟年长的成年男性。
	role="SeniorFemale"	该语音模拟老年女性。
	role="SeniorMale"	该语音模拟老年男性。

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
       xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="zh-cn">
    <voice name="zh-cn-XiaomoNeural">
        	女儿看见父亲走了进来,问道:
        <mstts:express-as role="YoungAdultFemale" style="calm"	styledegree="1.5">
            “您来的挺快的,怎么过来的?”
        </mstts:express-as>
        	父亲放下手提包,说:
        <mstts:express-as role="OlderAdultMale" style="calm">
          	“刚打车过来的,路上还挺顺畅。”
        </mstts:express-as>
    </voice>
</speak>
如上代码所示:需要在根元素中引入xmlns:mstts才能使用<mstts:express-as>标签在<voice>标签中两个<mstts:express-as>分别定义了此对话的模仿	
角色(role)和讲话风格(style),还有讲话语音强度(styledegree),此对话有三个角色,第一个是讲解(不在mstts标签中的),第二个是女儿
(role="YoungAdultFemale"),第三个是父亲(role="OlderAdultMale"),通过设置role属性可以用一个语音zh-cn-XiaomoNeural讲出三种不同的角色
语调。

5. 调整讲话语言

可以调整神经语音的讲话语言。 使用 <lang xml:lang> 元素,使一种语音能够流利地讲
不同的语言(例如英语、西班牙语和中文)。目前,一下神经语音支持讲话语言调整:
en-US-JennyMultilingualNeural。如果不支持某语言,则服务不会返回音频流。

当前, 元素与 prosody 和 break 元素不兼容,你无法调整此元素中的暂停和韵律,如音调、调型、速率、持续时间和音量。

查看en-US-JennyMultilingualNeural此神经语音:支持的讲话语言

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
       xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
    <voice name="en-US-JennyMultilingualNeural">
        I am looking forward to the exciting things.
        <lang xml:lang="zh-cn>
         你好,小站站!
        </lang>
        <lang xml:lang="de-DE">
            Ich freue mich auf die spannenden Dinge.
        </lang>
    </voice>
</speak>
如上所示通过<lang xml:lang="zh-cn">调整讲话语言为中文,<lang xml:lang="de-DE">
调整讲话语言为德语(但是他们语调还是一个人发出来的,就相当于一个人讲三种语
言)

6. 添加或者删除中断/暂停

使用元素 break 可在单词之间插入暂停(或中断),或者防止文本转语音服务自动添加	
暂停。
备注:
如果某个单词或短语的合成语音听起来不自然,可以使用此元素来重写该单词或短语的
默认文本转语音 (TTS) 行为。 将 strength 设置为 none 可防止文本转语音服务自动插入
的韵律中断。

语法:

<break strength="string" />
<break time="string" />
属性strength 有以下几种属性值:
 1. 无                                            0ms
 2. x-weak										250ms
 3. weak										500ms
 4. medium(默认值)								750ms
 5. strong										1000ms
 6. x-strong									1250ms
 
属性time:指定暂停的绝对持续时间,以秒或毫秒为单位;该值应设为小于 5000 毫秒。 
例如,2s 和 500ms 是有效值

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        Welcome to Microsoft Cognitive Services <break time="100ms" /> Text-to-Speech API.
    </voice>
</speak>

7. 添加静音

使用 mstts:silence 元素在文本前后,或者在两个相邻句子之间添加暂停。
注!!!:mstts:silence 和 break 之间的区别在于,break 可添加到文本中的任何位
置,但静	音仅适合输入文本的开头或结尾,或者两个相邻句子的分界处。

语法:

<mstts:silence  type="string"  value="string"/>
type属性说明:指定添加位置
 - Leading - 在文本的开头
 - Tailing - 在文本的结尾
 - Sentenceboundary  - 在相邻句子之间

value属性说明:指定暂停的绝对持续时间,以秒或毫秒为单位;该值应设为小于 5000 	
毫秒。 例如,2s 和 500ms 是有效值	

8. 指定段落和句子

p 和 s 元素分别用于表示段落和句子。 如果不指定这些元素,则文本转语音服务会自动
确定 SSML 文档的结构。

p 元素可包含文本和以下元素:audio、break、phoneme、prosody、say-as、sub、
mstts:express-as 和 s。

s 元素可包含文本和以下元素:audio、break、phoneme、prosody、say-as、
mstts:express-as 和 sub。

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <p>
            <s>Introducing the sentence element.</s>
            <s>Used to mark individual sentences.</s>
        </p>
        <p>
            Another simple paragraph.
            Sentence structure in this paragraph is not explicitly mark.
        </p>
    </voice>
</speak>

9. 使用音素改善发音

ph 元素用于 SSML 文档中的发音。 ph 元素只能包含文本,而不能包含其他元素。 始终	
提供人类可读的语音作为回退。

音标由音素构成,而这些音素由字母、数字或字符(有时是它们的组合)构成。 每个音
素描述独特的语音。 这与拉丁字母形成鲜明对比,在拉丁字母中,任何字母都可能代表
多种发音。 想像一下单词“candy”和“cease”中字母“c”的不同发音,或者字母组合“th”在单
词“thing”和“those”中的不同发音。

不支持的5种音素标记:et-EE-AnuNeural、ga-IE-OrlaNeural、lt-LT-OnaNeural、
lv-LV-EveritaNeural 和 mt-MT-GarceNeural。

用法:

<phoneme alphabet="string" ph="string"></phoneme>
alphabet属性说明:
指定在 ph 属性中合成字符串发音时要使用的音标。 指定音标的字符串必须以小写字母	
指定。 下面是可以指定的可能音标。
 - ipa -国际音标
 - sapi - 语音服务音标
 - ups - 通用音素集
 
ph属性说明:
一个字符串,包含用于在 phoneme 元素中指定单词发音的音素。 如果指定的字符串包	
含无法识别的音素,则文本转语音 (TTS) 服务将拒绝整个 SSML 文档,并且不会生成文
档中指定的任何语音输出。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <phoneme alphabet="ipa" ph="təˈmeɪtoʊ"> tomato </phoneme>
        <phoneme alphabet="sapi" ph="iy eh n y uw eh s"> en-US</phoneme>
        <s>His name is Mike <phoneme alphabet="ups" ph="JH AU"> Zhou 		 
	         				</phoneme></s>
    </voice>
</speak>

10. 使用自定义词典改善发音

有时文本转语音服务无法准确地根据字词发音。 例如,公司的名称、医学术语或表情符
号。 开发人员可以使用 phoneme 和 sub 标记来定义采用 SSML 朗读单个实体的方式。 
但是,如果需要定义朗读多个实体的方式,则可以使用 lexicon 标记创建自定义词典。

注:
1.自定义词典当前支持UTF-8编码。

2.目前不支持下面五种语言的自定义词典:et-EE-AnuNeural、ga-IE-OrlaNeural、
	lt-LT-OnaNeural、lv-LV-EveritaNeural 和 mt-MT-GarceNeural。

3.元素属性说明:
	(1. lexicon元素至少包含一个lexeme元素。
	(2. 每个lexeme元素至少包含一个grapheme元素以及一个或者多个grapheme、
			alias、	phoneme。
	(3. grapheme 元素包含描述拼字法的文本(需要解释的文本)
	(4. alias元素用于指示某个首字母缩写词或某个缩写词的发音
	(5. phoneme 元素提供了描述 lexeme 发音方式的文本。
	(6. 当 alias 与 phoneme 元素具有相同的 grapheme 元素时,alias 具有更高的优先
	        级。
4. 词典包含必需的 xml:lang 属性,用于指示要应用词典的区域设置。 根据设计,一个自
   定义词典仅限于一种区域设置,因此将其应用于另一种区域设置将无法正常工作。
   
5.需要特别注意的是,不能使用自定义词典直接设置短语的发音。 如果需要设置首字母	    
  缩略词或缩写词的发音,请首先提供 alias,再将 phoneme 与该 alias 关联。
  代码如下:
  <lexeme>
		    <grapheme>Scotland MV</grapheme>
		    <alias>ScotlandMV</alias> 
	   </lexeme>
	   <lexeme>  
		    <grapheme>ScotlandMV</grapheme>
		    <phoneme>ˈskɒtlənd.ˈmiːdiəm.weɪv</phoneme>   
	   </lexeme>`
也可以直接提供所需要的alias作为首字母缩略词或缩写词,例如:
  <lexeme>
    <grapheme>Scotland MV</grapheme>
    <alias>Scotland Media Wave</alias>
  </lexeme>
发布自定义词典文件,发布后可以从SSML引用他。
  <speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
          xmlns:mstts="http://www.w3.org/2001/mstts"
          xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <lexicon uri="http://www.example.com/customlexicon.xml"/>
        BTW, we will be there probably at 8:00 tomorrow morning.
        Could you help leave a message to Robert Benigni for me?
    </voice>
</speak>
如上所示使用此自定义词典时,“BTW”将读作“By the way”。 “Benigni”将通过提供的 	
IPA“bɛˈniːnji”朗读。

11. 调整音律

11.1 调整音律

prosody 元素用于指定文本转语音输出的音节、调型、范围、速率、持续时间和音量的变
化。 prosody 元素可包含文本和以下元素:audio、break、p、phoneme、prosody、
say-as、sub 和 s。

语法:

<prosody pitch="value" contour="value" range="value" rate="value" duration="value" volume="value"></prosody>
属性说明:
 - pitch 指示文本的基线音节。可将音调表述为:
 		1.以某个数字后接“Hz”(赫兹)表示的绝对值。 例如 <prosody pitch="600Hz">some text</prosody>。
 		
 		2.以前面带有“+”或“-”的数字,后接“Hz”或“st”(用于指定音节的变化量)表示的相对值。 例如 <prosody pitch="+80Hz">some text</prosody> 或 
 		  <prosody pitch="-2st">some text</prosody>。 “st”表示变化单位为半音,即,标准全音阶中的半调(半步)。
 		  
 		3.常量值 
 			- x-low
 			- low
 			- 中
 			- high
 			- x-high
 			- 默认值
 			
 - contour 调型现在同时支持神经语音和标准语音。 调型表示音节的变化。 这些变化以语音输出中指定时间处的目标数组形式表示。 每个目标由参数
 		   对的集定义。<prosody contour="(0%,+20Hz) (10%,-2st) (40%,+10Hz)">每参数集中的第一个值以文本持续时间百分比的形式指定音节变化的
 		   位置。 第二个值使用音节的相对值或枚举值指定音节的升高或降低量。
 
 - range 表示文本音节范围的值。 可使用用于描述 pitch 的相同绝对值、相对值或枚举值表示 range。
 - rate 指示文本的讲出速率
 					 - 以充当默认值倍数的数字表示的相对值。 例如,如果值为 1,则速率不会变化。 如果值为 0.5,则速率会减慢一半。 
 					 - 常量值:
 					        - x-slow
 					        - slow
 					        - 中
 					        - fast
 					        - x-fast
 					        - 默认值
 					
 - duration 语音合成 (TTS) 服务读取文本时应该消逝的时长,以秒或毫秒为单位
 - volume  指示语音的音量级别。
 				 - 以从 0.0 到 100.0(从最安静到最大声)的数字表示的绝对值。 例如 75。 默认值为 100.0。
 				 - 以前面带有“+”或“-”的数字表示的相对值,指定音量的变化量。 例如,+10 或 -5.5。
 				 - 常量值:
 						 -	silent
 						 -	x-soft
 						 -	soft
 						 -	中
 						 -	loud
 						 -	x-loud
 						 -	默认值

11.2 更改语速

可以在单词或句子级别对神经语音和标准语音应用语速。

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <prosody rate="+30.00%">
            Welcome to Microsoft Cognitive Services Text-to-Speech API.
        </prosody>
    </voice>
</speak>
语速增加30%

11.3 更改音量

可以在单词或句子级别对标准语音应用音量变化。 只能在句子级别对神经语音应用音量变化。

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <prosody volume="+20.00%">
            Welcome to Microsoft Cognitive Services Text-to-Speech API.
        </prosody>
    </voice>
</speak>
音量增加20%

11.4 更改音高

可以在单词或句子级别对标准语音应用音节变化。 只能在句子级别对神经语音应用音节变化。

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        Welcome to <prosody pitch="high">Microsoft Cognitive Services Text-to-Speech API.</prosody>
    </voice>
</speak>		 		

11.5 更改音高升降曲线

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <prosody contour="(60%,-60%) (100%,+80%)" >
            Were you the only person in the room?
        </prosody>
    </voice>
</speak> 		

12. say-as元素

说明:
say-as 是一个可选元素,指示元素文本的内容类型(例如数字或日期)。 它为语音合成引擎提供有关如何朗读文本的指导。

<say-as interpret-as="string" format="digit string" detail="string"> <say-as>
属性说明:
	interpret-as: 指示元素文本的内容类型.
		文本内容类型参考:[文本内容类型](https://docs.azure.cn/zh-cn/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp#say-as-element)
	formart: 	为可能具有不明确格式的内容类型提供有关元素文本的精确格式设置的其他信息。 SSML 为使用它们的内	
	            容类型定义格式
	detail: 指示要朗读的详细信息的级别。 例如此属性可以要求语音合成引擎朗读标点符号。 没有为 detail 定义标准值
	<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <p>
        Your <say-as interpret-as="ordinal"> 1st </say-as> request was for <say-as interpret-as="cardinal"> 1 </say-as> room
        on <say-as interpret-as="date" format="mdy"> 10/19/2010 </say-as>, with early arrival at <say-as interpret-as="time" format="hms12"> 12:35pm </say-as>.
        </p>
    </voice>
</speak>

13. 添加录制的音频

说明:
audio 是一个可选元素,用于将 MP3 音频插入 SSML 文档。 如果音频文件不可用或不可播放,可在音频元素的正文中包含可讲述的纯文本或 SSML 标记。 此外,audio 元素可包含文本和以下元素:audio、break、p、s、phoneme、prosody、say-as 和 sub。

包含在SSML文件中的任何音频必须满足以下要求:

  • MP3 必须托管在可通过 Internet 访问的 HTTPS 终结点上。 必须使用 HTTPS,托管 MP3 文件的域必须提供有效的受信任 TLS/SSL 证书。
  • MP3 必须是有效的 MP3 文件 (MPEG v2)。
  • 比特率必须是 48 kbps。
  • 采样率必须是 16,000 Hz。
  • 单个响应中所有文本和音频文件的总时间不能超过 90 秒。
  • MP3 不得包含任何客户特定的信息或其他敏感信息。

实例:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-ChristopherNeural">
        <p>
            <audio src="https://contoso.com/opinionprompt.wav"/>
            Thanks for offering your opinion. Please begin speaking after the beep.
            <audio src="https://contoso.com/beep.wav">
            //通过src指定音频文件位置
                Could not play the beep, please voice your opinion now.
            </audio>
        </p>
    </voice>
</speak>

14. 添加背景音频

说明:
1.使用 mstts:backgroundaudio 元素可将背景音频添加到 SSML 文档(或者使用文本转语音来混合音频文件)。 使用 mstts:backgroundaudio 可以在后台循环音频文件,在文本转语音的开头淡入,并在文本转语音的末尾淡出。

2.如果提供的背景音频短于文本转语音或淡出持续时间,则会循环该音频。 如果其长度超过文本转语音的持续时间,则它在完成淡出后将会停止。

3.每个 SSML 文档仅允许一个背景音频文件。 但是,可以在 voice 元素中散布 audio 标记,以将更多的音频添加到 SSML 文档。

属性说明:
 - src   指定背景音频文件的位置/URL。
 - volume   指定背景音频文件的音量。 接受的值:0 到 100(含)。 默认值为 1。
 - fadein   指定背景音频淡入的持续时间,以毫秒为单位。 默认值为 0,即,不淡入。 接受的值:0 到 10000(含)  
 - fadeout   指定背景音频淡出的持续时间,以毫秒为单位。 默认值为 0,即,不淡出。接受的值:0 到 10000(含)

实例

<speak version="1.0" xml:lang="en-US" xmlns:mstts="http://www.w3.org/2001/mstts">
    <mstts:backgroundaudio src="https://contoso.com/sample.wav" volume="0.7" fadein="3000" fadeout="4000"/>
    <voice name="Microsoft Server Speech Text to Speech Voice (en-US, ChristopherNeural)">
        The text provided in this document will be spoken over the background audio.
    </voice>
</speak>

15. Bookmark元素

说明:
使用 bookmark 元素可以在 SSML 中插入自定义标记,以获得音频流中每个标记的偏移量。 我们不会读出 bookmark 元素。 bookmark 元素可用于引用文本或标记序列中的特定位置。目前,bookmark 元素仅适用于en-US-AriaNeural语音

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="en-US-AriaNeural">
        We are selling <bookmark mark='flower_1'/>roses and <bookmark mark='flower_2'/>daisies.
    </voice>
</speak>
属性说明:
	mark: 指定bookmark元素的引用文本。

16. 使用语音SDK获取书签

1.通过语音 SDK 中的 BookmarkReached 事件来获取书签偏移量。
2.BookmarkReached 事件在输出音频数据变为可用时引发,这样将会比播放到输出设备更快。

实例:

synthesizer.BookmarkReached += (s, e) =>

    // The unit of e.AudioOffset is tick (1 tick = 100 nanoseconds), divide by 10,000 to convert to milliseconds.
    Console.WriteLine($"Bookmark reached. Audio offset: " +
        $"e.AudioOffset / 10000ms, bookmark text: e.Text.");
;
1. AudioOffset 会报告输出音频在合成的开始处到 bookmark 元素之间经历的时间。 此时间以百纳秒单位 (HNS) 进行测
	量,10,000 HNS 相当于 1 毫秒。
2. Text 是 bookmark 元素的引用文本(在 mark 属性中设置的字符串)。

对于上面的示例 SSML,BookmarkReached 事件会触发两次,控制台输出将如下所示:

Bookmark reached. Audio offset: 825ms, bookmark text: flower_1.
Bookmark reached. Audio offset: 1462.5ms, bookmark text: flower_2.

以上是关于文本转语音通过语音合成标记语言(SSML)改进合成 知识点详解的主要内容,如果未能解决你的问题,请参考以下文章

文本转音频(百度语音合成api)(python)

使用 SSML 说话时如何跳过部分文本

微信小程序之文本合成语音朗读及长文本分段播放处理

Android TextToSpeech TTS中文文本转语音(语音合成)

Android TextToSpeech TTS中文文本转语音(语音合成)

「微信同声传译」小程序插件:快速实现语音转文字文本翻译语音合成等能力