Skip to content

音频流

音频格式

参数客户端 → 服务器服务器 → 客户端
采样率取决于输入设备48,000 Hz
位深度16 位有符号16 位有符号
编码PCM 小端序PCM 小端序
声道单声道单声道
传输方式JSON 中的 Base64JSON 中的 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 ──> Browser

soxr 库提供高质量的采样率转换,将 LLM 原生的 24kHz 转换为浏览器播放所需的 48kHz。

中断机制

当用户在角色输出音频时开始说话:

  1. LLM 提供商触发 on_interrupt
  2. TTS 请求和响应队列被清空
  3. 待处理的音频帧被丢弃
  4. 角色立即停止说话
  5. 系统开始处理新的用户输入

这实现了语音对话中自然的轮流发言。

语音活动检测 (VAD)

N.E.K.O. 默认使用服务端 VAD。LLM 提供商(例如 Qwen Omni)自动检测语音边界。这意味着:

  • 无需客户端 VAD 配置
  • 由服务器判断用户是否已说完
  • 智能处理语音中的自然停顿

原生图像输入

在语音会话期间,系统还可以捕获并发送屏幕数据:

  • 最小间隔:两次捕获之间 1.5 秒
  • 空闲倍率:5 倍(无语音活动时降低图像发送频率)
  • 图像与音频一起发送,实现多模态理解

降噪

使用 pyrnnoise 的可选降噪功能:

  • 在首次音频输入时延迟加载
  • 在发送音频到 LLM 提供商之前应用
  • 如果输入音频已经很干净,可以禁用

基于 MIT 许可发布。