TTS那些事
TTS语音合成技术是实现人机语音通信关键技术之一。使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞争市场。和语音识别ASR相比,语音合成的技术相对说来要成熟一些,是应用范围较广的技术。
TTS看上去很高大上,但其实这不是什么新技术,当然如果想语言合成更加智能,人物语音更加丰富,语音感情丰富的话就另当别论了。
最简单的TTS是使用Windows自带的语音系统,对于Python来说,语音合成可以直接使用第三库pyttsx3实现,而且用法简单,具体可以查看官方文档
如果要使用Golang实现文字合成语音,目前还没有比较好的第三库,大多数是播放音频文件,例如htgo-tts、oto等等。
如果要实现文字合成语音,可以使用Windows自带的语音功能,Golang通过底层调用即可实现,其原理和Python的pyttsx3相同。
文本转语音
实现Windows自带的语音功能,我们还是使用第三库go-ole实现,其说明可以参考上一篇文章:Golang 实现word和Excel处理。
万变不离其宗,想通过程序使用Windows功能,必须按照Windows开发文档去写代码,否则就无从下手,特别在网上资料比较缺乏的情况下,更让人着急。
打开Windows文档,本次实现文字合成语音需要使用下图的属性和方法:
下面代码实现以下功能:设置语速、设置音量、文字播放语音、等待播放结束、保存wav文件,代码如下:
package main
import (
"github.com/go-ole/go-ole"
"github.com/go-ole/go-ole/oleutil"
)
func main() {
ole.CoInitialize(0)
unknown, _ := oleutil.CreateObject("SAPI.SpVoice")
voice, _ := unknown.QueryInterface(ole.IID_IDispatch)
saveFile, _ := oleutil.CreateObject("SAPI.SpFileStream")
ff, _ := saveFile.QueryInterface(ole.IID_IDispatch)
// 打开wav文件
oleutil.CallMethod(ff, "Open", "E:\\mygo\\aa.wav", 3, true)
// 设置voice的AudioOutputStream属性,必须是PutPropertyRef,如果是PutProperty就无法生效
oleutil.PutPropertyRef(voice, "AudioOutputStream", ff)
// 设置语速
oleutil.PutProperty(voice, "Rate", -3)
// 设置音量
oleutil.PutProperty(voice, "Volume", 200)
// 说话
oleutil.CallMethod(voice, "Speak", "您有新工单,请及时处理!")
oleutil.CallMethod(voice, "Speak", "bb", 1)
// 停止说话
//oleutil.CallMethod(voice, "Pause")
// 恢复说话
//oleutil.CallMethod(voice, "Resume")
// 等待结束
oleutil.CallMethod(voice, "WaitUntilDone", 1000000)
// 关闭文件
oleutil.CallMethod(ff, "Close")
ff.Release()
voice.Release()
ole.CoUninitialize()
}
open方法是打开文件,其参数设置可以参考:open参数说明
Speak方法是播放语音,其参数设置可以参考:Speak参数说明
总结
上述示例代码只是简单演示TTS基本功能,更多功能开发需要自己啃Windows官方文档了。