功能概述
基于《JavaUtils系列 - 实时PCM音频播放器(RealtimePcmPlayer)》实现无需服务端VAD(语音活动检测)的实时语音对话系统,支持语音输入和语音输出。
相关依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.20.9</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5.4</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.3</version>
</dependency>
核心组件
1. 初始化参数
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen-omni-turbo-realtime-latest")
.build();
-
使用通义千问 Omni Turbo 实时模型
-
需要设置 API Key(当前被注释)
2. 音频播放器
RealtimePcmPlayer audioPlayer = new RealtimePcmPlayer(24000);
创建采样率为 24kHz 的实时 PCM 音频播放器
3. 实时对话会话
核心的 OmniRealtimeConversation 类,通过回调处理各种事件:
事件处理回调
onOpen()
-
WebSocket 连接建立时触发
-
输出 "connection opened"
onEvent(JsonObject message)
处理不同类型的服务器事件:
-
session.created: 会话创建成功
-
conversation.item.input_audio_transcription.completed: 语音转文本完成,显示识别结果
-
response.audio_transcript.delta: 接收大模型文本回复的增量内容
-
response.audio.delta: 接收语音合成的增量音频数据,写入播放器
-
response.done: 响应完成,输出性能指标
主要工作流程
1. 连接建立
conversation.connect(); // 建立 WebSocket 连接
2. 会话配置
OmniRealtimeConfig config = OmniRealtimeConfig.builder()
.modalities(Arrays.asList(OmniRealtimeModality.AUDIO, OmniRealtimeModality.TEXT))
.voice("Chelsie") // 使用 Chelsie 语音
.enableTurnDetection(false) // 禁用自动语音检测
.build();
conversation.updateSession(config);
3. 音频数据发送
// 读取 PCM 音频文件
FileInputStream fis = new FileInputStream(audioFile);
byte[] buffer = new byte[3200]; // 每次发送 3200 字节
// 循环读取并发送音频数据
while ((bytesRead = fis.read(buffer)) != -1) {
String audioB64 = Base64.getEncoder().encodeToString(byteBuffer.array());
conversation.appendAudio(audioB64); // 发送 Base64 编码的音频
Thread.sleep(100); // 控制发送速率
}
4. 请求处理
conversation.commit(); // 提交输入数据
conversation.createResponse(null, null); // 创建响应
5. 等待完成和清理
responseDoneLatch.get().await(); // 等待响应完成
conversation.close(1000, "bye"); // 关闭连接
audioPlayer.waitForComplete(); // 等待音频播放完成
audioPlayer.shutdown(); // 关闭音频播放器
关键特性
-
手动音频传输: 程序主动控制音频数据的发送节奏
-
实时交互: 支持语音输入和语音输出的实时对话
-
性能监控: 输出首次文本延迟和首次音频延迟等性能指标
-
Base64编码: 音频数据通过 Base64 编码传输
使用场景
适用于需要实时语音对话的应用,如语音助手、实时翻译、语音客服等场景。程序模拟了完整的语音对话流程,从语音输入到语音输出的全过程。
1619

被折叠的 条评论
为什么被折叠?



