corax

封面

该系统使用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>