功能概述
基于《JavaUtils系列 - 实时PCM音频播放器(RealtimePcmPlayer)》实现实时多模态语音交互系统,结合了音频输入、视觉输入和WebSocket通信功能。
相关依赖
<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>
整体架构
-
语音对话:实时录音并发送到Omni模型
-
视觉输入:通过WebSocket接收图片帧
-
多模态交互:同时处理音频和图像输入
核心组件
1. WebSocket服务器 (WsktUtil)
class WsktUtil extends WebSocketServer {
private static List<WebSocket> clients = new CopyOnWriteArrayList<>();
private AtomicReference<String> imageFrameB64 = new AtomicReference<>();
}
-
监听5000端口,接收客户端连接
-
处理二进制消息(图片帧)并Base64编码存储
-
使用线程安全的
CopyOnWriteArrayList管理客户端连接
2. 主程序 (OmniWithCamera)
初始化配置
OmniRealtimeParam param = OmniRealtimeParam.builder()
.model("qwen-omni-turbo-realtime-latest")
.build();
配置Omni实时对话参数,使用通义千问Omni Turbo模型。
回调处理
new OmniRealtimeCallback() {
@Override
public void onEvent(JsonObject message) {
// 处理各种事件类型
}
}
关键事件处理:
-
session.created:会话创建 -
input_audio_transcription.completed:语音转文本完成 -
response.audio_transcript.delta:LLM文本响应片段 -
response.audio.delta:音频响应片段(播放语音) -
input_audio_buffer.speech_started:VAD检测到语音开始 -
response.done:响应完成,输出性能指标
音频处理
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false);
TargetDataLine targetDataLine = AudioSystem.getTargetDataLine(audioFormat);
-
采样率:16kHz
-
样本大小:16位
-
单声道录音
-
实时读取音频数据并Base64编码发送
多模态数据流
// 发送音频
conversation.appendAudio(audioB64);
// 每500ms发送一次图片
if (EnableVisionInput && System.currentTimeMillis() - last_photo_time > 500) {
String imageB64 = server.getImageFrameB64();
if (imageB64 != null) {
conversation.appendVideo(imageB64);
last_photo_time = System.currentTimeMillis();
}
}
工作流程
-
启动服务:WebSocket服务器和Omni连接
-
配置会话:启用音频、文本模态,配置语音合成和VAD
-
实时录音:持续采集音频并发送
-
视觉输入:定期从WebSocket获取图片帧并发送
-
响应处理:接收并播放语音响应,显示文本响应
-
性能监控:记录首包延迟等指标
技术特点
-
实时性:低延迟的音频流处理
-
多模态:同时支持语音和视觉输入
-
模块化:清晰的组件分离
-
可扩展:易于添加新的模态或功能
使用场景
适用于需要实时语音+视觉交互的应用,如:
-
智能客服机器人
-
多模态助手
-
实时翻译工具
-
视觉问答系统

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



