基于微软TTS,优雅的实现文本转语音

news2024/11/26 8:31:06

项目介绍

该项目源自以前了解的edge-tts,edge-tts 是一个python库,用于将文本转换为语音,它依赖于 Microsoft Azure 的 Text-to-Speech 服务,可以轻松实现本地文字转语音,在所有的文字转语音的服务中,说它是"最好用的"也不为过,包含了众多“网红主播”的voice (晓晓、云扬、云希...)

本地使用方法如下:

#安装edge-tts库
pip install edge-tts

#查看支持的声音
edge-tts --list-voices

#执行以下命令就可以生成音频(采用xiaoxiao的中文发音)
edge-tts  --voice zh-CN-XiaoxiaoNeural --text "Hello, world!" --write-media hello.mp3 

后续在这个库的基础上,用python封装成了简单的web服务,使项目能够通过普通的http来调用文本转语音服务

项目主要采用了Flask + edge-tts + gunicorn + cos来实现了这个web服务。可以将文件保存到本地,也可以上传到腾讯云COS,项目能本地运行也可以通过Docker部署到应用服务器

具体的代码实现

1、引用flask框架和flask_cors ,来实现简单的 Flask Web 服务

from flask import Flask, request
from flask_cors import CORS


app = Flask(__name__, static_folder='tts')  # 指定静态文件夹
CORS(app)  # 这样设置允许所有来源的请求



if __name__ == "__main__":
    app.run(port=2020,host="127.0.0.1",debug=True)

2、接收http请求,处理文本的转换

2.1 voice选用了常用的中文角色来做了一个简单的 封装方便接口传参

voiceMap = {
    "xiaoxiao": "zh-CN-XiaoxiaoNeural",
    "xiaoyi": "zh-CN-XiaoyiNeural",
    "yunjian": "zh-CN-YunjianNeural",
    "yunxi": "zh-CN-YunxiNeural",
    "yunxia": "zh-CN-YunxiaNeural",
    "yunyang": "zh-CN-YunyangNeural",
    "xiaobei": "zh-CN-liaoning-XiaobeiNeural",
    "xiaoni": "zh-CN-shaanxi-XiaoniNeural",
    "hiugaai": "zh-HK-HiuGaaiNeural",
    "hiumaan": "zh-HK-HiuMaanNeural",
    "wanlung": "zh-HK-WanLungNeural",
    "hsiaochen": "zh-TW-HsiaoChenNeural",
    "hsioayu": "zh-TW-HsiaoYuNeural",
    "yunjhe": "zh-TW-YunJheNeural",
}


def getVoiceById(voiceId):
    return voiceMap.get(voiceId)
2.2 通过dealAudio接口来接收参数,调用createAudio 来处理文字转音频

def createAudio(text, file_name, voiceId):
    new_text = remove_html(text)
    print(f"Text without html tags: {new_text}")
    voice = getVoiceById(voiceId)
    if not voice:
        return "error params"

    pwdPath = os.getcwd()
    #本地路径
    filePath = pwdPath + "/tts/" + file_name
    #相对路径
    relativePath = "/tts/" + file_name
    dirPath = os.path.dirname(filePath)
    if not os.path.exists(dirPath):
        os.makedirs(dirPath)
    if not os.path.exists(filePath):
        # 用open创建文件 兼容mac
        open(filePath, 'a').close()

    script = 'edge-tts --voice ' + voice + ' --text "' + new_text + '" --write-media ' + filePath
    os.system(script)
    #这里可以选择上传云存储和本地使用
    # 上传到腾讯云COS云存储-返回云存储地址
#     url = uploadCos(filePath, relativePath)

    # 音频保存到本地-直接返回音频地址
    url = f'http://127.0.0.1:2020/{relativePath}'
    return url



@app.route('/dealAudio',methods=['POST','GET'])
def dealAudio():
    text = getParameter('text')
    file_name = getParameter('file_name')
    voice = getParameter('voice')
    return createAudio(text, file_name, voice)


注释部分可以看到,可以选用本地化存储和云存储两种方式

3 音频文件的使用和调用

3.1 本地存储,在生成音频的时候已经存储到本地了,只需要开通一个本地静态文件调用的接口

# 添加一个路由来处理静态文件的请求
@app.route('/static/<path:filename>')
def serve_static(filename):
    return send_from_directory(app.static_folder, filename)
3.2 上传到腾讯云COS

提供的sdk上传文件到cos中(当然也能上传到其他 云厂商的云存储中,看个人喜好),上传完成之后删除本地生成文件


