[i=s] 本帖最后由 业余菜狗 于 2026-7-31 15:07 编辑 [/i]
一句话了解它:基于 Ai-WV01-32S 和 Opus 音频编码,将 AiPi-PalChatV1 开发板改造为互联网对讲机,通过自建 WebSocket 中继服务器实现多设备实时语音对讲,支持 1-16 频道分组通话。
一、创作思路
1.1 项目起源
AiPi-PalChatV1 原本是一款 AI 语音助手开发板,板载了 VB6824 音频编解码芯片、麦克风、扬声器和 WiFi 模组,核心算力由 BL602 提供。这些硬件天然具备语音采集、编码、传输和播放的完整链路,非常适合实现互联网对讲机这一经典应用场景。
刚好手上有两块 AiPi-PalChatV1 开发板,便有了这个想法:把它们改造成一对无需依赖公网云服务、完全自主可控的互联网对讲机。
1.2 主要用途
| 用途场景 |
说明 |
| 🏠家庭内部通话 |
楼上楼下、房间之间快速沟通 |
| 🏢小办公室/商铺 |
店员之间即时通讯,无需拨号 |
| 🏕️户外/临时组网 |
通过 4G 热点或局域网自建通信 |
| 🎓DIY 学习/教学 |
学习嵌入式网络编程、音频流传输 |
| 🔌物联网语音通信 |
作为智能设备的语音交互入口 |
1.3 设计理念
- 自建服务器:不依赖第三方云服务,数据安全可控,无使用限制
- 低成本硬件:Ai-WV01-32S(BL602)主控,资源占用低
- Opus 编码:高压缩率下的优秀语音质量
- 多频道隔离:1-16 个频道,不同群组互不干扰
- PTT 操作:按住说话,松开即停,符合直觉
1.4 创新点
- 让 AI 开发板回归通信本质:不跑大模型,专注低延迟实时语音传输
- 极简中继服务器:仅 200+ 行 Python 代码,单核可支撑数十路并发
- 开箱即用:不需要账号、不需要认证,配网即用
二、硬件选型与引脚连接
2.1 核心硬件清单
| 组件 |
型号 |
作用 |
| 主控 |
Ai-WV01-32S(BL602) |
WiFi 通信 + 业务逻辑处理 |
| 音频编解码 |
VB6824 |
麦克风采集(ADC)+ 扬声器播放(DAC) |
| 麦克风 |
驻极体麦克风 |
拾取人声 |
| 扬声器 |
3W/4Ω(2W/8Ω) |
播放对方语音 |
| 按键 |
GPIO 按键 |
PTT(按住说话) |
| 指示灯 |
板载 LED |
连接/发射/接收状态指示 |
| 供电 |
Type-C / 电池 |
灵活供电 |
2.2 系统架构框图
text
┌─────────────────────────────────────────────────────────────────┐
│ AiPi-PalChatV1 硬件 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 麦克风 │───▶│ VB6824 │───▶│ BL602 │ │
│ │ (MEMS) │ │ (ADC) │ │ (主控) │ │
│ └──────────┘ └──────────┘ └────┬─────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ │ │
│ │ 扬声器 │◀───│ VB6824 │ │ │
│ │ (2W/8Ω) │ │ (DAC) │ │ │
│ └──────────┘ └──────────┘ │ │
│ │ │
│ ┌──────────┐ │ │
│ │ PTT按键 │─────────────────────────┘ │
│ └──────────┘ │
└──────────────────────────┬─────────────────────────────────────┘
│ WiFi (WSS)
▼
┌─────────────────────────────────────────────────────────────────┐
│ 中继服务器 (自建) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ intercom_server.py (Python + websockets) │ │
│ │ │ │
│ │ 设备A ──▶ 频道1 ◀── 设备B │ │
│ │ 设备C ──▶ 频道2 ◀── 设备D │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
三、功能特性
| 功能 |
说明 |
| 🗣️ PTT 实时通话 |
按住按键说话,松开即停,低延迟转发 |
| 📡 WebSocket 中继 |
设备间通过 WSS 协议实时转发 Opus 音频流 |
| 📶 多频道支持 |
1-16 个频道,不同频道语音隔离,互不干扰 |
| 🔌 灵活部署 |
支持公网服务器或局域网自建中继 |
| 🔋 低功耗设计 |
BL602 在语音传输场景下功耗表现优秀(约1W) |
| ⚡ 一键切换模式 |
对讲机模式 ↔ AI 语音助手模式,编译配置即可切换 |
四、系统架构(通信流程)
text
设备A(说话方) 中继服务器 设备B(收听方)
│ │ │
│ 1. WebSocket 连接 │ │
│───────────────────────────▶│ │
│ 2. 注册到频道 1 │ │
│───────────────────────────▶│ │
│ │ 3. WebSocket 连接 │
│ │◀───────────────────────────│
│ │ 4. 注册到频道 1 │
│ │───────────────────────────▶│
│ │ │
│ 5. 按住 PTT,采集语音 │ │
│ (Opus 编码,分片发送) │ │
│───────────────────────────▶│ │
│ │ 6. 转发至频道 1 所有设备 │
│ │───────────────────────────▶│
│ │ │ ◀── 实时播放
│ 7. 松开 PTT,结束发射 │ │
│───────────────────────────▶│ │
│ │ 8. 转发结束通知 │
│ │───────────────────────────▶│
通信协议说明
| 消息类型 |
方向 |
格式 |
说明 |
| 注册 |
设备→服务器 |
{"type":"register","channel":1} |
加入指定频道 |
| 音频数据 |
设备→服务器 |
{"type":"audio","data":"<base64>"} |
Opus 编码的语音分片 |
| 开始说话 |
设备→服务器 |
{"type":"start_talking"} |
PTT 按下通知 |
| 停止说话 |
设备→服务器 |
{"type":"stop_talking"} |
PTT 松开通知 |
| 转发数据 |
服务器→设备 |
{"type":"audio","data":"<base64>","from":"xx"} |
转发同频道音频 |
五、源码与仓库
5.1 源码仓库
https://gitee.com/amateur-dog/aipi-palchatv1-ptt
项目已开源,包含完整的对讲机客户端与中继服务器源码:
text
aipi-palchatv1/
├── server/
│ └── intercom_server.py # 中继服务器(Python + websockets)
├── aipi-palchatv1/
│ ├── intercom_client.c/h # 对讲机客户端核心逻辑
│ ├── intercom_config.h # 对讲机配置(服务器地址/频道)
│ ├── key.c # PTT 按键处理
│ └── xiaozhi_client/
│ └── ws_demo.c # WebSocket 通信层
├── os/ # BL602 操作系统与 SDK
└── build_out/ # 编译输出目录
5.2 依赖说明
| 依赖项 |
版本要求 |
说明 |
| Python |
3.7+ |
运行中继服务器 |
| websockets |
最新版 |
Python WebSocket 库 |
| RISC-V GCC |
项目已包含 |
编译 BL602 固件 |
| make |
任意版本 |
构建工具 |
六、服务器部署指南
6.1 安装与启动
bash
# 1. 进入服务端目录
cd /root/aipi-palchatv1/server
# 2. 安装依赖
pip install websockets
# 3. 启动中继服务器
python3 intercom_server.py
正常启动日志:
text
对讲机中继服务器启动: ws://0.0.0.0:8765
服务器就绪,等待设备连接...
注意:部署在公网时请确保防火墙开放 8765 端口。部署在局域网则无需额外配置。
6.2 设备端配置
编辑 aipi-palchatv1/intercom_config.h:
c
// 启用对讲机模式(禁用 AI 语音助手功能)
#define INTERCOM_MODE 1
// 中继服务器地址(修改为你的服务器 IP 或域名)
#define INTERCOM_SERVER_HOST "192.168.1.100" // 改为实际 IP
#define INTERCOM_SERVER_PORT 8765
// 默认频道(1-16)
#define INTERCOM_DEFAULT_CHANNEL 1
| 配置项 |
说明 |
INTERCOM_MODE |
1=对讲机模式,0=AI 语音助手模式 |
INTERCOM_SERVER_HOST |
中继服务器的 IP 地址或域名 |
INTERCOM_SERVER_PORT |
服务器端口,默认 8765 |
INTERCOM_DEFAULT_CHANNEL |
开机默认频道(1-16) |
提示:设备 ID 自动使用 WiFi MAC 地址生成,多台设备无需手动配置 ID。
七、使用方法
7.1 开机启动
开发板上电后,串口日志(115200 baud)应显示:
text
[INTERCOM] Starting in intercom mode
[INTERCOM] Connect task: waiting for WiFi...
[INTERCOM] WiFi connected, starting intercom...
[INTERCOM] Connecting to ws://192.168.1.100:8765
[INTERCOM] WebSocket connected
[INTERCOM] Registered successfully
7.2 PTT 通话操作
| 操作 |
功能 |
| 按住 PTT 按键 |
开始说话(采集 → 编码 → 发送) |
| 松开 PTT 按键 |
停止说话(释放发射通道) |
7.3 LED 状态指示
| LED 状态 |
含义 |
| 熄灭 |
空闲 / 未连接服务器 |
| 慢速闪烁(1Hz) |
正在连接服务器 / WiFi 未就绪 |
| 快速闪烁(5Hz) |
本机正在发射语音 |
| 常亮 |
正在接收并播放对方语音 |
八、成品展示
8.1 实物照片

8.2 语音交互演示视频

