0. 前言
本文首发于公众号:可乐python说
如今,语音识别、语音合成
等技术在各行各业得到广泛应用,各种大厂平台也顺势发展,对各类流行开发语言的支持也十分友好。
今天我将选择 百度云
作为案例演示平台,使用 Python
开发语言实现语音合成的小案例。
1. 语音合成技术
语音合成(speech synthesis)是通过机械的、电子的方法产生人造语音的技术。
TTS
技术(又称文语转换技术)隶属于语音合成,它是将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的汉语口语输出的技术。
简单来说,就是可以将我们的文字信息,转换成音频数据,我们可以以文件的形式保存,为后续的使用提供便利。
2.案例实现
2.1 API 设计
案例的API设计如下:
if __name__ == '__main__':
app_id = '应用 ID'
api_key = 'API 开发密钥'
secret_key = '密钥'
AipSpeech(app_id, api_key, secret_key).main()
3.实现流程
3.1 准备工作
1、进入百度云官网 https://cloud.baidu.com/,并注册、登陆。
2、进入控制台页面,选择语音技术,并点击 创建应用
。
3、填写相关信息后点击,立即创建
。
4、创建完毕后,就可管理刚刚创建的应用,查看 应用ID、密钥
等参数。
5、进入 SDK
资源网页,下载在线合成 Python-SDK
压缩文件。
6、解压后的 SDK 中的 api 目录结构如下图,具体实现可参考 接口说明
。
为了方便使用,我们可对 SDK 进行封装,改写部分内容。
1、新建 baidu_speech_synthesis.py
文件。
# -*- coding: utf-8 -*-
"""
Speech_Synthesis
"""
import base64
import hmac
import json
import hashlib
import datetime
import time
import sys
import requests
2、将 base.py
文件中 AipBase
类的相关代码拷贝到刚刚创建的 baidu_speech_synthesis.py
文件中,删除 python2
的相关写法。
# 以上略
class AipBase(object):
"""
AipBase
"""
__accessTokenUrl = 'https://aip.baidubce.com/oauth/2.0/token'
__reportUrl = 'https://aip.baidubce.com/rpc/2.0/feedback/v1/report'
__scope = 'brain_all_scope'
def __init__(self, app_id, api_key, secret_key):
"""
AipBase(app_id, api_key, secret_key)
"""
self._app_id = app_id.strip()
self._api_key = api_key.strip()
self._secret_key = secret_key.strip()
self._auth_obj = {
}
self._is_cloud_user = None
self.__client = requests
self.__connect_timeout = 60.0
self.__socket_timeout = 60.0
self._proxies = {
}
self.__version = '2_0_0'
def get_version(self):
"""
version
"""
return self.__version
def set_connection_timeout_in_millis(self, ms):
"""
set_connection_timeout_in_millis
建立连接的超时时间(单位:毫秒)
"""
self.__connect_timeout = ms / 1000.0
def set_socket_timeout_in_millis(self, ms):
"""
set_socket_timeout_in_millis
通过打开的连接传输数据的超时时间(单位:毫秒)
"""
self.__socket_timeout = ms / 1000.0
def set_proxies(self, proxies):
"""
proxies
"""
self._proxies = proxies
# 由于代码量大,以下略...
3、将 speech.py
文件中 AipSpeech
类的相关代码拷贝到刚刚创建的 baidu_speech_synthesis.py
文件中。
# 以上略
class AipSpeech(AipBase):
"""
Aip Speech
"""
__asrUrl = 'http://vop.baidu.com/server_api'
__ttsUrl = 'http://tsn.baidu.com/text2audio'
def _is_permission(self, auth_obj):
"""
check whether permission
"""
return True
def _proccess_request(self, url, params, data, headers):
"""
参数处理
"""
token = params.get('access_token', '')
if not data.get('cuid', ''):
data['cuid'] = hashlib.md5(token.encode()).hexdigest()
if url == self.__asrUrl:
data['token'] = token
data = json.dumps(data)
else:
data['tok'] = token
if 'access_token' in params:
del params['access_token']
return data
def _proccess_result(self, content):
"""
formate result
"""
try:
return super(AipSpeech, self)._process_result(content)
except Exception as e:
return {
'__json_decode_error': content,
}
# 由于代码量大,以下略...
4、处理baidu_speech_synthesis.py
文件中 disable_warnings()
的导包问题,改写部分方法,修改部分变量命名。
from urllib3 import disable_warnings
from urllib.parse import urlencode
from urllib.parse import quote
from urllib.parse import urlparse
disable_warnings()
5、接口相关参数配置如下图。
6、在 AipSpeech 中封装 main 入口方法,我配置 per 为 3 ,选择男生情感合成。
class AipSpeech(AipBase):
"""
Aip Speech
"""
# 中间部分略
def main(self):
"""入口方法"""
api_ = AipSpeech(self._app_id, self._api_key, self._secret_key)
# 我们要合成文本信息保存在 baidu_speech.txt 文件中
with open("baidu_speech.txt", 'r', encoding="utf-8") as read_f:
read_content = read_f.read()
result = api_.synthesis(read_content, 'zh', 1, {
'vol': 5, 'per': 3})
# 识别正确返回二进制数据 错误则返回dict码
if not isinstance(result, dict):
# 合成的语音文件名为
with open('baidu_speech.mp3', 'wb') as f:
f.write(result)
以上,便完成了整个百度语音合成的 API 封装,关注公众号,后台回复 语音合成
获取完整源码。
4.使用 API 实现语音合成
1、配置 API 参数,在baidu_speech_synthesis.py最下方定义API调用demo。
if __name__ == '__main__':
app_id = '这里改成你的应用 ID'
api_key = '这里改成你的API 开发密钥'
secret_key = '这里改成你密钥'
AipSpeech(app_id, api_key, secret_key).main()
2、baidu_speech.txt 文件内容如下图(这里使用相见恨晚的歌词测试):
3、执行完程序,会在同级目录下生成一个名为baidu_speech.mp3的音频文件,下面我可以使用播放工具播放即可。
5.总结
1、原创文章已全部更新至 Github:https://github.com/kelepython/kelepython
2、本文永久博客地址:https://kelepython.readthedocs.io/zh/latest/c03/c03_02.html
3、整个实现案例比较简单,建议大家亲自尝试一下。
4、封装代码时一定要细心,建议每次封装完一个小块,就执行验证其正确性。
5、案例合成语音使用中音量、情感合成男声,如果感兴趣,可自行调整参数尝试。
6、关注公众号,后台回复
语音合成
获取完整源码,有任何疑问欢迎留言交流。