edge-tts 语音合成 WebSocket 403 报错,怎么快速定位和修复?
【免费下载链接】edge-ttsUse Microsoft Edge's online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key项目地址: https://gitcode.com/GitHub_Trending/ed/edge-tts
做 edge-tts 语音合成时,程序突然抛出:
aiohttp.client_exceptions.WSServerHandshakeError: 403, message='Invalid response status'
看到这个 403,先别急着改你的代码。请求没有通过 WebSocket 403 握手,是微软服务端策略调整所致,而且可以修复。
📌 30秒快速结论
- 先确认你装的版本:
pip show edge-tts - 升级到最新 release:
pip install --upgrade edge-tts - 升级后依旧 403 → 给
Communicate加 proxy 参数重试(地区/IP 受限场景)
🔎 复现与确认:是不是真 403
最小复现,三行同步代码:
import edge_tts communicate = edge_tts.Communicate("你好,这是一次测试。", "zh-CN-XiaoxiaoNeural") communicate.save_sync("test.mp3")命令行等价写法:edge-tts --text "你好" --write-media test.mp3
跑一遍,报错通常几秒内出现。对照下面两个特征,同时命中即可确认:
- 异常类型是
WSServerHandshakeError,状态码恰好是 403。没有音频输出,也不是超时或 DNS 失败——服务器直接拒绝了握手。 edge-tts --list-voices能正常列出声音(音色列表走 HTTPS),只有合成请求 403。这说明问题出在 WebSocket 握手环节,而不是网络不通。
🧩 根因拆解:两个最可能的嫌疑
403 的含义是"服务器理解了请求,但拒绝执行",所以可以先排除纯连通性问题。为什么服务器会拒绝?两个嫌疑:
嫌疑一:握手参数与身份验证逻辑变更。握手 URL 里携带 TrustedClientToken 和Sec-MS-GECDRM 等参数,这是库里写死的静态凭证,服务端校验逻辑一变,旧版本的握手就会被直接拒掉。握手 URL 与请求头怎么拼装,都集中在 src/edge_tts/constants.py,这也是 edge-tts 403 修复的主要关注点。
嫌疑二:IP 与地区访问限制。部分地区的 IP 或数据中心 IP 被服务端限流,即使版本最新,握手同样被拒,这类场景只能靠代理绕行。
结论:先升级。能解决就是嫌疑一;还 403,多半是嫌疑二,换代理。
⚖️ 方案对比:代理 vs 升级
两种方案不互斥,按你的场景选:
| 维度 | 代理绕过 | 升级到最新 release |
|---|---|---|
| 适用场景 | 疑似 IP/地区受限,急需恢复出音频 | 旧版本握手参数过期 |
| 代价 | 需要一个可用代理(示例端口 7890),请求路径改变 | 一条 pip 命令,半分钟 |
| 风险 | 引入代理依赖,代理失效服务跟着失效 | 版本跨度大时可能夹带其他行为变化 |
给 Communicate 传入 proxy 参数即可:
communicate = edge_tts.Communicate( "你好,这是一次测试。", "zh-CN-XiaoxiaoNeural", proxy="http://127.0.0.1:7890", )命令行更省事:edge-tts --proxy "http://127.0.0.1:7890" --text "你好" --write-media test.mp3
走升级路线的话,执行:
pip install --upgrade edge-ttsWebSocket 连接逻辑在 src/edge_tts/communicate.py 中实现,较新版本已把握手参数和请求头对齐了服务端的新要求。
✅ 验证修复:确认 403 消失
重跑最小复现:
edge-tts --text "你好,这是一次测试。" --write-media test.mp3
预期输出:终端不再抛异常,当前目录生成test.mp3且可以正常播放。若仍抛WSServerHandshakeError,先用pip show edge-tts核对已安装版本,再叠加 proxy 参数验证地区受限这一嫌疑。
🛡️ 防坑备忘
- 锁定版本。生产环境在 requirements 里固定一个验证过可用的版本,上游服务接口一变不会突然炸。
- 跟踪 Release Notes。edge-tts 依赖的是微软非公开接口,403 再次出现时先看最新 release 的说明,升级通常就够。
- 代码兜底。关键路径上捕获网络层异常,WSServerHandshakeError 解决的最后一道保险在这里:
import aiohttp import edge_tts try: edge_tts.Communicate("你好,这是一次测试。", "zh-CN-XiaoxiaoNeural").save_sync("test.mp3") except aiohttp.ClientError as e: print(f"网络异常:{e},转入离线备用方案")🧭 接下来要做的事
升级到最新 release,重跑一遍最小复现,确认 403 不再出现;仍复现就加上 proxy 参数再试一次。
【免费下载链接】edge-ttsUse Microsoft Edge's online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key项目地址: https://gitcode.com/GitHub_Trending/ed/edge-tts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考