fix:问题
This commit is contained in:
@@ -58,7 +58,6 @@ public class SiliconFlowProvider implements VoiceCloneProvider {
|
||||
sfRequest.setText(getOrDefault(request.getTranscriptionText(), config.getPreviewText()));
|
||||
sfRequest.setAudio(AUDIO_MIME_TYPE + base64Audio);
|
||||
|
||||
// 调用上传参考音频 API
|
||||
String url = config.getBaseUrl() + config.getVoiceUploadUrl();
|
||||
String requestBody = JSONUtil.toJsonStr(sfRequest);
|
||||
log.debug("[SiliconFlowProvider][请求体]{}", requestBody);
|
||||
@@ -123,7 +122,6 @@ public class SiliconFlowProvider implements VoiceCloneProvider {
|
||||
.responseFormat(getOrDefault(request.getAudioFormat(), config.getAudioFormat()))
|
||||
.build();
|
||||
|
||||
// 调用文本转语音 API
|
||||
String url = config.getBaseUrl() + config.getTtsUrl();
|
||||
String requestBody = JSONUtil.toJsonStr(sfRequest);
|
||||
log.debug("[SiliconFlowProvider][请求体]{}", requestBody);
|
||||
@@ -142,7 +140,6 @@ public class SiliconFlowProvider implements VoiceCloneProvider {
|
||||
throw new RuntimeException("硅基流动文本转语音失败: " + errorBody);
|
||||
}
|
||||
|
||||
// 硅基流动直接返回二进制音频数据
|
||||
byte[] audioBytes = response.bodyBytes();
|
||||
String base64Audio = Base64.getEncoder().encodeToString(audioBytes);
|
||||
|
||||
|
||||
@@ -36,8 +36,6 @@ public class SiliconFlowTtsRequest {
|
||||
*/
|
||||
private Float speed;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 响应格式(mp3, opus, wav, pcm)(API 参数名:response_format)
|
||||
*/
|
||||
|
||||
@@ -32,8 +32,11 @@ public class SiliconFlowProviderConfig extends VoiceProviderProperties.ProviderC
|
||||
|
||||
/**
|
||||
* 默认采样率
|
||||
* <p>mp3: 32000, 44100 (默认 44100)</p>
|
||||
* <p>opus: 48000</p>
|
||||
* <p>wav/pcm: 8000, 16000, 24000, 32000, 44100 (默认 44100)</p>
|
||||
*/
|
||||
private Integer sampleRate = 24000;
|
||||
private Integer sampleRate = 44100;
|
||||
|
||||
/**
|
||||
* 默认音频格式
|
||||
|
||||
@@ -144,34 +144,38 @@ public class TikUserVoiceServiceImpl implements TikUserVoiceService {
|
||||
.setLanguage(StrUtil.blankToDefault(createReqVO.getLanguage(), "zh-CN"))
|
||||
.setGender(StrUtil.blankToDefault(createReqVO.getGender(), "female"))
|
||||
.setNote(createReqVO.getNote())
|
||||
.setTranscription(null); // 初始为空,表示未识别
|
||||
.setTranscription(createReqVO.getText()); // 使用前端传入的文本
|
||||
voiceMapper.insert(voice);
|
||||
|
||||
// 4. 调用语音克隆服务,生成 voice_id
|
||||
try {
|
||||
log.info("[createVoice][开始语音复刻,配音编号({}),文件ID({}),供应商({})]",
|
||||
voice.getId(), fileDO.getId(), createReqVO.getProviderType());
|
||||
String fileAccessUrl = fileApi.presignGetUrl(fileDO.getUrl(), PRESIGN_URL_EXPIRATION_SECONDS);
|
||||
if (StrUtil.isNotBlank(createReqVO.getText())) {
|
||||
try {
|
||||
log.info("[createVoice][开始语音复刻,配音编号({}),文件ID({}),供应商({})]",
|
||||
voice.getId(), fileDO.getId(), createReqVO.getProviderType());
|
||||
String fileAccessUrl = fileApi.presignGetUrl(fileDO.getUrl(), PRESIGN_URL_EXPIRATION_SECONDS);
|
||||
|
||||
VoiceCloneProvider provider = voiceProviderFactory.getProvider(createReqVO.getProviderType());
|
||||
String providerType = getProviderType(createReqVO.getProviderType(), provider);
|
||||
String model = getModelByProvider(providerType);
|
||||
VoiceCloneProvider provider = voiceProviderFactory.getProvider(createReqVO.getProviderType());
|
||||
String providerType = getProviderType(createReqVO.getProviderType(), provider);
|
||||
String model = getModelByProvider(providerType);
|
||||
|
||||
VoiceCloneRequest cloneRequest = new VoiceCloneRequest();
|
||||
cloneRequest.setAudioUrl(fileAccessUrl);
|
||||
cloneRequest.setModel(model);
|
||||
cloneRequest.setPrefix("voice" + voice.getId());
|
||||
cloneRequest.setTranscriptionText(voice.getTranscription());
|
||||
VoiceCloneRequest cloneRequest = new VoiceCloneRequest();
|
||||
cloneRequest.setAudioUrl(fileAccessUrl);
|
||||
cloneRequest.setModel(model);
|
||||
cloneRequest.setPrefix("voice" + voice.getId());
|
||||
cloneRequest.setTranscriptionText(createReqVO.getText()); // 使用前端传入的文本
|
||||
|
||||
VoiceCloneResult cloneResult = provider.cloneVoice(cloneRequest);
|
||||
String voiceId = cloneResult.getVoiceId();
|
||||
VoiceCloneResult cloneResult = provider.cloneVoice(cloneRequest);
|
||||
String voiceId = cloneResult.getVoiceId();
|
||||
|
||||
voice.setVoiceId(voiceId);
|
||||
voiceMapper.updateById(voice);
|
||||
voice.setVoiceId(voiceId);
|
||||
voiceMapper.updateById(voice);
|
||||
|
||||
log.info("[createVoice][语音复刻成功,配音编号({}),voice_id({})]", voice.getId(), voiceId);
|
||||
} catch (Exception e) {
|
||||
log.error("[createVoice][语音复刻失败,配音编号({}),错误信息: {}]", voice.getId(), e.getMessage(), e);
|
||||
log.info("[createVoice][语音复刻成功,配音编号({}),voice_id({})]", voice.getId(), voiceId);
|
||||
} catch (Exception e) {
|
||||
log.error("[createVoice][语音复刻失败,配音编号({}),错误信息: {}]", voice.getId(), e.getMessage(), e);
|
||||
}
|
||||
} else {
|
||||
log.info("[createVoice][未提供文本,跳过语音复刻,配音编号({})]", voice.getId());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.tik.voice.vo;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
@@ -34,6 +35,10 @@ public class AppTikUserVoiceCreateReqVO {
|
||||
@Schema(description = "备注", example = "这是一个测试配音")
|
||||
private String note;
|
||||
|
||||
@Schema(description = "音频文本(用于语音复刻,前端通过音频识别获取)")
|
||||
@Size(max = 4000, message = "音频文本不能超过 4000 个字符")
|
||||
private String text;
|
||||
|
||||
@Schema(description = "供应商类型:cosyvoice-阿里云,siliconflow-硅基流动(不传则使用默认)", example = "cosyvoice")
|
||||
private String providerType;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user