该系统使用esp32-s3作为语音节点。使用便捷的工具实现了一些基础功能:
1.自动节点接入
2.全局语音规避,竞选机制使用最大信噪比作为判定方式;
3.单工通信,音频回复时禁止下达新语音指令;
4.音频桥接器,当模型运行于本地时,直接桥接本地音频作为输入和输出;
音频输入输出为数字音频彻底解决模拟音频的噪音;

桥接文档:
## 目录
- Windows: `bridges/windows/bridge_windows.py`
- macOS: `bridges/macos/bridge_macos.py`
- 依赖:`bridges/requirements.txt`
两套桥接程序
- `GET /health`
- `POST /process-audio`(兼容 `docs/ai-bridge-api.md`)
请求中的 `audioBase64`(来自 ESP32 上传)会被解码为 PCM16。桥接程序尝试采集电脑系统输出(loopback)并返回 `audioBase64`。
如果系统 loopback 采集失败,则回退为“原音回声”返回,保证链路不中断。
1) Windows 桥接程序
# 运行依赖
- Python 3.10+
- `ffmpeg` 与 `ffplay`(加入 PATH)
- 推荐使用 dshow 的 `virtual-audio-capturer` 作为系统回采设备
#安装与启动
```bash
cd bridges
pip install -r requirements.txt
uvicorn windows.bridge_windows:app --host 0.0.0.0 --port 9091
```
# 环境变量
- `WINDOWS_LOOPBACK_DEVICE`:默认 `virtual-audio-capturer`
- `RESPONSE_CAPTURE_MS`:默认 `350`
- `PLAY_INPUT_AUDIO`:默认 `0`(设为 `1` 时会先本地播放输入音频)
- `FFMPEG_BIN`、`FFPLAY_BIN`:可覆盖可执行路径
## 2) macOS 桥接程序
### 运行依赖
- Python 3.10+
- `ffmpeg` 与 `ffplay`(建议 `brew install ffmpeg`)
- 建议安装 BlackHole 或 Loopback 作为虚拟声卡
### 安装与启动
```bash
cd bridges
pip install -r requirements.txt
uvicorn macos.bridge_macos:app --host 0.0.0.0 --port 9092
```
### 环境变量
- `MACOS_AVFOUNDATION_INPUT`:默认 `:0`(请改为虚拟回采输入)
- `RESPONSE_CAPTURE_MS`:默认 `350`
- `PLAY_INPUT_AUDIO`:默认 `0`
- `FFMPEG_BIN`、`FFPLAY_BIN`:可覆盖可执行路径
## 3) 服务端接入
你的主服务端通过 `AI_BRIDGE_ENDPOINT` 指向对应桥接程序:
- Windows 机器上运行时:`AI_BRIDGE_ENDPOINT=http://127.0.0.1:9091/process-audio`
- macOS 机器上运行时:`AI_BRIDGE_ENDPOINT=http://127.0.0.1:9092/process-audio`
## 4) 排错
- `UNSUPPORTED_CODEC`:确认上游发送 `pcm16`。
- 无声音回传:检查 loopback 设备名是否正确。
- ffmpeg 找不到设备:先执行设备枚举命令核对索引/名称:
- Windows: `ffmpeg -list_devices true -f dshow -i dummy`
- macOS: `ffmpeg -f avfoundation -list_devices true -i ""`说明和环境:
### Arduino IDE (Sketch) 烧录
1. 安装 Arduino IDE,并在 Board Manager 安装 `esp32 by Espressif Systems`。
2. 在 Library Manager 安装:
- `WebSockets` (by Markus Sattler / Links2004)
- `ArduinoJson` (by Benoit Blanchon)
3. 打开 Sketch:`firmware/esp32-s3/arduino-sketch/esp32_s3_audio_node/esp32_s3_audio_node.ino`
4. 修改文件顶部配置:
- `WIFI_SSID`, `WIFI_PASSWORD`
- `WS_HOST`, `WS_PORT`, `WS_PATH`
- `DEVICE_ID`
- I2S 引脚:`MIC_I2S_*` 与 `SPK_I2S_*`
5. 规定板型:`ESP32-S3-Zero`
- Arduino IDE 中可选 `ESP32S3 Dev Module`,并按 ESP32-S3-Zero 接线烧录。
6. 打开 Serial Monitor(115200)观察连接日志。
Note:
- Current audio capture/playback code is scaffold-level and uses placeholders.
- Sketch 版本已接入 `INMP441 + MAX98357A` 的 I2S 采集/播放。
- 当前默认目标板为 `ESP32-S3-Zero`,默认引脚:
- INMP441: `SCK=4`, `WS=5`, `SD=6`
- MAX98357A: `BCLK=7`, `LRC=15`, `DIN=16`
- 改用其他开发板,再按实际改 `esp32_s3_audio_node.ino`
- INMP441 的 `L/R` 管脚建议固定为 `GND`(左声道),与代码里的 `I2S_CHANNEL_FMT_ONLY_LEFT` 对应。
## Quick Start (Server)
1. `cd server`
2. `npm install`
3. `npm run dev`
4. Open `http://localhost:8090`
### 音频存档(可下载)
- 存档目录:`server/audio
- 存档格式:`WAV (G.711 mu-law)
- 文件命名:`<deviceId>__ts<timestamp>__seq<seq>__winner-<winner>.wav
- 查询接口:`GET /api/archive(返回 downloadPath字段)
- 下载路径:`GET /audio/<fileName>