feat: add POST /tts/preview endpoint for synchronous TTS preview #1496
Reference in New Issue
Block a user
Delete Branch "feat/tts-preview-endpoint"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
前端 GeneratePage 和 TtsPanel 调用 POST /tts/preview 获取配音预览音频,但后端没有这个路由,返回 404。
修复
TTSPreviewRequestschema:text(max 200字)、voice_id(必填)、speed、pitchTTSPreviewResponseschema:audio_url、durationPOST /tts/preview路由,调用CosyVoiceService.synthesize_speech()同步合成接口规格
验收标准
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[apps/api/app/api/routes/tts.py: 389-391] 参数传递不一致
TTSPreviewRequest中定义了pitch字段(音调),但在调用cosyvoice_service.synthesize_speech时仅传递了text,voice_id,speed,忽略了pitch。虽然 Schema 注释标明“预留”,但保留在请求中却不生效容易造成前端误解。建议:如果服务支持该参数,请补充传递;如果不支持,建议从 Request Schema 中移除,或在代码注释中显式说明该参数被忽略。[apps/api/app/api/routes/tts.py: 378] 同步阻塞调用潜在性能风险
preview_tts是一个同步函数(def),而synthesize_speech通常涉及网络 I/O 调用 TTS 服务。在高并发场景下,同步阻塞会耗尽线程池。建议:如果CosyVoiceService提供了异步接口(async def),建议将路由改为async def并使用await;如果服务仅支持同步,建议使用run_in_executor在后台线程池中运行以避免阻塞事件循环。[apps/api/app/api/routes/tts.py: 398] 错误信息可能泄露敏感信息
CosyVoiceError时,直接将异常信息f"TTS 合成失败: {e}"返回给客户端。如果上游异常堆栈中包含内部路径、第三方 API Key 或其他调试信息,这将导致信息泄露。建议:记录完整的异常日志到服务器端,仅向客户端返回友好的通用错误码或简化的错误描述。✅ 良好实践
duration时使用了result.duration if result.duration and result.duration > 0 else None,有效过滤了无效的时长数据(如 0 或负数)。text长度(200字限制)、voice_id和speed范围进行了严格约束,防止了恶意或非法输入。🤖 由 AI 代码审查机器人自动生成 | 2026-08-25 07:10:04 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1496 已关闭或合并,对应的预览环境已被清理。