从零打造文本转语音工具:基于 edge-tts 的轻量实现方案

5 阅读7分钟

日常工作生活中,我们经常有文本转语音的需求(比如生成音频播报、语音提示等),市面上的在线工具要么有字数限制,要么需要付费,而微软的 edge-tts 是一款免费且音质优秀的文本转语音工具,本文就带大家基于 edge-tts 从零封装一个轻量、易用的本地 TTS 工具,支持交互式输入、批量生成、一键清理等功能,全程无广告、无付费限制。

一、工具核心特性

  1. 🎙️ 基于微软 edge-tts 引擎,音质清晰(默认使用 zh-CN-YunyangNeural 音色);
  2. 📁 自动将生成的 MP3 文件保存到 mp3 文件夹,按时间戳命名(避免重名);
  3. 🖱️ 提供 Windows 批处理脚本,无需手动敲命令,双击即可运行;
  4. 🧹 支持一键清理生成的 MP3 文件,避免文件夹冗余;
  5. 💻 兼容 Windows 系统,Python 环境轻量化部署。

二、环境准备

1. 安装 Python

确保本地安装了 Python(3.8+ 版本),可从 Python 官网 下载,安装时勾选「Add Python to PATH」。

2. 创建虚拟环境(可选但推荐)

虚拟环境可避免依赖冲突,在工具目录下执行:

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境(Windows)
venv\Scripts\activate.bat

3. 安装 edge-tts 依赖

激活虚拟环境后,执行以下命令安装核心依赖:

pip install edge-tts

三、核心代码实现

1. Python 核心脚本(tts_generator.py)

