Python开发之路(3)— 使用百度API实现语音合成

Python开发之路(3)— 使用百度API实现语音合成

一、在百度智能云创建语音识别应用

参考上一篇博客即可:在百度智能云创建语音识别应用

二、获取Access Token

同样的,参考上一篇博客即可:获取Access Token

三、向百度服务器请求,获得语言合成结果

通过查阅百度语音合成的技术文档,我们有两种方法向百度服务器请求:
Python开发之路(3)— 使用百度API实现语音合成_第1张图片
我们使用推荐的POST方式,首先将我们需要合成的文字安装技术文档要求做2次urlencode编码,调用parse模块的quote_plus函数即可:

    # 2、将需要合成的文字做2次urlencode编码
    TEXT = "你好,百度语音识别"
    tex = parse.quote_plus(TEXT)  # 两次urlencode

将文本以及其他参数设置好,然后写入body里

    # 3、设置文本以及其他参数
    params = {'tok': token,     # 开放平台获取到的开发者access_token
              'tex': tex,       # 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字
              'per': 4,         # 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
              'spd': 5,         # 语速,取值0-15,默认为5中语速
              'pit': 5,         # 音调,取值0-15,默认为5中语调
              'vol': 5,         # 音量,取值0-15,默认为5中音量
              'aue': 6,         # 下载的文件格式, 3为mp3格式(默认); 4为pcm-16k; 5为pcm-8k; 6为wav(内容同pcm-16k)
              'cuid': "7749py", # 用户唯一标识
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数
    # 4、将参数编码,然后放入body,生成Request对象
    data = parse.urlencode(params)
    req = request.Request("http://tsn.baidu.com/text2audio", data.encode('utf-8'))

设置好即可发送post请求了,

    # 5、发送post请求
    f = request.urlopen(req)
    result_str = f.read()

然后即可处理返回的数据

	# 6、将返回的header信息取出并生成一个字典
    headers = dict((name.lower(), value) for name, value in f.headers.items())
    # 7、如果返回的header里有”Content-Type: audio/wav“信息,则合成成功
    if "audio/wav" in headers['content-type'] :
        print("tts success")
        # 合成成功即将数据存入文件
        with open("result.wav", 'wb') as of:
            of.write(result_str)

运行,可以成功获取到合成的结果
在这里插入图片描述
最后贴上完整代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: William

# encoding:utf-8

import json
from urllib import request,parse

def get_token():
    API_Key = "DF2wS4DQ53TlS8ATxasy0ZXv"            # 官网获取的API_Key
    Secret_Key = "GvADiMXnwATEhaiKuOXg3t37KnKClGWr" # 为官网获取的Secret_Key
    #拼接得到Url
    Url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id="+API_Key+"&client_secret="+Secret_Key
    try:
        resp = request.urlopen(Url)
        result = json.loads(resp.read().decode('utf-8'))
        # 打印access_token
        print("access_token:",result['access_token'])
        return result['access_token']
    except request.URLError as err:
        print('token http response http code : ' + str(err.code))

def main():
    # 1、获取 access_token
    token = get_token()
    # 2、将需要合成的文字做2次urlencode编码
    TEXT = "你好,百度语音合成"
    tex = parse.quote_plus(TEXT)  # 两次urlencode
    # 3、设置文本以及其他参数
    params = {'tok': token,     # 开放平台获取到的开发者access_token
              'tex': tex,       # 合成的文本,使用UTF-8编码。小于2048个中文字或者英文数字
              'per': 4,         # 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
              'spd': 4,         # 语速,取值0-15,默认为5中语速
              'pit': 5,         # 音调,取值0-15,默认为5中语调
              'vol': 5,         # 音量,取值0-15,默认为5中音量
              'aue': 6,         # 下载的文件格式, 3为mp3格式(默认); 4为pcm-16k; 5为pcm-8k; 6为wav(内容同pcm-16k)
              'cuid': "7749py", # 用户唯一标识
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数
    # 4、将参数编码,然后放入body,生成Request对象
    data = parse.urlencode(params)
    req = request.Request("http://tsn.baidu.com/text2audio", data.encode('utf-8'))
    # 5、发送post请求
    f = request.urlopen(req)
    result_str = f.read()
    # 6、将返回的header信息取出并生成一个字典
    headers = dict((name.lower(), value) for name, value in f.headers.items())
    # 7、如果返回的header里有”Content-Type: audio/wav“信息,则合成成功
    if "audio/wav" in headers['content-type'] :
        print("tts success")
        # 合成成功即将数据存入文件
        with open("result.wav", 'wb') as of:
            of.write(result_str)

if __name__ == '__main__':
    main()

你可能感兴趣的:(Python学习)