Skip to content

Commit 0bb5021

Browse files
committed
bugfix: real-time speech recognition module that caused missing words and update readme
1 parent f929b6e commit 0bb5021

4 files changed

Lines changed: 340 additions & 284 deletions

File tree

README-CN.md

Lines changed: 133 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ RapidSpeech.cpp 并非"单模型推理工具",而是一套面向真实业务
6464
基于 `ggml` 的高性能计算后端,支持从 INT4 到 FP32 的混合精度推理。
6565

6666
- **架构层(Architecture Layer)**
67-
插件式模型构建与加载机制,规划支持 FunASR-nano、CosyVoice、Qwen3-TTS 等主流模型体系。
67+
插件式模型构建与加载机制,支持 FunASR-nano、CosyVoice、Qwen3-TTS 等主流模型体系。
6868

6969
- **业务逻辑层(Business Logic)**
7070
内置环形缓冲区、VAD(端点检测)、文本前端(如音素化)以及多会话并发管理能力。
@@ -73,26 +73,24 @@ RapidSpeech.cpp 并非"单模型推理工具",而是一套面向真实业务
7373

7474
## 🚀 核心特性
7575

76-
- **极致量化支持**:原生支持 4-bit / 5-bit / 6-bit 量化方案,充分适配不同算力与带宽条件的硬件。
77-
- **零依赖部署**:纯 C/C++ 实现,最终产物为单一、轻量级二进制文件。
78-
- **GPU / NPU 加速**:针对语音模型特点,对 CUDA 与 Metal 后端进行定制化优化。
79-
- **统一模型格式**:ASR 与 TTS 统一采用扩展后的 **GGUF** 模型格式。
80-
- **Python 绑定**:通过 pybind11 提供 Python 接口,支持 pip 安装,一行代码即可调用
76+
- [x] **极致量化支持**:原生支持 4-bit / 5-bit / 6-bit 量化方案,充分适配不同算力与带宽条件的硬件。
77+
- [x] **零依赖部署**:纯 C/C++ 实现,最终产物为单一、轻量级二进制文件。
78+
- [x] **GPU / NPU 加速**:针对语音模型特点,对 CUDA 与 Metal 后端进行定制化优化。
79+
- [x] **统一模型格式**:ASR 与 TTS 统一采用扩展后的 **GGUF** 模型格式。
80+
- [x] **Python 绑定**:通过 pybind11 提供 Python API,支持 `pip install` 一键安装
8181

8282
------
8383

8484
## 🛠️ 快速开始
8585

8686
### 模型下载
8787

88-
请从以下平台下载对应模型的 GGUF 格式文件
88+
请从以下平台下载对应模型
8989

9090
- 🤗 Hugging Face:https://huggingface.co/RapidAI/RapidSpeech
9191
- ModelScope:https://www.modelscope.cn/models/RapidAI/RapidSpeech
9292

93-
### C++ 构建
94-
95-
#### 基本构建(仅 CPU)
93+
### 从源码构建
9694

9795
```bash
9896
git clone https://github.com/RapidAI/RapidSpeech.cpp
@@ -102,217 +100,213 @@ cmake -B build
102100
cmake --build build --config Release
103101
```
104102

105-
#### 启用 GPU 加速
103+
构建产物位于 `build/` 目录:
104+
- `rs-asr-offline` — 离线 ASR 命令行工具
105+
- `rs-asr-online` — 在线(流式)ASR 命令行工具
106+
- `rs-quantize` — 模型量化工具
107+
108+
### C++ 命令行使用
106109

107-
<details>
108-
<summary>🍎 macOS Metal(默认启用)</summary>
110+
#### 离线识别(rs-asr-offline)
109111

110-
macOS 平台默认启用 Metal 加速,无需额外配置:
112+
**基础用法 — 不使用 VAD:**
111113

112114
```bash
113-
cmake -B build
114-
cmake --build build --config Release
115+
./build/rs-asr-offline \
116+
-m /path/to/funasr-nano-fp16.gguf \
117+
-w /path/to/audio.wav \
118+
-t 4 \
119+
--gpu true
115120
```
116121

117-
</details>
118-
119-
<details>
120-
<summary>🖥️ NVIDIA CUDA</summary>
122+
**使用 VAD 分段(推荐,适合长音频):**
121123

