热爱技术
专注分享

python qq机器之 使用阿里云语音合成让机器人发送好听到炸裂的语音

上一篇文章我们写了用python实现qq机器人的基本操作:

本篇文章,我们来尝试使用语音合成技术,让机器人发送语音消息。博主尝试了市面上大多数知名的语音合成服务商,最后选择了阿里云。先来听一下阿里云语音合成的效果:

博客介绍 – 女声1
新闻播报 – 女声2

一 、 开通阿里云语音合成

语音合成项目地址: 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,'今天天气真不错')

赞(0) 打赏
未经允许不得转载:小伟博客 » python qq机器之 使用阿里云语音合成让机器人发送好听到炸裂的语音

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