fix(#1196): 智能剪辑TTS面板改用统一/voices接口,支持克隆音色选择 #1199
Reference in New Issue
Block a user
Delete Branch "fix/tts-panel-voices-api"
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?
问题
智能剪辑配音面板选不到克隆音色,只能看到预设音色
修改内容
fetchVoices({ status: "ready" })统一音色接口替代旧的getTtsVoices(),自动过滤出预设音色和克隆音色影响范围
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
useEffect的fetchVoices请求链中,调用了setVoicesLoading(true)开始加载,但在.then()和.catch()之后缺少setVoicesLoading(false)或.finally()块来重置加载状态。这意味着无论请求成功还是失败,voicesLoading都将永远保持为true,导致 UI 界面一直显示“加载中...”,无法展示音色列表或错误状态。.finally(() => { if (active) setVoicesLoading(false) })。💡 改进建议(不阻塞合并)
[apps/web/src/pages/editing-planner/components/TtsPanel/components/VoiceSelector.tsx: 28] Tab 初始状态优化
activeTab初始化固定为"preset"。如果用户当前选中的是“克隆”音色,打开面板时会默认停留在“预设音色” Tab,导致用户看不到自己已选中的音色(因为克隆音色在另一个 Tab)。建议根据selectedVoiceId判断其属于哪个列表,从而智能初始化activeTab。[apps/web/src/pages/editing-planner/components/TtsPanel/hooks/useTtsPanel.ts: 38] 魔法数字提取
fetchVoices({ status: "ready", limit: 100 })中的limit: 100是魔法数字。建议将其提取为常量(如VOICE_FETCH_LIMIT),以便于统一管理和维护。✅ 良好实践
useRef(configRef,onChangeRef) 保存最新状态,有效避免了useEffect和异步回调中的闭包陷阱。handlePlayVoiceSample中通过audioRef.current === audio判断,有效处理了快速切换播放时的竞态条件,防止了状态错乱。VoiceSelector组件中试听按钮使用了e.stopPropagation(),防止触发父容器的选中事件,交互逻辑严谨。onended事件和组件卸载时的清理(mountedRef),避免了内存泄漏和组件卸载后的状态更新。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-07-30 07:51:59 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1199 已关闭或合并,对应的预览环境已被清理。