上一篇文章我们写了用python实现qq机器人的基本操作:
本篇文章,我们来尝试使用语音合成技术,让机器人发送语音消息。博主尝试了市面上大多数知名的语音合成服务商,最后选择了阿里云。先来听一下阿里云语音合成的效果:
一 、 开通阿里云语音合成
语音合成项目地址: https://ai.aliyun.com/nls/tts
开通免费版本后,进入控制台,创建一个新的项目:

然后进入你的项目,切换到“语音合成”,选择一个你喜欢的声音,点“发布上线”(上方有一个appkey,请记下来):

二、 阿里云接口调用之计算鉴权秘钥
阿里云的鉴权秘钥(Access Token)是对所有阿里云服务都适用的一种秘钥,就是说任意项目要请求阿里云的接口,都需要计算这个秘钥(区别于TTS接口鉴权)。我们在适用语音合成接口的时候,需要先用阿里云的开发者id和秘钥计算出鉴权秘钥,然后在通过这个鉴权秘钥组合语音合成(TTS)的appkey,来请求语音合成接口。因为鉴权秘钥存在过期时间,最好的解决方法就是,每次请求语音合成接口,都先计算一遍这个秘钥。
计算鉴权秘钥的官方文档:https://help.aliyun.com/document_detail/72153.html
为了方便我们使用SDK来操作。
Access Key: 阿里云开发者ID,又称为访问公钥。
Access Secret: 阿里云开发者秘钥,又称访问秘钥。
Access Token:通过Access Key 和 Access Secret 计算出来的鉴权秘钥,有时效性。
app key:项目的公钥,搭配Access Token来请求接口。
首先安装阿里云SDK核心库: 命令行执行 pip install aliyun-python-sdk-core
获取阿里云开发者ID和开发者秘钥:
https://usercenter.console.aliyun.com/manage/ak#/manage/ak (AccessKey和AccessSecret就是开发者ID和秘钥)
用python计算鉴权秘钥:
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
def get_aliyun_secret():
client = AcsClient('你的开发者ID',
'你的开发者秘钥',
'cn-shanghai'
)
request = CommonRequest()
request.set_method('POST')
request.set_domain('nls-meta.cn-shanghai.aliyuncs.com')
request.set_version('2019-02-28')
request.set_action_name('CreateToken')
r = client.do_action_with_exception(request)
r = json.loads(r.decode())
return r['Token'].get('Id')
三、 阿里云接口调用之语音合成
语音合成文档: https://help.aliyun.com/document_detail/94737.html
语音合成带有python的SDK,但是无法pip安装,比较麻烦,所以我们采用Restful API形式(http调用)。
http调用的方式,我们只需要用requests的post即可,将相关参数post到阿里云接口,即可返回音频。
import requests
import base64
def tts(text):
data = {
'appkey':'你的appkey', #语音合成项目里的appkey
"text": text, #要语音合成的文字
'token':get_aliyun_secret(), #上一步的鉴权秘钥
'format':'mp3', #合成语音的格式
"sample_rate": "16000", #比特率
"volume":'90', #音量
"pitch_rate":'0', #语调
"speech_rate":'-250', #语速
"voice":'Siyue' #发音人 参数详见 https://help.aliyun.com/document_detail/84435.html
}
header = {
"Content-Type": "application/json;charset=UTF-8"
}
r = requests.post('https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts',data=json.dumps(data),headers=header)
return base64.b64encode(r.content).decode()
运行后会返回base64编码的语音。
四、使用酷Q pro
免费版的酷Q Air不支持发送语音,我们需要去下载一个酷Q pro,然后开个会员…
下载地址: https://cqp.cc/t/14901
然后按照上一篇文章的方法,配置酷Q http API。
五、发送语音
以发送群聊语音为例:
def send_record(group_id,text):
api_url = 'http://127.0.0.1:5700/send_msg'
data = {
'msg_type': 'group',
'group_id':group_id,
'message':'[CQ:record,file=base64://{}]'.format(tts(text))
}
requests.post(api_url,data=data)
调用这个方法,传入qq群号,和要发送的文本,即可直接把文字转成语音发送到群聊啦。

六、 完整代码
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
import json
import requests
accessKey = ''
accessSecret = ''
appKey = ''
botServerApi = 'http://127.0.0.1:5700/send_msg'
def get_aliyun_secret():
client = AcsClient(accessKey,accessSecret,'cn-shanghai')
request = CommonRequest()
request.set_method('POST')
request.set_domain('nls-meta.cn-shanghai.aliyuncs.com')
request.set_version('2019-02-28')
request.set_action_name('CreateToken')
r = client.do_action_with_exception(request)
r = json.loads(r.decode())
return r['Token'].get('Id')
def tts(text):
data = {
'appkey':'你的appkey', #语音合成项目里的appkey
"text": text, #要语音合成的文字
'token':get_aliyun_secret(), #上一步的鉴权秘钥
'format':'mp3', #合成语音的格式
"sample_rate": "16000", #比特率
"volume":'90', #音量
"pitch_rate":'0', #语调
"speech_rate":'-250', #语速
"voice":'Siyue' #发音人 参数详见 https://help.aliyun.com/document_detail/84435.html
}
header = {
"Content-Type": "application/json;charset=UTF-8"
}
r = requests.post('https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts',data=json.dumps(data),headers=header)
return base64.b64encode(r.content).decode()
def send_record(group_id,text):
api_url = 'http://127.0.0.1:5700/send_msg'
data = {
'msg_type': 'group',
'group_id':group_id,
'message':'[CQ:record,file=base64://{}]'.format(tts(text))
}
requests.post(api_url,data=data)
if __name__ == '__main__':
send_record(12345678,'今天天气真不错')