fix:修改音色克隆详细内容

This commit is contained in:
3030332422
2025-10-18 21:47:14 +08:00
parent b776c545e3
commit 958d50c119
@@ -187,52 +187,76 @@ export default {
case 2: case 2:
return '训练成功'; return '训练成功';
case 3: case 3:
// 训练失败时,根据状态码显示详细错误信息 // 训练失败时,根据错误信息智能展示
let statusCode = null; if (row.trainError) {
const errorMsg = row.trainError;
// 优先从row.statusCode获取状态码 // 火山引擎语音复刻业务错误码映射表
if (row.statusCode) { const voiceCloneErrorMap = {
statusCode = parseInt(row.statusCode); // 确保是数字类型 '1001': '请求参数有误',
} '1101': '音频上传失败',
// 如果有trainError字段,尝试从中提取状态码 '1102': 'ASR(语音识别成文字)转写失败',
else if (row.trainError && typeof row.trainError === 'string') { '1103': 'SID声纹检测失败',
console.log('尝试从trainError提取状态码:', row.trainError); '1104': '声纹检测未通过,声纹跟名人相似度过高',
// 使用更宽松的正则表达式,匹配各种可能的状态码格式 '1105': '获取音频数据失败',
const statusMatch = row.trainError.match(/(?:状态码|status code):?\s*(\d+)/i); '1106': 'SpeakerID重复',
if (statusMatch && statusMatch[1]) { '1107': 'SpeakerID未找到',
statusCode = parseInt(statusMatch[1]); '1108': '音频转码失败',
console.log('成功提取状态码:', statusCode); '1109': 'WER检测错误,上传音频与请求携带文本对比字错率过高',
} '1111': 'AED检测错误,通常由于音频不包含说话声',
} '1112': 'SNR检测错误,通常由于信噪比过高',
'1113': '降噪处理失败',
// 如果成功获取到状态码,显示对应的错误信息 '1114': '音频质量低,降噪失败',
if (statusCode) { '1122': '未检测到人声',
console.log('使用状态码:', statusCode); '1123': '已达上传次数限制(同一个音色支持10次上传)'
// 创建完整的状态码映射表
const statusMessages = {
400: '关键参数缺失,例如Action, Version参数缺失等。',
401: '请求的Access Key不合法或签名结果不正确。',
403: '子用户拥有的权限不支持当前操作。',
404: '请求的服务或接口不存在。',
429: '请求过于频繁,超出了限速。',
500: '内部错误。',
502: '服务存在故障。',
503: '处于熔断状态的服务暂时不可访问,稍后重试。',
504: '服务执行超时。'
}; };
// 简化处理,直接使用对象而非数组 // HTTP 公共错误码映射表
if (statusMessages.hasOwnProperty(statusCode)) { const httpErrorMap = {
return `训练失败 (${statusCode}): ${statusMessages[statusCode]}`; '400': '请求参数错误',
'401': 'Access Key不合法或签名错误',
'403': '权限不足',
'404': '接口不存在',
'429': '请求过于频繁',
'500': '服务器内部错误',
'502': '服务故障',
'503': '服务暂时不可用',
'504': '服务超时'
};
// 匹配业务错误码
const businessErrorMatch = errorMsg.match(/业务错误\s*(\d+):/);
if (businessErrorMatch) {
const code = businessErrorMatch[1];
const desc = voiceCloneErrorMap[code] || errorMsg.split(':')[1]?.trim() || '未知错误';
return `训练失败:${desc}\n(业务错误码 ${code}`;
} }
}
// 如果有trainError直接显示 // 匹配旧格式的业务错误码
if (row.trainError) { for (const [code, desc] of Object.entries(voiceCloneErrorMap)) {
console.log('直接显示trainError:', row.trainError); if (errorMsg.includes(code)) {
return `训练失败: ${row.trainError}`; return `训练失败${desc}\n(业务错误码 ${code}`;
} }
}
// 匹配HTTP状态码
const httpErrorMatch = errorMsg.match(/HTTP\s*(\d+)/);
if (httpErrorMatch) {
const code = httpErrorMatch[1];
const desc = httpErrorMap[code] || '请求失败';
// 提取完整的错误信息
return `训练失败:${desc}\nHTTP ${code}\n${errorMsg}`;
}
// 匹配旧格式的HTTP状态码
for (const [code, desc] of Object.entries(httpErrorMap)) {
if (errorMsg.includes(`状态码: ${code}`) || errorMsg.includes(`状态码:${code}`)) {
return `训练失败:${desc}\nHTTP ${code}`;
}
}
return `训练失败:${errorMsg}`;
}
return '训练失败'; return '训练失败';
default: default:
return ''; return '';