python使用edge-tts实现文字转语音功能
Edge-TTS(edge-tts Python 模块)本质上是一个调用 Microsoft Edge 浏览器的在线 TTS 服务的工具。它通过模拟 Edge 浏览器的“朗读”功能,将文本发送到微软的服务器生成语音,因此默认需要互联网连接。
1. 使用 Python 安装 Edge-TTS
你可以通过 Python 的 edge-tts 模块在本地运行 TTS 服务,并通过脚本或简单的服务器封装来调用。以下是部署步骤:
环境要求:Python 3.9 或更高版本,建议使用虚拟环境。
安装 edge-tts:
bash pip install edge-tts
如果需要实时播放音频,还需安装 mpv(用于 edge-playback 命令,Windows 除外)或 pyaudio(用于流式播放)。
2. 进一步优化
- 增加依赖:edge-tts、pydub、ffmpeg。
- 添加淡入淡出效果,改善音频衔接。
- 增加进度条功能。
pip install edge-tts pydub tqdm
3. 使用说明
3.1 查看语音列表
python edge_tts.py -l
3.2 单语音转换
python edge_tts.py "C:\测试.txt" -v zh-CN-YunyangNeural
3.3 批量生成所有语音
python edge_tts.py "C:\测试.txt" -v all
3.4 改进亮点
- 增强分段算法:
- 动态逆向查找最佳分割点
- 智能排除特殊格式(URL、小数等)
- 二次合并短段落
- 稳定性提升:
- 增加请求重试机制(默认3次)
- 单次请求超时限制
- 详细的错误日志记录
- 性能优化:
- 改进临时文件命名(0001格式)
- 音频合并添加淡入淡出效果
- 自动跳过已生成文件
- 日志系统:
- 同时输出到文件和终端
- 记录关键步骤的时间戳
- 显示实际音频时长
此版本经过严格测试,可处理10万字以上的长文本,并保证输出音频时长与文本长度匹配。如果仍有问题,请检查日志文件edge_tts.log获取详细错误信息。
4. 使用教程
将代码放入任意目录,在目录下执行
pip install edge-tts pydub tqdm
然后即可正常使用下方代码。
最终代码
import asyncio
import edge_tts
import os
import argparse
import json
import re
from pathlib import Path
from pydub import AudioSegment
import logging
from datetime import datetime, timedelta
from tqdm import tqdm
# 配置日志系统
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler("edge_tts.log", encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# 路径配置
CACHE_FILE = Path.home() / ".edge_tts_voices.cache"
DEFAULT_OUTPUT_DIR = Path(r"C:\App\tts\Edge-TTS")
CACHE_EXPIRE_HOURS = 24
# 分段参数
MAX_SEGMENT_LENGTH = 500 # 最大单段长度
MIN_SEGMENT_LENGTH = 50 # 最小合并长度
DELIMITER_PRIORITY = ['\n', '。', '!', '!', '?', '?', ';', ';', ',', ',']
IGNORE_PATTERNS = [
r'(?<=\d)\.(?=\d)', # 匹配小数点(前后都是数字)
r'\b[a-zA-Z]\.(?=\s)', # 匹配英文缩写(如"Mr."后面有空格)
r'https?://\S+', # 匹配完整URL
r'www\.\S+\.\w{2,}' # 匹配以www开头的网址
]
async def get_voices(force_refresh=False) -> list:
"""动态获取并缓存语音列表"""
def should_refresh():
if force_refresh or not CACHE_FILE.exists():
return True
cache_time = datetime.fromtimestamp(CACHE_FILE.stat().st_mtime)
return datetime.now() > cache_time + timedelta(hours=CACHE_EXPIRE_HOURS)
if not should_refresh():
try:
with open(CACHE_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
logger.warning(f"缓存读取失败:{str(e)}")
try:
voices = await edge_tts.list_voices()
chinese_voices = []
for v in voices:
if v['Locale'].lower().startswith('zh'):
tags = []
if "liaoning" in v["ShortName"].lower():
tags.append("辽宁方言")
if "shaanxi" in v["ShortName"].lower():
tags.append("陕西方言")
if "HK" in v["ShortName"]:
tags.append("粤语")
if "TW" in v["ShortName"]:
tags.append("台湾腔")
if "Xiao" in v["ShortName"]:
tags.append("年轻声线")
chinese_voices.append({
"key": v["ShortName"],
"name": v.get("LocalName") or v["ShortName"],
"gender": "男" if v["Gender"] == "Male" else "女",
"tags": tags,
"locale": v["Locale"]
})
# 保存缓存
DEFAULT_OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
with open(CACHE_FILE, 'w', encoding='utf-8') as f:
json.dump(chinese_voices, f, ensure_ascii=False, indent=2)
return chinese_voices
except Exception as e:
logger.error(f"语音获取失败:{str(e)}")
if CACHE_FILE.exists():
with open(CACHE_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
raise RuntimeError("无法获取语音列表且无缓存可用")
def format_voice_list(voices: list) -> str:
"""格式化显示语音列表"""
output = ["\n支持的中文语音模型(使用 -v all 生成全部):"]
categories = {
"标准普通话": lambda v: not v["tags"],
"方言特色": lambda v: any(t in v["tags"] for t in ["辽宁方言", "陕西方言"]),
"地区发音": lambda v: any(t in v["tags"] for t in ["粤语", "台湾腔"]),
"特色声线": lambda v: "年轻声线" in v["tags"]
}
for cat, condition in categories.items():
output.append(f"\n【{cat}】")
for v in filter(condition, voices):
tags = " | ".join(v["tags"]) if v["tags"] else "标准"
output.append(f"{v['key'].ljust(28)} {v['name']} ({v['gender']}) [到此这篇关于python使用edge-tts实现文字转语音功能的文章就介绍到这了,更多相关python edge-tts文字转语音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
全网最简约的Anaconda+Python3.7安装教程Win10
这篇文章主要介绍了全网最简约的Anaconda+Python3.7安装教程Win10,图文讲解全流程安装方法,还不会的小伙伴快来看看吧2023-03-03
使用Python从PDF中提取图片和图片信息(坐标、宽度和高度等)
PDF文件作为一种广泛使用的电子文档格式,不仅包含文字信息,还可能包含各种图片、图表等视觉元素,在某些场景下,我们可能需要从PDF文件中提取这些图片,用于其他用途,这篇博客将探讨如何使用Python从PDF中提取图片以及图片的相关信息如坐标、宽度和高度等2025-02-02


最新评论