230 lines
5.1 KiB
Markdown
230 lines
5.1 KiB
Markdown
# FunASR 语音识别服务
|
||
|
||
基于阿里达摩院 [FunASR](https://github.com/alibaba-damo-academy/FunASR) 的本地语音识别解决方案。
|
||
|
||
## 功能特性
|
||
|
||
| 功能 | 说明 |
|
||
|------|------|
|
||
| **句级时间戳** | 每句话的开始和结束时间 |
|
||
| **说话人分离** | 自动区分不同说话人 |
|
||
| **抗噪能力** | VAD 语音活动检测,过滤噪音 |
|
||
| **本地部署** | 完全离线运行,数据不上传云端 |
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
audio2/
|
||
├── funasr_env/ # 虚拟环境
|
||
├── models/ # 模型缓存目录
|
||
├── asr_service.py # 核心服务类
|
||
├── test_asr.py # 测试脚本
|
||
├── example_usage.py # 使用示例
|
||
├── run_asr.bat # Windows 运行脚本
|
||
├── fix_path_issue.bat # 路径修复脚本(推荐)
|
||
├── enable_long_path.ps1 # 启用长路径支持(管理员)
|
||
├── requirements.txt # 依赖列表
|
||
└── README.md # 本文档
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### Windows 用户注意 ⚠️
|
||
|
||
如果遇到 **"文件名或扩展名太长"** 错误,请使用以下方法之一:
|
||
|
||
#### 方法 1:使用 fix_path_issue.bat(推荐)
|
||
```bash
|
||
fix_path_issue.bat your_audio.wav
|
||
```
|
||
|
||
#### 方法 2:启用 Windows 长路径支持(永久解决)
|
||
1. 右键 PowerShell → 以管理员身份运行
|
||
2. 运行:`enable_long_path.ps1`
|
||
3. 重启电脑
|
||
|
||
### 1. 激活虚拟环境
|
||
|
||
```bash
|
||
# Windows CMD
|
||
funasr_env\Scripts\activate.bat
|
||
|
||
# Linux/Mac
|
||
source funasr_env/bin/activate
|
||
```
|
||
|
||
### 2. 安装依赖(如果未安装)
|
||
|
||
```bash
|
||
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
|
||
pip install funasr modelscope
|
||
```
|
||
|
||
### 3. 测试识别
|
||
|
||
```bash
|
||
# 方法 1:使用修复脚本(推荐 Windows 用户)
|
||
fix_path_issue.bat your_audio.wav
|
||
|
||
# 方法 2:直接运行
|
||
python test_asr.py -f your_audio.wav
|
||
|
||
# 批量识别目录
|
||
python test_asr.py -d ./audio_files/
|
||
|
||
# 使用 SenseVoice 模型(多语言)
|
||
python test_asr.py -f your_audio.wav -m SenseVoice
|
||
```
|
||
|
||
## 代码使用示例
|
||
|
||
### 基础识别
|
||
|
||
```python
|
||
from asr_service import ASRService
|
||
|
||
# 初始化服务
|
||
service = ASRService(model_name="paraformer-zh")
|
||
|
||
# 识别音频
|
||
sentences = service.recognize("meeting.wav")
|
||
|
||
# 打印结果
|
||
for sent in sentences:
|
||
print(f"[{sent.speaker}] {sent.text}")
|
||
print(f" 时间: {sent.begin_time:.2f}s - {sent.end_time:.2f}s")
|
||
```
|
||
|
||
### 导出结果
|
||
|
||
```python
|
||
# 导出为 JSON
|
||
service.export_to_json(sentences, "result.json")
|
||
|
||
# 导出为 SRT 字幕
|
||
service.export_to_srt(sentences, "result.srt")
|
||
```
|
||
|
||
## 输出格式
|
||
|
||
### JSON 格式
|
||
|
||
```json
|
||
{
|
||
"total_sentences": 3,
|
||
"sentences": [
|
||
{
|
||
"speaker": "SPEAKER_00",
|
||
"text": "大家好,今天的会议现在开始。",
|
||
"begin_time": 0.50,
|
||
"end_time": 3.20,
|
||
"duration": 2.70
|
||
},
|
||
{
|
||
"speaker": "SPEAKER_01",
|
||
"text": "好的,我先汇报一下进度。",
|
||
"begin_time": 3.50,
|
||
"end_time": 6.10,
|
||
"duration": 2.60
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### SRT 字幕格式
|
||
|
||
```srt
|
||
1
|
||
00:00:00,500 --> 00:00:03,200
|
||
[SPEAKER_00] 大家好,今天的会议现在开始。
|
||
|
||
2
|
||
00:00:03,500 --> 00:00:06,100
|
||
[SPEAKER_01] 好的,我先汇报一下进度。
|
||
```
|
||
|
||
## 支持的音频格式
|
||
|
||
- WAV
|
||
- MP3
|
||
- M4A
|
||
- FLAC
|
||
- OGG
|
||
- WMA
|
||
|
||
## 模型选择
|
||
|
||
| 模型 | 说明 | 适用场景 |
|
||
|------|------|----------|
|
||
| `paraformer-zh` | 达摩院中文模型(默认) | 中文语音识别,支持说话人分离 |
|
||
| `SenseVoice` | 多语言模型 | 多语言、方言、情感识别 |
|
||
|
||
## 硬件要求
|
||
|
||
| 配置 | 说明 |
|
||
|------|------|
|
||
| CPU | 支持,速度较慢 |
|
||
| GPU | 推荐,RTF < 0.01 |
|
||
| 内存 | 4GB+ |
|
||
| 显存 | 2GB+ (GPU 模式) |
|
||
| 磁盘 | 2GB+(模型缓存) |
|
||
|
||
## 模型下载
|
||
|
||
首次运行会自动从魔搭社区下载模型到 `models/` 目录:
|
||
- Paraformer: ~500MB
|
||
- VAD: ~100MB
|
||
- 说话人模型: ~100MB
|
||
|
||
模型下载来源:
|
||
- 魔搭社区:https://modelscope.cn
|
||
- 模型缓存:`./models/`(项目目录下)
|
||
|
||
## 常见问题
|
||
|
||
### Q: 文件名太长错误?
|
||
|
||
**A:** Windows 默认路径长度限制为 260 字符。解决方法:
|
||
1. 使用 `fix_path_issue.bat` 运行(已配置短路径)
|
||
2. 运行 `enable_long_path.ps1` 启用系统长路径支持(需管理员权限+重启)
|
||
|
||
### Q: 如何准备测试音频?
|
||
|
||
**A:**
|
||
- 自行录制会议/对话音频
|
||
- AISHELL 开源数据集:https://www.openslr.org/33/
|
||
|
||
### Q: 支持多人同时说话吗?
|
||
|
||
**A:** 支持。说话人分离模块会自动区分不同说话人。
|
||
|
||
### Q: 对噪音环境有什么优化?
|
||
|
||
**A:** 集成了 FSMN-VAD 语音活动检测,能有效过滤背景噪音。
|
||
|
||
### Q: 如何切换 CPU/GPU?
|
||
|
||
**A:**
|
||
```python
|
||
# CPU
|
||
service = ASRService(device="cpu")
|
||
|
||
# GPU
|
||
service = ASRService(device="cuda")
|
||
|
||
# 自动选择
|
||
service = ASRService(device="auto")
|
||
```
|
||
|
||
## 参考链接
|
||
|
||
- FunASR 官方仓库:https://github.com/alibaba-damo-academy/FunASR
|
||
- 魔搭社区:https://modelscope.cn
|
||
- PyTorch 安装:https://pytorch.org/get-started/locally/
|
||
|
||
## 许可证
|
||
|
||
本项目使用 Apache-2.0 许可证
|
||
|
||
## 运行
|
||
run.bat VID_20251031_132320_019_mono.wav |