fix: CosyVoice全量重写 - 适配DashScope百炼API #212
Reference in New Issue
Block a user
Delete Branch "fix/cosyvoice-full-rewrite"
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?
背景
CosyVoice原有实现基于旧版接口,导致音色克隆和TTS合成持续失败(401认证失败、task can not be null等错误)。本次全量重写以适配正确的DashScope百炼API。
变更内容
配置更新
cosyvoice_base_url改为https://dashscope.aliyuncs.com/api/v1cosyvoice_model改为cosyvoice-v3.5-pluscosyvoice_clone_model = "voice-enrollment"音色克隆
POST /services/audio/tts/customizationvoice-enrollmentcreate_voice{action, target_model, prefix, url}voice_id(替代旧的task_id)状态查询
POST /services/audio/tts/customizationquery_voiceDEPLOYING/OK/UNDEPLOYED语音合成
POST /services/audio/tts/SpeechSynthesizeraudio_urlOSS音频预签名
audio_url_signer钩子参数Workflow适配
voice_id替代task_id,status=OK标记ready两端注入
dependencies.py:注入OSS预签名函数voice_clone.py:注入OSS预签名函数测试
test_cosyvoice_service.py:36个测试,全部通过test_voice_clone_workflow.py:18个测试,全部通过涉及文件(8个)
packages/shared/config.pypackages/application/cosyvoice_service.pypackages/application/voice_clone/workflow.pypackages/application/tts_job/workflow.pyapps/api/app/dependencies.pyapps/worker/worker_app/tasks/voice_clone.pytests/unit/test_cosyvoice_service.pytests/unit/test_voice_clone_workflow.py代码审计报告 — PR #212 CosyVoice全量重写
结论:🔴 不通过(存在 P0 级语法错误)
🔴 P0 — TTS workflow 文件语法错误(阻断)
位置:
packages/application/tts_job/workflow.py第312行process_synthesis_failure方法问题:docstring 被错误地单行闭合
影响:
tts_job/workflow.py文件无法 import修复方案:把第一行的
"""处理合成失败结果。"""改回"""处理合成失败结果。(去掉末尾的"""),保持多行 docstring 结构不变。🟡 P1 — 重合成兜底路径丢失 speed/volume 参数
位置:
_resynthesize_and_complete()方法问题:重新调用
submit_synthesize_task时只传了text、voice_id、sample_rate、format,没有传speed和volume,导致兜底合成的语速音量与原始请求不一致。修复建议:从
job对象中读取 speed/volume(如果 metadata 里有存的话),或者在 job 实体上增加这两个字段。🟡 P1 — 旧分段任务走到轮询路径会直接抛异常
位置:
_poll_segment_tasks()方法第506行问题:
poll_synthesize_task()会直接抛CosyVoiceError("同步接口无需轮询")修复建议:在
_poll_segment_tasks中检测到 task_id 为空或新接口模式时,改为直接重新同步合成(与单段兜底逻辑一致)。🟢 P2 — 音色克隆 payload 结构需验证
位置:
submit_clone_task()的 payload问题:当前音色克隆 payload 只有
model + input,没有parameters字段。百炼 Voice Design API 的格式是input + parameters双层结构,音色克隆(voice-enrollment)是否同样需要parameters层需 staging 验证。建议:先上 staging 实测,如果报参数错误再调整结构。
🟢 P3 — 兼容层命名易混淆
check_task_status(task_id):参数名是 task_id,实际传的是 voice_id,容易误导后续维护者。建议加 type hint 注释或直接重命名。poll_synthesize_task():直接抛异常太粗暴,建议加DeprecationWarning或在 docstring 标注 deprecated。✅ 已验证正确的项
📊 测试覆盖
test_cosyvoice_service.py:36 个测试,全部通过 ✅test_voice_clone_workflow.py:18 个测试,全部通过 ✅test_tts_*.py:因 P0 语法错误无法收集测试 ❌📋 修复优先级
修完 P0 后我再复审一次。
代码审计复审 — PR #212 CosyVoice全量重写(第二轮)
结论:✅ 通过,可合并
修复验证
详细验证
✅ P0 — docstring 语法错误已修复
process_synthesis_failure方法的 docstring 已恢复多行结构,Args/Returns/Raises 正确包含在三引号内。文件语法检查通过,所有 TTS 测试可正常收集运行。✅ P1-1 — 兜底路径补上 speed/volume
_resynthesize_and_complete方法从job.metadata读取speed和volume参数(默认值 1.0/50),传入submit_synthesize_task。虽然当前主路径也未将 speed 写入 metadata(历史遗留),但兜底路径与主路径行为保持一致,且为未来支持 speed 参数铺路。✅ P1-2 — 分段任务路径适配同步接口
_poll_segment_tasks完全重写,移除了轮询逻辑和time依赖:audio_url的分段直接复用_handle_segment_failure正常标记 failedtest_partial_audio_urls_reuse_existing测试用例📊 测试覆盖
⚪ 未修复项(不阻断合并)
check_task_status参数名、poll_synthesize_task废弃标记,低优先级建议📌 备注
主路径(
start_synthesis/_start_segment_synthesis)同样没有传递 speed/volume 到 CosyVoice,这是历史遗留问题(API 层有 speed 字段但未下传),非 PR #212 引入。建议后续迭代中将 speed 写入 metadata 并在 workflow 层透传。整体结论:P0/P1 全部清零,78 个测试全绿,可合并。