使用 SSML 文件创建文本转语音应用程序
- 5 分钟
在上一个的练习中,你了解了如何创建读取文本文件的应用程序,将内容转换为语音,然后创建包含结果的音频文件。 这些结果非常适合公司的视频需求,但经理想知道是否有某种方法可以更好地控制应用程序的文本转语音操作的结果。 例如,视频团队希望在单个音频文件中拥有多个虚拟扬声器,并且他们希望更改某些播放参数,例如语速和音调。
幸运的是,Azure 认知服务的文本转语音功能适用于语音合成标记语言 (SSML),可用于自定义应用程序将创建的语音。
通过语音合成标记语言 (SSML) 改进合成文章中有大量关于 SSML 的信息,本单元中包含的信息太多了。 考虑到这一点,本单元将简要概述 SSML,帮助你入门。
创建 SSML 文件
启动新的 SSML 文件
SSML 文件使用 XML 语法,SSML 文件的根元素是一个 <speak> 元素。 将该元素添加到新文件时,它应类似于以下摘录。
XML复制
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US">
</speak>
指定不同的语音
若要指定不同的语音,可以在 <voice> 父元素中包含的不同 <speak> 元素中换行文本,并且通过向 <voice> 元素添加 name 属性来指定要使用的语音,这可能与以下摘录类似。
XML复制
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US">
<voice name="en-AU-NatashaNeural">
Hello world!
This is Natasha!
</voice>
<voice name="en-IN-NeerjaNeural">
Hello world!
This is Neerja!
</voice>
<voice name="en-CA-LiamNeural">
Hello world!
This is Liam!
</voice>
<voice name="en-US-JennyNeural">
Hello world!
This is Jenny!
</voice>
</speak>
备注
有关可以使用的语音列表,请参阅语音服务的语言和语音支持的“文本转语音”部分。
调整语速和音调
若要指定不同的语速或音调,请将文本括在 <prosody> 元素中,然后按这些属性指定语速或音调,如以下示例所示。
XML复制
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US">
<voice name="en-AU-NatashaNeural">
<prosody rate="-5" pitch="5%">
Hello world!
This is Natasha!
</prosody>
</voice>
<voice name="en-IN-NeerjaNeural">
<prosody rate="-10%" pitch="0%">
Hello world!
This is Neerja!
</prosody>
</voice>
<voice name="en-CA-LiamNeural">
<prosody rate="-10%" pitch="-5%">
Hello world!
This is Liam!
</prosody>
</voice>
<voice name="en-US-JennyNeural">
<prosody rate="-5%" pitch="0%">
Hello world!
This is Jenny!
</prosody>
</voice>
</speak>
在语音中添加停顿
<break> 元素非常适合控制语音何时应该发声,可用于调整旁白的整体时间。 <break> 元素具有 time 属性,可用于指定延迟量,如下面的示例所示。
XML复制
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US">
<voice name="en-AU-NatashaNeural">
Hello world!
<break time="1s" />
This is Natasha!
</voice>
<voice name="en-IN-NeerjaNeural">
<break time="1s" />
Hello world!
This is Neerja!
</voice>
<voice name="en-CA-LiamNeural">
Hello world!
This is Liam!
<break time="1s" />
</voice>
<voice name="en-US-JennyNeural">
<prosody rate="-5%" pitch="0%">
Hello world!
<break time="1s" />
This is Jenny!
</prosody>
</voice>
</speak>
帮助语音合成引擎处理不熟悉的单词
如果应用程序需要的单词难以使用 Azure 认知服务的文本转语音功能进行发音,则可以将这些难词包含在 <phoneme> 元素中,然后使用 ph 属性通过由 alphabet 属性指定的相应音标拼写出发音。
XML复制
<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="en-US">
<voice name="en-SG-WayneNeural">
The Arizona State Flower is the <phoneme alphabet="sapi" ph="s aa w aa r o">Saguaro</phoneme> Cactus Blossom.
</voice>
</speak>
备注
有关使用音标的详细信息,请参阅语音服务音标集。
为 SSML 文件创建文本转语音应用程序
使用 Azure 认知服务创建将 SSML 转换为语音的应用程序的过程类似于在上一练习中创建的文本文件。 考虑到这一点,应用程序必须完成以下所有任务。
添加
Microsoft.CognitiveServices.Speech包。从文件中读取 SSML。
使用 Azure 认知服务帐户中的 API 密钥创建
SpeechConfig类。使用
SpeechConfig类创建SpeechSynthesizer类。调用
SpeechSynthesizer类的SpeakSsmlAsync()方法,将 SSML 转换为语音。使用
SpeakSsmlAsync()方法的结果创建AudioDataStream类。调用
AudioDataStream类的SaveToWaveFileAsync()方法,将音频保存到 WAVE 文件。