1. 编写 wrapper 脚本 (等于是给edgetts写了一个入口文件)
在当前目录下创建 tts_wrapper.py
import argparse
import asyncio
import sys
import edge_tts
# 默认音色
DEFAULT_VOICE = "zh-CN-XiaoxiaoNeural"
async def main():
parser = argparse.ArgumentParser(description="Edge-TTS Core Wrapper")
# --- 核心参数 ---
parser.add_argument("--text", required=True, help="输入文本")
# 【重点修改】required=False,允许不传此参数
parser.add_argument("--write-media", dest="output", required=False, help="音频输出路径")
parser.add_argument("--write-subtitles", dest="subtitles", help="SRT字幕路径")
# --- 调整参数 ---
parser.add_argument("--voice", default=DEFAULT_VOICE, help="语音角色")
parser.add_argument("--rate", default="+0%", help="语速")
parser.add_argument("--volume", default="+0%", help="音量")
parser.add_argument("--pitch", default="+0Hz", help="音调")
parser.add_argument("--proxy", help="代理地址")
args = parser.parse_args()
try:
communicate = edge_tts.Communicate(
text=args.text,
voice=args.voice,
rate=args.rate,
volume=args.volume,
pitch=args.pitch,
proxy=args.proxy
)
submaker = edge_tts.SubMaker()
# --- 核心逻辑分支:判断用户是否需要保存音频 ---
if args.output:
# 分支 A: 用户指定了音频文件,一边写文件一边收集字幕数据
with open(args.output, "wb") as file:
async for chunk in communicate.stream():
if chunk["type"] == "audio":
file.write(chunk["data"])
elif chunk["type"] == "WordBoundary" or chunk["type"] == "SentenceBoundary":
submaker.feed(chunk)
else:
# 分支 B: 用户没指定音频文件,只空跑流来收集字幕数据
# (如果不跑流,submaker 就拿不到数据,字幕就是空的)
# print("Warning: No audio output specified, processing subtitles only.", file=sys.stderr)
async for chunk in communicate.stream():
if chunk["type"] == "WordBoundary" or chunk["type"] == "SentenceBoundary":
submaker.feed(chunk)
# 这里我们直接忽略 audio 类型的 chunk,不写入磁盘
# --- 生成字幕 ---
if args.subtitles:
with open(args.subtitles, "w", encoding="utf-8") as file:
# 适配 7.x 版本的 get_srt()
file.write(submaker.get_srt())
except Exception as e:
sys.stderr.write(f"Critical Error: {str(e)}\n")
sys.exit(1)
if __name__ == "__main__":
asyncio.run(main())
2. 在当前目录下创建并激活虚拟环境 (最重要的步骤)
# 创建虚拟环境
python3 -m venv venv
# 激活环境 (注意:运行后你的终端前缀应该变了)
source venv/bin/activate
(此时你的终端提示符前面应该会显示 (venv),这表示你进入了独立房间。)
3. 在“房间”里安装 库 和 打包工具
不管外面系统装没装,这里面是空的,要重新装。这样 pyinstaller 和 edge-tts 就在同一个房间里了。
# 同时安装,确保版本匹配
pip install edge-tts pyinstaller
5. 执行打包(不支交叉编译)
因为是在 (venv) 里,PyInstaller 肯定能找到 edge-tts。 code Bashdownloadcontent_copyexpand_less
pyinstaller --clean --onefile --name edge-tts-core tts_wrapper.py
6. 验证
./dist/edge-tts-core \
–text “你好,这是云希的声音,语速加快,音量加大” \
–write-media test_full.mp3 \
–voice zh-CN-YunxiNeural \
–rate=+20% \
–volume=+10% \
–write-subtitles my.srt
结束,此时就把edgetts打包成一个可执行文件了。