fix(viral-video): 预设音色ID与后端对齐(longxiaochun_v3等v3后缀)+ 取消模糊匹配兜底 #2130
Reference in New Issue
Block a user
Delete Branch "fix/2041-preset-voice-ids"
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. 前端硬编码旧ID位置
只在
PresetVoicePickerModal.tsx的 MOCK_VOICES 兜底列表里发现旧ID硬编码:long-xiaochun(错误带短横线、无v3后缀)long-xiaoxia/long-xiaoyan/long-xiaotong/long-sanshu/long-xiaogang/long-xiaocheng/long-xiaozhi/long-yue/long-xiaodong/long-xiaoling/long-xiaoxiao-neural(12个,多数是虚构ID,与后端真实音色列表不对应)zh-CN-XiaoxiaoNeural之前的 Azure TTS 兜底 ID 已在上一轮修复中清理。ViralVideoPage.tsx本身没有硬编码任何 preset voice_id;所有 preset 音色通过 onConfirm 回调以 Modal 返回对象的 id 为准透传。2. 默认音色兜底
emptyTask.refAudio = null,用户不主动选音色的话voice_id不会传给后端,由后端走默认(后端默认longxiaochun_v3,见packages/application/cosyvoice_service.py注释与健康检查)。v.id直接写进refAudio.id,confirm-copy/generate-video payload 取task.refAudio.id作为voice_id。3. ID 覆盖风险
原代码
{ ...v, ... }已经是把 API 的 v 放在展开后,但模糊匹配会给 category/desc 补充信息,不覆盖 id,所以不覆盖后端 voice_id。不过匹配逻辑用 name 模糊命中(slice(1)/slice(0,2))很脆弱,可能误匹配。4. MOCK_VOICES 与后端对齐
对照后端
packages/domain/preset_voices.py的 PRESET_VOICES 列表(CosyVoice v3-flash 真实可用音色),重写 MOCK_VOICES:5. 匹配逻辑修复
realList 映射改为按 id 精确匹配(
m.id === v.id),不用 name 模糊匹配。当 API 返回真实音色列表时,id/name/gender/category/desc 全部来自 API,不被 mock 覆盖;只有当字段缺失时才用 mock 的同 ID 条目补充。后端 ID 规范确认
后端 packages/domain/preset_voices.py 明确:
long{pinyin}_v3,例如 longxiaochun_v3验证
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #2130 已关闭或合并,对应的预览环境已被清理。
🚀 预览环境已部署