语音请求链路
speech.synthesize接收任务正文、固定voice、任务目录、Control及progress/validate回调。默认factory为edge_tts.Communicate,每段调用Communicate(segment,voice).stream()。应用处理流中type=audio的字节,不保存WordBoundary/SentenceBoundary作为字幕。
应用分段以2000个Python字符为上限,按空行拆段并去段落首尾;短段合并时计入两个换行,超长段落直接每2000字符硬切,未做语义句末对齐。每个片段按顺序处理,语音内部没有并发池;图片准备与整个音频步骤并行是另一层调度。
| 参数/机制 | 实际实现 | 含义 |
|---|---|---|
| 应用分段上限 | 2000字符 | 与UI累计试用10000字符不是同一个概念 |
| 单段尝试次数 | range(3) | 首次请求+最多2次自动重试 |
| 重试退避 | 1.5秒、3秒 | 在等待期间仍尊重暂停/取消 |
| 无流事件时限 | 30秒 | 每次流事件重置idle,含元数据事件 |
| 单次总流等待 | 120秒 | 暂停时间不累计;不是整个任务120秒 |
| 控制检查 | 约0.1秒的asyncio等待循环 | 网络等待期间也可观察取消 |
| 最终片段 | part-0000.mp3等 | 非空并probe成功后才rename |
| 临时片段 | part-0000.partial等 | 失败残片不成为成功分段 |
| 合并 | 按顺序直接连接MP3字节 | 没有重新编码、交叉淡化或自动补静音 |
已有part最终文件会跳过重请求,保证同一固定任务重试可复用完成段。合并逐块读取1MiB,检查Control,先写audio.pending.mp3,最终probe后replace成audio.mp3。最终ready状态保存audio_duration,后续图片时间轴使用这个实际媒体时长。
应用层与edge-tts库层
发布构建使用edge-tts7.2.3。库内部按字节限制切分SSML请求,并自动转义XML/生成voice与prosody;应用层2000字符段不保证只对应一条网络SSML。应用只传text与voice,不开放任意SSML、语速、音量或音调编辑。
构建库请求的音频格式为audio-24khz-48kbitrate-mono-mp3,上游WSS位于api.msedgeservices.com/tts/cognitiveservices。后续AAC192k/44.1k/stereo是容器制作参数,不能把源48kbit单声道语音升格为拥有更多原始信息的录音。多语言音色和语音质量最终取决于外部服务,源码无法证明其底层模型权重或全部语言行为。
本应用当前没有音频生成收费入口,不要求个人TTS API Key;edge-tts项目自身定位为使用Edge在线语音服务的Python接入。上游项目说明其联网方式;本文不据此承诺永久服务规则或访问权利。
媒体探测与进度
probe通过包内FFprobe,请求format duration及stream codec_type/width/height,30秒子进程时限;返回非零或duration≤0拒绝。它是有效媒体探测,不是每个采样/每帧完整解码扫描。音频百分比按completed/total段数计算,合并与验证没有确定百分比,网络消息包含等待秒数/接收KB。进度不承诺等比例剩余时间。
依据:speech.py:8–166、app.py:136–160及发布构建edge_tts源码快照。