封装 edge-tts 调用逻辑,支持命令行传参和交互式输入,自动创建文件夹、生成时间戳文件名:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
edge-tts 文本转语音 Python 封装脚本
功能:
1. 输入文本生成语音
2. 固定语音:zh-CN-YunyangNeural
3. 输出文件:mp3/当前时间戳.mp3(格式:YYYYMMDDHHMMSS.mp3)
"""

import os
import sys
import subprocess
from datetime import datetime
import argparse

def check_edge_tts():
    """检查 edge-tts 是否已安装"""
    try:
        subprocess.run(
            ["edge-tts", "--version"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            check=True
        )
        return True
    except (subprocess.CalledProcessError, FileNotFoundError):
        return False

def generate_tts(text):
    """
    生成语音文件(保存到 mp3 文件夹)
    :param text: 待生成的文本
    :return: 生成的文件名/错误信息
    """
    # 1. 验证文本非空
    if not text or text.strip() == "":
        return None, "错误:输入的文本不能为空!"
    
    # 2. 创建 mp3 文件夹(不存在则自动创建)
    output_dir = "./mp3"  # 目标保存文件夹
    os.makedirs(output_dir, exist_ok=True)  # exist_ok=True 避免文件夹已存在时报错
    
    # 3. 生成当前时间戳文件名 + 拼接文件夹路径
    current_time = datetime.now().strftime("%Y%m%d%H%M%S")
    output_file = os.path.join(output_dir, f"{current_time}.mp3")  # 拼接为 mp3/20260224153020.mp3
    
    # 4. 构建 edge-tts 命令
    cmd = [
        "edge-tts",
        "--text", text,
        "--voice", "zh-CN-YunyangNeural",
        "--write-media", output_file
    ]
    
    try:
        # 5. 执行命令并捕获输出
        result = subprocess.run(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            encoding="utf-8"
        )
        
        # 6. 检查执行结果
        if result.returncode == 0:
            # 验证文件是否生成
            if os.path.exists(output_file):
                return output_file, f"成功:语音文件已生成 → {output_file}"
            else:
                return None, "错误:命令执行成功,但未生成语音文件!"
        else:
            return None, f"错误:生成失败 → {result.stderr}"
    
    except Exception as e:
        return None, f"异常:{str(e)}"

def main():
    # 1. 检查 edge-tts 依赖
    if not check_edge_tts():
        print("错误:未安装 edge-tts,请先执行安装命令:")
        print("pip install edge-tts")
        sys.exit(1)
    
    # 2. 解析命令行参数
    parser = argparse.ArgumentParser(description="edge-tts 文本转语音工具(保存到 mp3 文件夹)")
    parser.add_argument(
        "--text", 
        type=str, 
        required=False,
        help="待生成语音的文本(若不传入,将进入交互式输入)"
    )
    args = parser.parse_args()
    
    # 3. 获取输入文本(命令行参数 → 交互式输入)
    if args.text:
        text = args.text
    else:
        print("=== 文本转语音工具(保存到 mp3 文件夹) ===")
        text = input("请输入待生成的文本:").strip()
    
    # 4. 生成语音
    output_file, msg = generate_tts(text)
    print(msg)
    
    # 5. 成功生成后提示文件绝对路径
    if output_file:
        abs_path = os.path.abspath(output_file)
        print(f"文件绝对路径:{abs_path}")

if __name__ == "__main__":
    main()

2. 一键运行脚本(run_tts.bat)

Windows 下双击即可运行,自动激活虚拟环境、检查依赖、运行 Python 脚本,生成后自动打开 MP3 文件夹:

@echo off
chcp 65001 > nul 2>&1
title TTS Generator - Running

:: ===================== Configuration (Modify as needed) =====================
set "VENV_PATH=venv"
set "PYTHON_SCRIPT=tts_generator.py"
set "MP3_FOLDER=mp3"  :: MP3文件保存的文件夹名
:: ============================================================================

:: Check if virtual environment exists
if not exist "%VENV_PATH%\Scripts\activate.bat" (
    echo [ERROR] Virtual environment not found! Path: %VENV_PATH%\Scripts\activate.bat
    echo Please create venv first: python -m venv %VENV_PATH%
    pause
    exit /b 1
)

:: Check if Python script exists
if not exist "%PYTHON_SCRIPT%" (
    echo [ERROR] Python script not found: %PYTHON_SCRIPT%
    echo Make sure the script is in current directory
    pause
    exit /b 1
)

:: Activate virtual environment and run script
echo [INFO] Activating virtual environment...
call "%VENV_PATH%\Scripts\activate.bat"

if %errorlevel% equ 0 (
    echo [INFO] Virtual environment activated successfully!
    echo [INFO] Running script: %PYTHON_SCRIPT%
    echo ===================== Script Output Start =====================
    python %PYTHON_SCRIPT%
    echo ===================== Script Output End =====================
) else (
    echo [ERROR] Failed to activate virtual environment!
    pause
    exit /b 1
)

:: 新增:自动打开 mp3 文件夹
echo [INFO] Trying to open MP3 folder...
if exist "%MP3_FOLDER%" (
    start "" "%MP3_FOLDER%"  :: 打开文件夹("" 避免路径含空格时出错)
    echo [INFO] MP3 folder opened successfully!
) else (
    echo [WARNING] MP3 folder not found: %MP3_FOLDER%
    echo Maybe no audio file was generated.
)

:: Keep window open after execution
echo [INFO] Script execution completed!
pause

3. 一键清理脚本(clear_mp3.bat)

快速清空 MP3 文件夹内的所有文件,避免文件堆积:

@echo off
set "MP3_FOLDER=mp3"
if exist "%MP3_FOLDER%" (
    del /f /s /q "%MP3_FOLDER%*.*" > nul
    @REM rmdir /s /q "%MP3_FOLDER%*" > nul
    echo [INFO] MP3 folder cleaned!
) else (
    echo [INFO] MP3 folder not found.
)

四、使用教程

1. 目录结构

将上述三个文件放在同一目录下,最终结构如下:

TTS-Tool/
├── venv/                # 虚拟环境(创建后生成)
├── mp3/                 # 生成的MP3文件(运行后自动创建)
├── tts_generator.py     # Python核心脚本
├── run_tts.bat          # 一键运行脚本
└── clear_mp3.bat        # 一键清理脚本

2. 首次运行

  1. 双击 run_tts.bat,若提示虚拟环境不存在,按提示执行 python -m venv venv 创建;
  2. 激活虚拟环境后,脚本会自动检查 edge-tts,若未安装,手动执行 pip install edge-tts
  3. 重新双击 run_tts.bat,按提示输入文本,回车即可生成 MP3 文件;
  4. 生成完成后,脚本会自动打开 mp3 文件夹,可直接查看/播放文件。

3. 进阶使用(命令行传参)

若想批量生成或通过脚本调用,可直接传文本参数:

# 激活虚拟环境后执行
python tts_generator.py --text "你好,这是测试文本"

五、自定义扩展

1. 更换音色

修改 tts_generator.py--voice 参数即可,edge-tts 支持的中文音色有:

  • zh-CN-YunyangNeural(默认,男)
  • zh-CN-XiaoyiNeural(女)
  • zh-CN-XiaochenNeural(女)
  • zh-CN-XiaohanNeural(女)
  • zh-CN-XiaomengNeural(女)
  • zh-CN-XiaomoNeural(男)

查看所有支持的音色:

edge-tts --list-voices

2. 调整音频格式

edge-tts 支持输出 wav/mp3 等格式,修改 generate_tts 函数中的 output_file 后缀即可,核心命令无需改动。

3. 批量生成

可扩展 Python 脚本,读取 txt 文件中的多行文本,循环调用 generate_tts 实现批量生成:

# 新增批量生成函数
def batch_generate_tts(txt_file):
    if not os.path.exists(txt_file):
        return "错误:批量文件不存在!"
    with open(txt_file, "r", encoding="utf-8") as f:
        lines = [line.strip() for line in f if line.strip()]
    for idx, line in enumerate(lines):
        output_file, msg = generate_tts(line)
        print(f"[{idx+1}/{len(lines)}] {msg}")
    return f"批量生成完成,共处理 {len(lines)} 条文本"

六、常见问题解决

1. 中文乱码

脚本中已通过 chcp 65001 设置编码,若仍乱码,确保:

  • Python 脚本编码为 UTF-8;
  • 批处理脚本保存为 ANSI 格式(Windows 记事本默认)。

2. 虚拟环境激活失败

检查 Python 安装路径是否加入系统环境变量,或直接使用绝对路径调用 Python:

:: 替换 run_tts.bat 中的 Python 调用
set "PYTHON_PATH=C:\Python310\python.exe"
%PYTHON_PATH% %PYTHON_SCRIPT%

3. 生成的 MP3 无法播放

检查 edge-tts 版本,更新到最新版:

pip install --upgrade edge-tts

七、总结

本工具基于 edge-tts 实现了轻量化、本地化的文本转语音方案,无需依赖复杂的 API 接口,无需付费,适合个人日常使用、小型项目集成等场景。代码结构清晰,易于扩展,可根据自身需求调整音色、格式、批量逻辑等。

如果觉得有用,欢迎点赞收藏,也可以留言分享你的扩展思路~