#上传到COS
def uploadCos(file_path,relativePath):
    # 腾讯云COSV5Python SDK, 目前可以支持Python2.6与Python2.7以及Python3.x
    # pip安装指南:pip install -U cos-python-sdk-v5
    # cos最新可用地域,参照https://www.qcloud.com/document/product/436/6224
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)

    # 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成
    region = ''      # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket
    secret_id = ''     # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
    secret_key = ''   # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi
    bucket_name = ''

    # COS支持的所有region列表参见https://www.qcloud.com/document/product/436/6224
    token = None               # 如果使用永久密钥不需要填入token,如果使用临时密钥需要填入,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048
    domain = None # domain可以不填,此时使用COS区域域名访问存储桶。domain也可以填写用户自定义域名,或者桶的全球加速域名
    config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Domain=domain)  # 获取配置对象
    client = CosS3Client(config)
    # 文件流 简单上传
    with open(f'./{relativePath}', 'rb') as fp:
        response = client.put_object(
            Bucket=bucket_name,
            Body=fp,
            Key=relativePath,
            StorageClass='STANDARD',
            ContentType='audio/mpeg'
        )
        print(response['ETag'])
    # 上传完成之后删除文件
    os.remove(file_path)  # 删除文件

    # 构建文件的访问 URL
    url = f"https://{bucket_name}.cos.{region}.myqcloud.com{relativePath}"
    print("文件访问路径:", url)
    return url

项目在github上已经开源,项目仓库地址 edge-ttsicon-default.png?t=N7T8https://github.com/lyz1810/edge-tts

下面是我用本项目 + uniapp做了一个简单的wx小程序。实现文本转语音的功能,扫码可以体验

后续扩展

- 结合数字人模型,开口说话 live2d + edge-tts 优雅的实现数字人讲话 ~-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity透视镜透视效果——Shader

一、效果示意图 二、透视的过程 要看的效果&#xff1a;【相机】借助【球体】&#xff0c;透过【圆柱】看到【红色的方块】 三、实现原理-Shader 借助shader&#xff0c;两个挂有特殊shader的物体&#xff0c;当他们在视线里重叠的时候&#xff0c;重叠的部分变成透明。 …

Android NDK开发入门

目录 1. 创建 C 代码2. 定义 JNI 接口3. 在 Java 中声明本地方法4. 创建 CMakeLists.txt 文件5. 配置 build.gradle6. 编译和运行7.项目结构8.总结 在 Android 开发中&#xff0c;编写 JNI (Java Native Interface) 接口使得应用层能够调用 C 代码&#xff0c;涉及到几个步骤&a…

光流运动估计教程

文章目录 概要什么是光流?稀疏光流与密集光流实现稀疏光流1. 设置环境2.配置OpenCV读取视频并设置参数3. Grayscaling 3. 灰度化4. Shi-Tomasi 角点检测器 – 选择要跟踪的像素5. Lucas-Kanade:稀疏光流6. 可视化实现密集光流1. 设置环境2. 配置 OpenCV 读取视频3. 灰度4. Fa…

从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)

0 写在前面 官网地址&#xff1a;Baidu Comate Step1 打开文心快码&#xff08;Baidu Comate&#xff09;官网&#xff0c;点击「免费使用」/「下载安装」 Step2 可以根据官网步骤快速唤起VS Code&#xff1b; 也可以直接在VS Code、Visual Studio扩展管理搜索“文心快码”/…

Xshell 连接服务器

Xshell 连接服务器 安装 Xshell7 天免费试用永久免费试用 连接服务器 安装 Xshell 双击运行安装程序 点击 下一步 同意用户协议&#xff0c; 点击下一步 选择安装位置&#xff0c; 点击下一步 设置程序文件夹名&#xff0c; 点击安装 等待软件安装完毕 ## 软件激活 7 天免费试…

怎样在线免费音频转文字?放心交给这4款音频转文字能手

从会议记录到个人笔记&#xff0c;从播客到讲座录音&#xff0c;大家是否有考虑过如何将这些宝贵的音频信息快速转化为文字&#xff0c;以便更好地保存、分享和分析呢&#xff1f;其实我这倒是有一个不错的解决方案&#xff0c;那便是利用音频转文字软件免费来进行转换~ 想知道…

安全课堂开课了,不容小觑的暗水印来啦!数据防泄密管理新趋势——添加暗水印!

数据泄露的风险日益加剧&#xff0c;为了有效保护企业的敏感信息&#xff0c;防止数据被非法复制、传播或泄露&#xff0c;一种名为“暗水印”的技术逐渐走进了企业的视野&#xff0c;并成为了数据防泄密管理的新趋势。 今天&#xff0c;我们就来深入探讨一下这一不容忽视的技…

BurpSuite

如果只能用一个Web渗透工具&#xff0c;我选BurpSuite。 Web应用程序&#xff08;Web Application&#xff09; 不同于传统的静态网站所有程序的特点是接收、处理用户输入并返回结果服务器端是个程序&#xff0c;需要程序代码实现业务功能&#xff08;java、php、asp.nse&…

