AI Agent智能体 - 非VAD实时语音对话系统

功能概述

基于《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();  // 关闭音频播放器

关键特性

  1. 手动音频传输: 程序主动控制音频数据的发送节奏

  2. 实时交互: 支持语音输入和语音输出的实时对话

  3. 性能监控: 输出首次文本延迟和首次音频延迟等性能指标

  4. Base64编码: 音频数据通过 Base64 编码传输


使用场景

适用于需要实时语音对话的应用,如语音助手、实时翻译、语音客服等场景。程序模拟了完整的语音对话流程,从语音输入到语音输出的全过程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值