122124
```bash
123-
cmake -B build -DRS_CUDA=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc
124-
cmake --build build --config Release
125+
./build/rs-asr-offline \
126+
-m /path/to/funasr-nano-fp16.gguf \
127+
-v /path/to/silero_vad_v6.gguf \
128+
-w /path/to/audio.wav \
129+
-t 4 \
130+
--vad-threshold 0.5 \
131+
--silence-ms 600
125132
```
126133

127-
</details>
134+
指定 VAD 模型后,工具会自动按语音活动分段,并输出带时间戳的分段识别结果。
128135

129-
<details>
130-
<summary>🌋 Vulkan</summary>
136+
参数说明:
131137

132-
```bash
133-
cmake -B build -DRS_VULKAN=ON
134-
cmake --build build --config Release
135-
```
138+
| 参数 | 说明 | 默认值 |
139+
| --- | --- | --- |
140+
| `-m, --model` | GGUF 模型文件路径(必填) ||
141+
| `-w, --wav` | WAV 音频文件路径(16kHz,必填) ||
142+
| `-v, --vad` | Silero VAD GGUF 模型路径(可选,启用 VAD 分段) ||
143+
| `-t, --threads` | CPU 线程数 | 4 |
144+
| `--gpu` | 是否启用 GPU 加速(`true`/`false`| true |
145+
| `--vad-threshold` | VAD 语音检测阈值(0~1,越低越灵敏) | 0.5 |
146+
| `--silence-ms` | 静默时长超过该值则切分段落(ms) | 600 |
147+
| `--max-segment-s` | ASR 输入的最大分段长度(秒) | 30.0 |
136148

137-
</details>
149+
#### 在线/流式识别(rs-asr-online)
138150

139-
<details>
140-
<summary>⚡ 华为 CANN(Ascend NPU)</summary>
151+
**WAV 文件(模拟流式):**
141152

142153
```bash
143-
cmake -B build -DRS_CANN=ON
144-
cmake --build build --config Release
154+
./build/rs-asr-online \
155+
-m /path/to/funasr-nano-fp16.gguf \
156+
-v /path/to/silero_vad_v6.gguf \
157+
-w /path/to/audio.wav \
158+
-t 4 \
159+
--vad-threshold 0.5 \
160+
--silence-ms 600
145161
```
146162

147-
</details>
163+
**麦克风实时识别:**
148164

149-
### C++ 命令行使用
165+
```bash
166+
./build/rs-asr-online \
167+
-m /path/to/funasr-nano-fp16.gguf \
168+
-v /path/to/silero_vad_v6.gguf \
169+
--mic \
170+
-t 4
171+
```
150172

151-
构建完成后,使用 `rs-asr-offline` 进行离线语音识别:
173+
**两遍模式(CTC 快速解码 + LLM 重打分,仅 FunASR-Nano 支持):**
152174

153175
```bash
154-
# 基本用法
155-
./build/rs-asr-offline \
156-
-m /path/to/model.gguf \
157-
-w /path/to/audio.wav
158-
159-
# 指定线程数和 GPU
160-
./build/rs-asr-offline \
161-
-m /path/to/model.gguf \
176+
./build/rs-asr-online \
177+
-m /path/to/funasr-nano-fp16.gguf \
178+
-v /path/to/silero_vad_v6.gguf \
162179
-w /path/to/audio.wav \
163-
-t 8 \
164-
--gpu 1
180+
--two-pass
181+
```
182+
183+
参数说明:
184+
185+
| 参数 | 说明 | 默认值 |
186+
| --- | --- | --- |
187+
| `-m, --model` | ASR GGUF 模型文件路径(必填) ||
188+
| `-v, --vad` | Silero VAD 模型文件路径(必填) ||
189+
| `-w, --wav` | WAV 音频文件路径(16kHz) ||
190+
| `--mic` | 使用麦克风输入(实时模式) | 关闭 |
191+
| `--mic-device` | 麦克风设备索引 | 自动 |
192+
| `--mic-chunk-ms` | 麦克风读取块大小(ms) | 32 |
193+
| `-t, --threads` | CPU 线程数 | 4 |
194+
| `--gpu` | 是否启用 GPU 加速(`true`/`false`| true |
195+
| `--vad-threshold` | VAD 语音检测阈值(0~1,越低越灵敏) | 0.5 |
196+
| `--silence-ms` | 静默超时切分时长(ms) | 600 |
197+
| `--two-pass` | 启用两遍模式:CTC 解码 + LLM 重打分 | 关闭 |
198+
199+
#### 模型量化(rs-quantize)
200+
201+
```bash
202+
./build/rs-quantize /path/to/funasr-nano-fp16.gguf /path/to/output-q4_k.gguf q4_k
165203
```
166204

167-
**命令行参数:**
205+
支持的量化类型:`q4_0`, `q4_k`, `q4_k_m`, `q5_0`, `q5_k`, `q8_0`, `f16`, `f32`
168206

169-
| 参数 | 说明 | 默认值 |
170-
| --- |----------------------------|-----|
171-
| `-m, --model` | 模型文件路径(必选) | - |
172-
| `-w, --wav` | WAV 音频文件路径(可选,不提供则使用测试正弦波) | - |
173-
| `-t, --threads` | CPU 线程数 | 4 |
174-
| `--gpu` | 是否启用 GPU 加速(`0`/`1`| 1 |
175-
| `-h, --help` | 显示帮助信息 | - |
207+
> ⚠️ **量化注意**:Q2_K 量化对 FunASR Nano 精度损失过大,会导致输出乱码,不推荐使用。推荐使用q4_k_m或q8
176208
177209
### Python 使用
178210

179211
#### 安装
180212

181-
**方式一:pip 安装(推荐)**
182-
183213
```bash
184-
# CPU 版本
214+
# 从 PyPI 安装(CPU 版本
185215
pip install rapidspeech
186216

187217
# CUDA 版本
188218
pip install rapidspeech-cuda
189219

190-
# Metal 版本(macOS)
220+
# macOS Metal 版本
191221
pip install rapidspeech-metal
192222
```
193223

194-
**方式二:从源码构建**
224+
#### 从源码构建 Python 包
195225

196226
```bash
197-
git clone https://github.com/RapidAI/RapidSpeech.cpp
198-
cd RapidSpeech.cpp
199-
git submodule sync && git submodule update --init --recursive
200-
201-
# 构建 Python 绑定
202227
pip install .
203-
204-
# 或指定 CUDA 后端
228+
# 或指定后端
205229
RS_BACKEND=cuda pip install .
206230
```
207231

208-
#### Python API 使用示例
232+
#### Python API
209233

210234
```python
211-
import numpy as np
212235
import rapidspeech
236+
import numpy as np
213237

214-
# 1. 初始化 ASR 离线识别器
215-
asr = rapidspeech.asr_offline(
216-
model_path="/path/to/model.gguf",
238+
# 初始化 ASR 上下文
239+
ctx = rapidspeech.asr_offline(
240+
model_path="funasr-nano-fp16.gguf",
217241
n_threads=4,
218242
use_gpu=True
219243
)
220244

221-
# 2. 读取音频数据(float32, 16kHz, 单声道)
222-
# pcm 为 numpy float32 数组,值域 [-1.0, 1.0]
223-
pcm = load_wav("audio.wav") # 自行实现 WAV 读取,或使用 soundfile / scipy.io.wavfile
224-
225-
# 3. 推送音频数据
226-
asr.push_audio(pcm)
245+
# 读取 WAV 音频(16kHz, float32, 单声道)
246+
pcm = ... # np.ndarray, shape=[N], dtype=float32
227247

228-
# 4. 执行推理
229-
asr.process()
248+
# 推送音频并识别
249+
ctx.push_audio(pcm)
250+
ctx.process()
230251

231-
# 5. 获取识别结果
232-
text = asr.get_text()
252+
# 获取识别结果
253+
text = ctx.get_text()
233254
print(f"识别结果: {text}")
234255
```
235256

236-
**完整的离线识别示例脚本**可参考 [`python-api-examples/asr/asr-offline.py`](./python-api-examples/asr/asr-offline.py)
237-
238-
运行示例:
257+
完整示例参见 [python-api-examples/asr/asr-offline.py](python-api-examples/asr/asr-offline.py)
239258

240-
```bash
241-
python python-api-examples/asr/asr-offline.py \
242-
--model /path/to/model.gguf \
243-
--audio /path/to/audio.wav \
244-
--threads 4 \
245-
--gpu 1
246-
```
259+
------
247260

248-
#### Python API 参考
261+
## 📊 性能基准
249262

250-
| 类/方法 | 说明 |
251-
| --- | --- |
252-
| `rapidspeech.asr_offline(model_path, n_threads=4, use_gpu=True)` | 创建离线 ASR 识别器 |
253-
| `asr.push_audio(pcm)` | 推送 float32 音频数据(numpy 一维数组) |
254-
| `asr.process()` | 执行推理,返回状态码(0=无输出, 1=有输出, -1=错误) |
255-
| `asr.get_text()` | 获取识别文本结果 |
263+
测试环境:Apple M1 Pro, funasr-nano-fp16.gguf, 15s 音频
256264

257-
### C API 参考
265+
| 配置 | RTF | 耗时 | 备注 |
266+
|------|-----|------|------|
267+
| CPU -t 4 | 0.465 | 12.4s | 纯 CPU 推理 |
268+
| GPU -t 4 | 0.170 | 5.2s | Metal 加速 |
269+
| GPU -t 4 Q4_K | 0.756 || 量化模型在 GPU 上反量化开销增大 |
270+
| CPU -t 4 Q4_K | 0.530 || 量化模型 CPU 推理,模型体积 596MB(压缩 3.3x) |
258271

259-
RapidSpeech 提供 C 语言接口,便于集成到其他语言和项目中。核心接口如下:
272+
> RTF(Real-Time Factor)= 处理时间 / 音频时长,越低越快。RTF < 1 表示快于实时。
260273
261-
```c
262-
#include "rapidspeech.h"
274+
------
263275

264-
// 初始化
265-
rs_init_params_t params = rs_default_params();
266-
params.model_path = "/path/to/model.gguf";
267-
params.n_threads = 4;
268-
params.use_gpu = true;
269-
rs_context_t* ctx = rs_init_from_file(params);
276+
## 🔧 模型格式转换
270277

271-
// 推送音频并推理
272-
rs_push_audio(ctx, pcm_data, num_samples);
273-
int32_t status = rs_process(ctx);
278+
### ASR 模型(HF → GGUF)
274279

275-
// 获取结果
276-
const char* text = rs_get_text_output(ctx);
280+
提供 HF 模型到 GGUF 格式的转换工具:
277281

278-
// 释放资源
279-
rs_free(ctx);
282+
```bash
283+
python scripts/convert_hf_to_gguf.py \
284+
--model /path/to/hf-model-dir \
285+
--outfile /path/to/output.gguf \
286+
--outtype f16
280287
```
281288

289+
### Silero VAD 模型(safetensors → GGUF)
282290

283-
------
284-
285-
## 🔧 开发与构建选项
286-
287-
### CMake 选项
288-
289-
| 选项 | 说明 | 默认值 |
290-
| --- | --- | --- |
291-
| `RS_BUILD_TESTS` | 构建测试可执行文件 | ON |
292-
| `RS_CUDA` | 启用 CUDA 加速 | OFF |
293-
| `RS_METAL` | 启用 Metal 加速(仅 macOS) | 自动检测 |
294-
| `RS_VULKAN` | 启用 Vulkan 加速 | OFF |
295-
| `RS_CANN` | 启用华为 CANN 加速 | OFF |
296-
| `RS_OPENCL` | 启用 OpenCL 加速 | OFF |
297-
| `RS_ENABLE_PYTHON` | 启用 Python 绑定(pybind11) | OFF |
298-
299-
### 模型转换
300-
301-
使用项目提供的脚本将 Hugging Face 模型转换为 GGUF 格式:
291+
用于 `rs-asr-online` 或离线 VAD 分段的 Silero VAD 模型转换:
302292

303293
```bash
304-
python scripts/convert_hf_to_gguf.py --model /path/to/hf-model --output /path/to/output.gguf
294+
python scripts/convert_silero_to_gguf.py \
295+
--model /path/to/silero_vad_16k.safetensors \
296+
--output /path/to/silero_vad_v6.gguf
305297
```
306298

299+
转换后的 VAD 模型也可直接从 [HuggingFace](https://huggingface.co/RapidAI/RapidSpeech)[ModelScope](https://www.modelscope.cn/models/RapidAI/RapidSpeech) 下载。
300+
307301
------
308302

309303
## 🤝 参与贡献
310304

311305
如果你对以下领域感兴趣,欢迎提交 PR 或参与讨论:
312306

313-
- 适配更多模型(Qwen3-ASR、CosyVoice3 等)
314-
- 完善项目框架与性能优化
315-
- 改进文档与示例
307+
- 适配更多模型
308+
- 完善项目框架。
309+
- 优化推理性能。
316310

317311
## 致谢
318312

0 commit comments

Comments
 (0)