feat(tts): 正式合成支持克隆音色 + 保存到配音库改写 assets 素材体系 + 克隆接口支持 asset_id #1556
Reference in New Issue
Block a user
Delete Branch "fix/tts-clone-voice-and-save-to-assets"
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?
配音库 3 个后端修复:
synthesize()复用 preview 的克隆音色解析——voice_id 传克隆 profile UUID 时校验归属(403)/克隆完成状态(400),job.voice_id 存解析后的 CosyVoice id,voice_clone_profile_id 记录 profile。uploads/voice/tts/,创建 audio/ready 的 asset 挂用户 voice 素材库(无则自动创建),metadata 记录 source=tts_job;返回结构保持 id/name/audio_url/duration 兼容;切断旧 voice_library 表写入。测试:tts/voice 专项 467 passed;新增 synthesize 克隆 4 用例、save-to-library asset 断言、clone from asset 5 用例。
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[apps/api/app/api/routes/tts.py: 447] 建议增加幂等性检查
save_tts_job_to_library函数中,如果同一个 TTS Job 被多次保存,会在assets表中创建多条记录,虽然它们指向同一个 OSS 文件(会被覆盖),但会产生冗余的数据库记录。建议在创建 Asset 前先查询是否已存在该tts_job_id对应的 Asset,若存在则直接返回,实现幂等性。[apps/api/app/api/routes/tts.py: 413] 确认 URL 下载的安全性
download_source = job.output_audio_key or job.output_audio_url,如果job.output_audio_url可被用户控制(非仅由后端 CosyVoice 服务写入),直接调用storage_service.download_asset可能存在 SSRF(服务端请求伪造)风险。请确认output_audio_url的来源完全可信,或在download_asset中增加对内网地址的限制。✅ 良好实践
_find_or_create_voice_library中正确使用了IntegrityError捕获和session.rollback()来处理并发创建素材库的竞态条件,保证了数据一致性。save_tts_job_to_library中,当数据库写入失败时,能够正确清理已上传的 OSS 文件,有效避免了垃圾文件的堆积。voice_clones.py中,通过asset.project_id关联查询project并校验can_access,实现了基于项目归属的细粒度权限控制,防止了越权访问素材。ROW_NUMBER()窗口函数并在子查询中包裹,符合 PostgreSQL 等数据库的语法规范,能够安全地清洗历史重复数据。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显问题
🤖 由 AI 代码审查机器人自动生成 | 2026-08-30 10:30:37 | 模型:
🗑️ 预览环境已清理
PR #1556 已关闭或合并,对应的预览环境已被清理。