diff --git a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java index 1b0181bc..dcee2c2b 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java @@ -392,6 +392,15 @@ public class ConfigServiceImpl implements ConfigService { ((Map) model.getConfigJson()).put("ref_audio", referenceAudio); if (referenceText != null) ((Map) model.getConfigJson()).put("ref_text", referenceText); + + // 火山引擎声音克隆需要替换resource_id + Map map = (Map) model.getConfigJson(); + if ("huoshan_double_stream".equals(map.get("type"))) { + // 如果voice是”S_“开头的,使用seed-icl-1.0 + if (voice != null && voice.startsWith("S_")) { + map.put("resource_id", "seed-icl-1.0"); + } + } } // 如果是Intent类型,且type=intent_llm,则给他添加附加模型 if ("Intent".equals(modelTypes[i])) { diff --git a/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java index 06d7e9db..89064a53 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java @@ -84,7 +84,7 @@ public class VoiceCloneServiceImpl extends BaseServiceImpl>> HTTP status = " + response.statusCode()); System.out.println(">>> response body = " + response.body()); - if (response.statusCode() == 200) { - Map rsp = objectMapper.readValue(response.body(), - new TypeReference>() { - }); + Map rsp = objectMapper.readValue(response.body(), + new TypeReference>() { + }); - // 获取BaseResp对象 - Map baseResp = objectMapper.convertValue(rsp.get("BaseResp"), - new TypeReference>() { - }); - if (baseResp != null) { - Integer statusCode = objectMapper.convertValue(baseResp.get("StatusCode"), Integer.class); - String statusMessage = objectMapper.convertValue(baseResp.getOrDefault("StatusMessage", ""), - String.class); + // 获取BaseResp对象 + Map baseResp = objectMapper.convertValue(rsp.get("BaseResp"), + new TypeReference>() { + }); + if (baseResp != null) { + Integer statusCode = objectMapper.convertValue(baseResp.get("StatusCode"), Integer.class); + String statusMessage = objectMapper.convertValue(baseResp.getOrDefault("StatusMessage", ""), + String.class); - // 获取speaker_id - String speakerId = objectMapper.convertValue(rsp.get("speaker_id"), String.class); + // 获取speaker_id + String speakerId = objectMapper.convertValue(rsp.get("speaker_id"), String.class); - // StatusCode == 0 表示成功 - if (statusCode != null && statusCode == 0 && StringUtils.isNotBlank(speakerId)) { - entity.setTrainStatus(2); - entity.setVoiceId(speakerId); - entity.setTrainError(""); - baseDao.updateById(entity); - - try { - // 检查speaker_id是否已经被使用 - if (timbreService.existsByTtsVoice(speakerId)) { - log.info("音色编码speaker_id[{}]已存在,不重复写入数据库", speakerId); - } else { - xiaozhi.modules.timbre.dto.TimbreDataDTO timbreDataDTO = new xiaozhi.modules.timbre.dto.TimbreDataDTO(); - timbreDataDTO.setTtsModelId(entity.getModelId()); - timbreDataDTO.setName(entity.getName()); - timbreDataDTO.setTtsVoice(speakerId); - timbreDataDTO.setSort(1); - timbreDataDTO.setLanguages("zh-CN"); - timbreDataDTO.setRemark("复刻音色"); - - // 保存到音色表 - timbreService.save(timbreDataDTO); - log.info("成功将复刻音色添加到音色表,speaker_id: {}", speakerId); - } - } catch (Exception e) { - // 记录错误但不影响主流程 - log.error("将复刻音色添加到音色表失败: " + e.getMessage(), e); + // StatusCode == 0 表示成功 + if (statusCode != null && statusCode == 0 && StringUtils.isNotBlank(speakerId)) { + entity.setTrainStatus(2); + entity.setVoiceId(speakerId); + entity.setTrainError(""); + baseDao.updateById(entity); + + try { + // 检查speaker_id是否已经被使用 + if (timbreService.existsByTtsVoice(speakerId)) { + log.info("音色编码speaker_id[{}]已存在,不重复写入数据库", speakerId); + } else { + xiaozhi.modules.timbre.dto.TimbreDataDTO timbreDataDTO = new xiaozhi.modules.timbre.dto.TimbreDataDTO(); + timbreDataDTO.setTtsModelId(entity.getModelId()); + timbreDataDTO.setName(entity.getName()); + timbreDataDTO.setTtsVoice(speakerId); + timbreDataDTO.setSort(1); + timbreDataDTO.setLanguages("zh-CN"); + timbreDataDTO.setRemark("复刻音色"); + + // 保存到音色表 + timbreService.save(timbreDataDTO); + log.info("成功将复刻音色添加到音色表,speaker_id: {}", speakerId); } - } else { - // 失败时使用StatusMessage作为错误信息 - String errorMsg = StringUtils.isNotBlank(statusMessage) ? statusMessage : "训练失败"; - throw new RenException(errorMsg); + } catch (Exception e) { + // 记录错误但不影响主流程 + log.error("将复刻音色添加到音色表失败: " + e.getMessage(), e); } } else { - throw new RenException(ErrorCode.VOICE_CLONE_RESPONSE_FORMAT_ERROR); + // 失败时使用StatusMessage作为错误信息 + String errorMsg = StringUtils.isNotBlank(statusMessage) ? statusMessage : "训练失败"; + throw new RenException(errorMsg); } } else { - throw new RenException(ErrorCode.VOICE_CLONE_REQUEST_FAILED + ",状态码: " + response.statusCode()); + String errorMsg = objectMapper.convertValue(rsp.get("message"), + new TypeReference() { + }); + if (StringUtils.isNotBlank(errorMsg)) { + throw new RenException(errorMsg); + } + throw new RenException(ErrorCode.VOICE_CLONE_RESPONSE_FORMAT_ERROR); } } } diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index 77028d69..f6f64086 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -1021,7 +1021,7 @@ export default { 'warning': 'Warning', 'info': 'Info', 'common.networkError': 'Network request failed', - + // SM2 Encryption 'sm2.publicKeyNotConfigured': 'SM2 public key not configured, please contact administrator', 'sm2.encryptionFailed': 'Password encryption failed', @@ -1112,5 +1112,5 @@ export default { 'voiceClone.updateNameSuccess': 'Name updated successfully', 'voiceClone.updateNameFailed': 'Failed to update name', 'voiceClone.playFailed': 'Play failed', - 'voiceClone.Details': 'Details', + 'voiceClone.Details': 'Error Details', } \ No newline at end of file diff --git a/main/manager-web/src/i18n/zh_CN.js b/main/manager-web/src/i18n/zh_CN.js index c063bb4d..0e8e70a5 100644 --- a/main/manager-web/src/i18n/zh_CN.js +++ b/main/manager-web/src/i18n/zh_CN.js @@ -466,7 +466,7 @@ export default { 'chatHistory.downloadCurrentSession': '下载本会话聊天记录', 'chatHistory.downloadCurrentWithPreviousSessions': '下载本会话及前20条会话聊天记录', 'chatHistory.downloadLinkFailed': '获取下载链接失败', - + 'cache.status': '缓存状态', 'cache.cdnEnabled': 'CDN模式已启用', 'cache.cdnDisabled': 'CDN模式已禁用', @@ -1021,7 +1021,7 @@ export default { 'warning': '警告', 'info': '提示', 'common.networkError': '网络请求失败', - + // SM2加密相关错误消息 'sm2.publicKeyNotConfigured': 'SM2公钥未配置,请联系管理员', 'sm2.encryptionFailed': '密码加密失败', @@ -1112,5 +1112,5 @@ export default { 'voiceClone.updateNameSuccess': '名称更新成功', 'voiceClone.updateNameFailed': '名称更新失败', 'voiceClone.playFailed': '播放失败', - 'voiceClone.Details': '详情', + 'voiceClone.Details': '错误详情', } \ No newline at end of file diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js index 07a82737..dffa61d2 100644 --- a/main/manager-web/src/i18n/zh_TW.js +++ b/main/manager-web/src/i18n/zh_TW.js @@ -16,7 +16,7 @@ export default { 'header.paramDictionary': '參數字典', 'header.paramManagement': '參數管理', 'header.dictManagement': '字典管理', - 'header.agentTemplate': '預設角色模板', + 'header.agentTemplate': '預設角色模板', 'header.searchHistory': '搜索歷史', 'header.clearHistory': '清空歷史', 'header.providerManagement': '字段管理', @@ -1112,5 +1112,5 @@ export default { 'voiceClone.updateNameSuccess': '名稱更新成功', 'voiceClone.updateNameFailed': '名稱更新失敗', 'voiceClone.playFailed': '播放失敗', - 'voiceClone.Details': '詳情', + 'voiceClone.Details': '錯誤詳情', } \ No newline at end of file diff --git a/main/manager-web/src/views/VoiceCloneManagement.vue b/main/manager-web/src/views/VoiceCloneManagement.vue index 44290aae..ad64fd3a 100644 --- a/main/manager-web/src/views/VoiceCloneManagement.vue +++ b/main/manager-web/src/views/VoiceCloneManagement.vue @@ -41,17 +41,17 @@ - + - +