# 09 TTS:分段、流控制、重试与MP3发布 听文视频工作台 · 技术架构与实现 · 1.0.2 图示:正文分段 → 受控流 → 验证 → 合并 正文分段 → 受控流 → 验证 → 合并 否 是 失败 split_text最多2000字符 按空行合并/长段硬切 当前part已存在? 同任务固定文案与音色 联网流写partial 30s idle/120s本次总等待 复用完成part 不重新请求同段 非空+FFprobe通过 rename最终part,累计段进度 异常则有限重试 最多2次 · 1.5s/3s 按序字节拼接MP3 检查暂停取消 · pending输出 探测后发布audio.mp3 ready+实际duration 图9|受控语音流与片段复用。语音片段串行,网络流失败最多重试两次;完成片段发布后可供任务重试复用。小屏可横向滚动查看图示 ## 语音请求链路 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源码快照。 --- 招商合作微信:wzqy2019。添加备注:听文合作。 原网页:https://tingwen-creator-studio-102.pages.dev/guide/technical-09