fix(P0): 预置音色试听-实时TTS合成试听音频 #587
Reference in New Issue
Block a user
Delete Branch "fix/p0-preset-voice-preview"
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?
问题
配音库页面点击预置音色(如龙小夏、龙小淳)的试听按钮,没有任何声音。PRESET_VOICES中所有预置音色的preview_url都是空字符串。
方案
采用方案B:点击试听时实时调用TTS合成一句示例文本,返回音频URL。
相比方案A(配置固定demo音频)的优势:
实现
前端适配
前端点击试听按钮时调用新接口,拿到audio_url后播放即可。
LGTM
🚀 预览环境已部署
- 新增 GET /voices/presets/{voice_id}/preview 端点 - 支持自定义试听文本,默认使用预置音色名称的问候语 - 默认试听音频7天内存缓存,减少重复TTS调用 - 修复预置音色全没声音的问题 Issue: #578f1719533bato7493f6d2b8代码审查结果 - PR #587
⚠️ 问题(3个需要修改)
apps/api/app/api/routes/voices.py 第30行:内存泄漏风险
_preset_preview_cache只有写入逻辑,没有过期清理机制。虽然读取时会检查 TTL,但过期的 key-value 对永远不会从字典中删除。随着时间推移和不同音色的访问,内存占用会持续增长直至 OOM。cachetools.TTLCache或引入 Redis 等外部缓存服务,自动处理过期淘汰。apps/api/app/api/routes/voices.py 第228行:参数校验缺失导致 DoS 风险
text参数没有最大长度限制。恶意用户可以传入超长字符串(如几 MB 的文本),直接传递给 TTS 服务,可能导致上游服务崩溃、API 响应超时或服务器资源耗尽。Query中添加max_length限制(例如Query("", max_length=500, ...)),或在函数开始处显式校验文本长度。apps/api/app/api/routes/voices.py 第30行:多进程环境缓存失效
💡 建议(1个可选)
import time移至文件顶部,与其他 import 语句放在一起,避免在函数内部进行导入操作。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-19 14:54:57 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #587 已关闭或合并,对应的预览环境已被清理。