实战 | Python 实现 AI 语音合成技术

实战 | Python 实现 AI 语音合成技术0 前言本文首发于公众号 可乐 python 说如今 语音识别 语音合成等技术在各行各业得到广泛应用 各种大厂平台也顺势发展 对各类流行开发语言的支持也十分友好 今天我将选择百度云作为案例演示平台 使用 Python 开发语言实现语音合成的小案例 1 语音合成技术语音合成 speechsynthe 是通过机械的 电子的方法产生人造语音的技术 TTS 技术 又称文语转换技术 隶属于语音合成 它是将计算机自己产生的 或外部输入的文字信息转变为可以听得懂的 流利的汉语口语输出的技术

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/,并注册、登陆。

1.百度云首页.png

2、进入控制台页面,选择语音技术,并点击 创建应用

2.语音技术.png

2.1.创建应用.png

3、填写相关信息后点击,立即创建

3.描述应用.png

4、创建完毕后,就可管理刚刚创建的应用,查看 应用ID、密钥 等参数。

4.管理应用.png

5、进入 SDK 资源网页,下载在线合成 Python-SDK 压缩文件。

5.SDK.png

6、解压后的 SDK 中的 api 目录结构如下图,具体实现可参考 接口说明

SDK目录.png

6.接口说明.png
3.2 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、接口相关参数配置如下图。

接口参数描述.png

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 文件内容如下图(这里使用相见恨晚的歌词测试):

txt文件png.png

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、关注公众号,后台回复 语音合成 获取完整源码,有任何疑问欢迎留言交流。

实战 | Python 实现 AI 语音合成技术

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222378.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:54
下一篇 2026年3月17日 下午3:55


相关推荐

  • GML简介

    GML简介GML GeographyMar 是基于 XML 的空间信息编码标准 由 OpenGISConso OGC 提出 得到了许多公司的大力支持 如 Oracle Galdos MapInfo CubeWerx 等 运用 GML 封装的地理数据和图形解释是清楚分离的 nbsp GML 基于 XML 用文本表示地理信息由于 GML 可看成是 XML 的一个具体的词表 熟悉了 XML 就比较容易理解 GML

    2026年3月19日
    3
  • vue eslint报错_如何关闭eslint

    vue eslint报错_如何关闭eslintvue.config.js中module.exports={lintOnSave:false}或者只在开发环境中开启eslint自检lintOnSave:process.env.NODE_ENV!==”production”,

    2022年10月8日
    3
  • 强大的Winform Chart图表控件使用说明

    强大的Winform Chart图表控件使用说明强大的 WinformChart 图表控件使用说明引言使用说明使用示例资料引言以前经常开发网页端的软件 图表组件一般用 echart 功能和样式都非常齐全 但是当用 winform 开发时 类似的组件就很少了 而且稍微好点的都还收费 后来探索了下 winform 自带的 chart 控件 发现其功能非常强大 只要你有好看的设计图 基本上都可以按设计图调整出来 下面展示下自己做技术测试的图片 使用说明

    2026年3月19日
    2
  • android模拟器加速,配置android模拟器加速(虚拟化加速)

    android模拟器加速,配置android模拟器加速(虚拟化加速)使用 android 官网的配置虚拟机加速的技术能使得模拟器达到甚至超越真实的手机运行速度 也能大大提高工程部署速度 本文引用地址 http www eepw com cn article 201610 305387 htm 具体实现步骤 1 安装虚拟化驱动 打开 AndroidSDKMa gt selectExtras gt IntelHardwar

    2026年3月26日
    2
  • oracle数据库的备份与恢复_数据库备份文件怎么恢复

    oracle数据库的备份与恢复_数据库备份文件怎么恢复Oracle的备份与恢复有三种标准的模式,大致分为两大类,备份恢复(物理上的)以及导入导出(逻辑上的),而备份恢复又可以根据数据库的工作模式分为非归档模式(Nonarchivelog-style)和归档模式(Archivelog-style),通常,我们把非归档模式称为冷备份,而相应的把归档模式称为热备份,他们的关系如下所示备份与恢复

    2025年6月14日
    4
  • MySQL中的数据类型_请列举MySQL中常见的数据类型

    MySQL中的数据类型_请列举MySQL中常见的数据类型还在纠结javaType和jdbcType?MySQL数据类型对应Java什么类型?JdbcType类型和Java对象有什么对应关系?数据库类型的Integer是对应int还是对应Integer?本文带你一探究竟!

    2025年8月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号