如何在VBScript中使用SAPI实现在句中调整语音音调?
问题:VBS结合SAPI重现《Daisy Bell》时,如何实现句内流畅变调?
我尝试用VBS结合SAPI重现《Daisy Bell》,但目前按音调拆分歌词的写法会导致演唱衔接生硬,代码如下:
yellow.Rate = 6 yellow.Speak "<pitch middle = '-10'/> Give." yellow.Speak "<pitch middle = '-8'/> Me." yellow.Speak "<pitch middle = '-5'/> Your."
有没有办法不拆分歌词,直接在句中调整音调,让演唱更流畅?
我试过以下两种写法,虽然歌词衔接变流畅了,但音调调整完全不起作用:
第一种写法:
yellow.Speak "<pitch middle = '-10'> Give <pitch middle = '-8'> Me <pitch middle = '-5'> Your </pitch> </pitch> </pitch>."
第二种写法:
yellow.Speak "<pitch middle = '-10'/> Give, <pitch middle = '-8'/> Me, <pitch middle = '-5'/> Your."
解决方法
要实现句内流畅变调,核心是用对SAPI支持的**SSML(语音合成标记语言)**语法,并启用SSML解析模式,具体操作如下:
1. 正确的SSML格式代码
Set yellow = CreateObject("SAPI.SpVoice") yellow.Rate = 6 ' 调用Speak时指定SSML解析模式(16 = SVSFIsXML),可加1实现异步播放,组合为17 yellow.Speak "<speak>" &_ "<prosody pitch='-10%'>Give</prosody> " &_ "<prosody pitch='-8%'>Me</prosody> " &_ "<prosody pitch='-5%'>Your</prosody>." &_ "</speak>", 17
2. 关键要点
- 用
<prosody>替代<pitch>:SAPI对SSML标准的<prosody>标签支持更稳定,pitch属性可用百分比(如-10%)或预设值(x-low、low等)调整音调。 - 必须加
<speak>根标签:这是SSML的强制结构,没有它SAPI会把标记当成纯文本处理。 - 指定解析模式:
Speak方法的第二个参数必须传入16(常量SVSFIsXML),告诉SAPI要解析SSML内容;如果需要后台播放,再加1(SVSFlagsAsync)即可。 - 单次调用
Speak:把所有带标记的歌词放在同一个Speak调用里,避免拆分导致的衔接生硬。
3. 你的写法失效原因
- 第一种嵌套
<pitch>的写法不符合SSML规范,SAPI无法解析嵌套的音调标记,直接忽略了变调指令。 - 第二种写法既没有
<speak>根标签,也没指定SSML解析模式,SAPI把<pitch>标签当成普通文本朗读,自然不会生效。
内容的提问来源于stack exchange,提问作者TroubledSeas
相关产品推荐
相关产品推荐

