95 lines
4.6 KiB
Markdown
95 lines
4.6 KiB
Markdown
# voice_drone_assistant
|
||
|
||
从原仓库抽离的**独立可运行**子工程:麦克风采集 → VAD 切段 → **SenseVoice STT** → **唤醒词** →(关键词起飞 / **Qwen + Kokoro 对话播报**)。
|
||
|
||
**部署与外场启动(推荐先读):[docs/DEPLOYMENT_AND_OPERATIONS.md](docs/DEPLOYMENT_AND_OPERATIONS.md)**
|
||
**日常配置索引:[docs/PROJECT_GUIDE.md](docs/PROJECT_GUIDE.md)** · 云端协议:[docs/llmcon.md](docs/llmcon.md)
|
||
|
||
## 目录结构
|
||
|
||
| 路径 | 说明 |
|
||
|------|------|
|
||
| `main.py` | 启动入口 |
|
||
| `with_system_alsa.sh` | Conda 下建议包一层启动,修正 ALSA/PortAudio |
|
||
| `voice_drone/core/` | 音频、VAD、STT、TTS、预处理、唤醒、配置、识别器主流程 |
|
||
| `voice_drone/main_app.py` | 唤醒流程 + LLM 流式 + 起飞脚本联动(原 `rocket_drone_audio.py`) |
|
||
| `voice_drone/config/` | `system.yaml`、`wake_word.yaml`、`keywords.yaml`、`command_.yaml` |
|
||
| `voice_drone/logging_/` | 彩色日志 |
|
||
| `voice_drone/tools/` | YAML 加载等 |
|
||
| `scripts/` | PX4 offboard、`generate_wake_greeting_wav.py` |
|
||
| `assets/tts_cache/` | 唤醒问候 WAV 缓存 |
|
||
| `models/` | **需自备或软链**,见 `models/README.txt` |
|
||
|
||
## 环境准备
|
||
|
||
1. Python 3.10+(与原项目一致即可),安装依赖:
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
2. 模型:将 STT / TTS /(可选)Silero VAD 放到 `models/`,或按 `models/README.txt` 从原仓库 `src/models` 创建符号链接。
|
||
|
||
3. 大模型:默认查找 `cache/qwen25-1.5b-gguf/qwen2.5-1.5b-instruct-q4_k_m.gguf`,或通过环境变量 `ROCKET_LLM_GGUF` 指定 GGUF 路径。
|
||
|
||
## 运行
|
||
|
||
在 **`voice_drone_assistant` 根目录** 执行:
|
||
|
||
```bash
|
||
bash with_system_alsa.sh python main.py
|
||
```
|
||
|
||
常用参数与环境变量与原 `rocket_drone_audio.py` 相同(如 `ROCKET_LLM_STREAM`、`ROCKET_INPUT_DEVICE_INDEX`、`--input-index`、`ROCKET_ENERGY_VAD` 等),说明见 `voice_drone/main_app.py` 文件头注释。
|
||
|
||
也可直接跑模块:
|
||
|
||
```bash
|
||
bash with_system_alsa.sh python -m voice_drone.main_app
|
||
```
|
||
|
||
## 为什么不默认带上原仓库的 models?
|
||
|
||
- **ONNX / GGUF 体积大**(动辄数百 MB~数 GB),放进 Git 或重复拷贝会加重仓库和同步成本。
|
||
- 抽离时只保证 **代码与配置自给**;权重文件用 **本机拷贝 / U 盘 / 另一台预先 `bundle`** 更灵活。
|
||
|
||
若你本机仍摆着原仓库 `rocket_drone_audio`,且 `voice_drone_assistant` 在其子目录下,代码里有个**临时便利**:`models/...` 找不到时会尝试 **上一级 `src/models/...`**,所以在开发机上可以不改目录也能跑。
|
||
**这只在「子目录 + 上层仍有原仓库」时有效**,把 `voice_drone_assistant` **单独拷到另一台香橙派后,上层没有原仓库,必须在本目录自备 `models/`(和可选 `cache/`)**。
|
||
|
||
## 拷到另一台香橙派要做什么?
|
||
|
||
1. **整目录复制**(建议先在本机执行下面脚本打全模型,再打包 `voice_drone_assistant`):
|
||
|
||
```bash
|
||
cd /path/to/voice_drone_assistant
|
||
bash scripts/bundle_for_device.sh /path/to/rocket_drone_audio
|
||
```
|
||
|
||
会把 `SenseVoiceSmall`、`Kokoro-82M-v1.1-zh-ONNX`(及存在的 `SileroVad`)复制到本目录 `models/`;可按提示选择是否复制 Qwen GGUF。
|
||
|
||
2. **新机器上 Python 依赖**:另一台是**全新系统**时,需要再装一次(或整体迁移同一个 conda/env):
|
||
|
||
```bash
|
||
cd voice_drone_assistant
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
二进制/系统库层面若仍用 conda + PortAudio,建议继续 **`bash with_system_alsa.sh python main.py`**。
|
||
|
||
3. **大模型路径**:若未打包 `cache/`,在新机器设环境变量或放入默认路径,例如:
|
||
|
||
```bash
|
||
export ROCKET_LLM_GGUF=/path/to/qwen2.5-1.5b-instruct-q4_k_m.gguf
|
||
```
|
||
|
||
综上:**工程可独立**,但必须带上 **`models/` + 已装依赖 +(可选)GGUF**;**`pip install` 每台新环境通常要做一次**,除非你把整个 conda env 目录一起迁移。
|
||
|
||
## 与原仓库关系
|
||
|
||
- 本目录为**代码与配置的复制 + 包名调整**(`src.*` → `voice_drone.*`),默认不把大体积 `models/`、`cache/` 放进版本库。
|
||
- 原仓库 `rocket_drone_audio` 仍可继续使用;开发阶段两者可并存,部署到单机时只带走 `voice_drone_assistant`(+ `bundle` 后的模型)即可。
|
||
|
||
## 未纳入本工程的模块
|
||
|
||
PX4 电机演示、独立录音脚本、Socket 试飞控协议服务端、ChatTTS 转换脚本等均留在原仓库,以减小篇幅;本工程仍通过 `SocketClient` 预留配置项(`TakeoffPrintRecognizer` 使用 `auto_connect_socket=False`,不依赖外置试飞控 Socket)。
|