feat(voices): TTS时长修复 + 提取视频配音 + AI配音标识 #1656
Reference in New Issue
Block a user
Delete Branch "fix/tts-duration-and-video-extract"
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?
修复内容
1. TTS 素材时长显示修复(后端)
apps/api/app/api/routes/tts.pysave_tts_job_to_library中duration=job.duration or None,当job.duration=0.0时(CosyVoice 同步接口不返回 duration),0.0 or None→None,导致素材 duration 字段缺失,前端显示--:--duration=audio_duration or job.duration or None2. 提取视频配音按钮(前端)
extractVideoVoice()→POST /tts/extract-video-voice(后端接口待实现)3. AI 配音标识(前端)
asset.metadata.source === "tts_job"【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
finally块,将临时文件清理逻辑移到了try-except块之后的普通执行流中。如果在执行ffprobe提取时长之前的代码逻辑中抛出异常(或者在ffprobe之前的逻辑中发生错误),程序将直接跳过清理代码,导致tmp_path临时文件无法被删除,长期运行可能导致服务器磁盘空间被占满。tmp_path.unlink()清理逻辑放回finally块中,或者确保在函数退出前(无论是否发生异常)都执行清理。建议恢复try...finally结构,将ffprobe逻辑包含在try中,清理放在finally中。💡 改进建议(不阻塞合并)
[apps/web/src/api/tts/jobs.ts: 78] 认证 Token 处理不完善
localStorage获取access_token并手动设置 Header。这种方式绕过了常规的apiClient拦截器,可能无法自动处理 Token 过期刷新逻辑(如果项目中配置了 Refresh Token 机制)。建议复用apiClient的上传能力(如果支持进度),或者确保在此处也实现了 Token 刷新逻辑。[apps/web/src/pages/voices/components/VideoExtractModal.tsx: 全局] 样式维护性问题
style={{...}}),这会导致样式难以复用、难以维护,并增加 JS bundle 体积。建议将样式提取到 CSS 文件或 CSS Modules 中。✅ 良好实践
subprocess.run并传递列表参数,有效避免了命令注入风险。VideoExtractModal组件在上传过程中禁用了关闭按钮和取消操作,防止了误操作导致的中断。ffprobe的调用增加了timeout和异常捕获,具备较好的容错性。🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 10:34:37 | 模型:
🚀 预览环境已部署
🗑️ 预览环境已清理
PR #1656 已关闭或合并,对应的预览环境已被清理。