智慧社区新视界:EasyCVR视频汇聚平台下的数字化治理实践

在当今科技飞速发展的时代&#xff0c;“数字城市智慧社区”这个概念正逐渐走进我们的生活。那么&#xff0c;数字城市智慧社区到底是什么样子的呢&#xff1f; 随着城市化的不断推进&#xff0c;数字城市建设已成为提升城市管理效率、改善居民生活质量的重要手段。智慧社区作…

简单回归模型建立(下)

目录 数据准备 特征选择 目标变量 模型选择 示例代码 ​编辑分析结果 上部分对数据进行了分析以及可视化 选择不同的目标变量&#xff0c;例如“Cost of Living Index”作为我们要预测的目标。然后&#xff0c;我们可以使用其他相关的指标作为特征来训练模型。例如&…

邮件系统安全管家:CACTER SMC2的全面升级

根据Coremail邮件安全人工智能实验室监测&#xff0c;2024年Q2全国企业级用户遭受超过21.4亿次暴力破解&#xff0c;相比于Q1的39.1亿次暴力破解&#xff0c;环比降幅约为45%&#xff0c;无差别的暴力破解攻击大幅下降&#xff0c;但数据显示暴力破解攻击成功次数正在回升。 20…

搭配Intel第13代酷睿处理器

高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…

Web前端开发【新手入门指南】

Web前端开发入行门槛低、薪资高&#xff0c;是互联网行业的紧俏岗位之一。 目前Web前端开发人员年薪基本都在10万以上&#xff0c;一线城市的薪资会更高&#xff0c;这也吸引了很多人进入Web前端行业。对于完全不了解行业的人来说&#xff0c;他们对Web前端知之甚少。下面小菌…

怎么去掉U盘的写保护

要去除U盘的写保护&#xff0c;可以尝试以下几种方法&#xff1a; 检查U盘的物理写保护开关&#xff1a;部分U盘具有物理写保护开关&#xff0c;如果开关被切换到写保护状态&#xff0c;U盘就会被写保护。找到并关闭这个开关即可使用DiskPart命令&#xff1a;通过命令提示符工…

【C++11】右值引用的深度解析(什么是右值引用?它有什么作用?能应用在那些场景?)

目录 一、前言 二 、什么是左值什么是右值&#xff1f; &#x1f525;左值&#x1f525; &#x1f525;右值 &#x1f525; 三、什么是右值引用&#xff1f; &#x1f4a7;左右引用的“引出”&#x1f4a7; &#x1f4a7;左值引用 &#x1f4a7; &#x1f4a7;右值引用…

C# 不一样的洗牌算法---Simd指令

洗牌算法&#xff0c;以随机打乱数组中元素的位置 测试数据创建 int[] _data; Random rng new Random(); protected override void CreateData() {_data new int[_size];for (int i 0; i < _data.Length; i){_data[i] i;} } 普通打乱数组元素位置 protected overrid…

VBA学习(27):在筛选数据中复制可见单元格

在筛选数据中复制数据时&#xff0c;可以按原结构粘贴所复制的数据。具体如下文&#xff1a; 下图所示为示例数据。 我们对列C进行筛选&#xff0c;如下图所示 复制单元格区域B2:B10&#xff0c;然后粘贴到以单元格E2开始的区域&#xff0c;结果如下图所示。正如所见&#xff…

LLM之RLHF:Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习)

LLM之RLHF&#xff1a;Karpathy视角来对比RLHF技术和RL技术—RLHF is just barely RL(RLHF只是勉强算作强化学习) 导读&#xff1a;2024年8月8日&#xff0c;Karpathy发表了一个有意思的观点&#xff0c;RLHF is just barely RL. 强化学习从人类反馈(RLHF)训练方法只是勉强属于…

怎么将音乐转为mp3格式?7种简单的手机音频转换方法!

怎么将音乐转为mp3格式&#xff1f; mp3是一种运用比较广泛的格式&#xff0c;几乎所有的音频设备、播放器和操作系统都可以播放MP3音乐。如果你的音频文件不是mp3格式&#xff0c;那么可以通过专业的mp3格式转换器进行转换。这样就不会出现格式不兼容&#xff0c;无法正常使用…

第四范式发布AI+5G视频营销产品 助力精准获客与高效转化

产品上新 Product Release 今天&#xff0c;第四范式AI5G视频电话互动营销产品全新发布。 相较于以往销效率低、互动差、转化差的传统电话外呼和短信营销方式&#xff0c;视频电话互动营销基于AI、5G等技术&#xff0c;可让用户接听电话时观看个性化视频广告并实时互动&#xf…