|
|
@@ -929,26 +929,49 @@ public class WebAiServiceImpl {
|
|
|
// 1. 获取TTS配置
|
|
|
AiTtsDO aiTtsDO = getTtsConfig(roleId);
|
|
|
|
|
|
- byte[] audioData;
|
|
|
- // 2. 根据平台选择不同的TTS服务
|
|
|
+ // 使用 ByteArrayOutputStream 收集流式音频数据
|
|
|
+ java.io.ByteArrayOutputStream audioOutputStream = new java.io.ByteArrayOutputStream();
|
|
|
+
|
|
|
+ // 2. 根据平台选择不同的TTS服务(使用流式接口获取PCM格式)
|
|
|
if ("DouBao".equals(aiTtsDO.getPlatform())) {
|
|
|
- // 使用豆包TTS服务
|
|
|
+ // 使用豆包TTS流式服务获取PCM数据
|
|
|
try {
|
|
|
- audioData = douBaoTtsService.convertTextToSpeech(aiTtsDO, content, command);
|
|
|
- } catch (Exception e) {
|
|
|
+ douBaoTtsService.streamTextToSpeech(aiTtsDO, content, command, bytes -> {
|
|
|
+ try {
|
|
|
+ audioOutputStream.write(bytes);
|
|
|
+ } catch (java.io.IOException e) {
|
|
|
+ throw new RuntimeException("写入音频数据失败", e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (java.io.IOException e) {
|
|
|
throw new RuntimeException("豆包文本转语音失败", e);
|
|
|
}
|
|
|
} else {
|
|
|
- // 使用阿里云TTS服务
|
|
|
+ // 使用阿里云TTS流式服务获取PCM数据
|
|
|
+ StreamingAliyunTtsService streamingAliyunTtsService = streamTtsServiceProvider.getObject();
|
|
|
try {
|
|
|
- audioData = aliyunTtsService.convertTextToSpeech(aiTtsDO, content);
|
|
|
+ streamingAliyunTtsService.setAudioDataCallback(bytes -> {
|
|
|
+ try {
|
|
|
+ audioOutputStream.write(bytes);
|
|
|
+ } catch (java.io.IOException e) {
|
|
|
+ throw new RuntimeException("写入音频数据失败", e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ streamingAliyunTtsService.startTts(aiTtsDO, com.alibaba.nls.client.protocol.OutputFormatEnum.PCM);
|
|
|
+ streamingAliyunTtsService.sendText(content);
|
|
|
+ streamingAliyunTtsService.stopTts();
|
|
|
} catch (Exception e) {
|
|
|
throw new RuntimeException("阿里云文本转语音失败", e);
|
|
|
+ } finally {
|
|
|
+ if (streamingAliyunTtsService != null) {
|
|
|
+ streamingAliyunTtsService.stopTts();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 3. 添加WAV头并转换为Base64(纯Base64,无前缀,与流式接口格式一致)
|
|
|
- byte[] wavData = WavHeader.addWavHeader(audioData, SampleRateEnum.SAMPLE_RATE_16K.value, 16, 1);
|
|
|
+ // 3. 获取PCM音频数据并添加WAV头
|
|
|
+ byte[] pcmData = audioOutputStream.toByteArray();
|
|
|
+ byte[] wavData = WavHeader.addWavHeader(pcmData, SampleRateEnum.SAMPLE_RATE_16K.value, 16, 1);
|
|
|
return java.util.Base64.getEncoder().encodeToString(wavData);
|
|
|
}
|
|
|
}
|