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

项目介绍

该项目源自以前了解的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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值