音频流
音频格式
| 参数 | 客户端 → 服务器 | 服务器 → 客户端 |
|---|---|---|
| 采样率 | 取决于输入设备 | 48,000 Hz |
| 位深度 | 16 位有符号 | 16 位有符号 |
| 编码 | PCM 小端序 | PCM 小端序 |
| 声道 | 单声道 | 单声道 |
| 传输方式 | JSON 中的 Base64 | JSON 中的 Base64 |
输入管线
Microphone ──> Browser AudioContext ──> PCM chunks ──> Base64 ──> WebSocket
│
Main Server
│
OmniRealtimeClient.send_audio()
│
LLM Provider服务器内部处理采样率转换。支持任何常见采样率(44.1kHz、48kHz 等)的输入音频。
输出管线
LLM Provider ──> on_audio_delta ──> 24kHz PCM
│
soxr resampler
│
48kHz PCM ──> Base64 ──> WebSocket ──> Browsersoxr 库提供高质量的采样率转换,将 LLM 原生的 24kHz 转换为浏览器播放所需的 48kHz。
中断机制
当用户在角色输出音频时开始说话:
- LLM 提供商触发
on_interrupt - TTS 请求和响应队列被清空
- 待处理的音频帧被丢弃
- 角色立即停止说话
- 系统开始处理新的用户输入
这实现了语音对话中自然的轮流发言。
语音活动检测 (VAD)
N.E.K.O. 默认使用服务端 VAD。LLM 提供商(例如 Qwen Omni)自动检测语音边界。这意味着:
- 无需客户端 VAD 配置
- 由服务器判断用户是否已说完
- 智能处理语音中的自然停顿
原生图像输入
在语音会话期间,系统还可以捕获并发送屏幕数据:
- 最小间隔:两次捕获之间 1.5 秒
- 空闲倍率:5 倍(无语音活动时降低图像发送频率)
- 图像与音频一起发送,实现多模态理解
降噪
使用 pyrnnoise 的可选降噪功能:
- 在首次音频输入时延迟加载
- 在发送音频到 LLM 提供商之前应用
- 如果输入音频已经很干净,可以禁用
