281 lines
6.4 KiB
Markdown
281 lines
6.4 KiB
Markdown
# 并发批量处理使用指南
|
||
|
||
## 功能特性
|
||
|
||
✅ **运行时自动清空 temp 目录**
|
||
✅ **并发批处理** - 根据 GPU 显存/CPU 核心数自动调整并发数
|
||
✅ **预提取 WAV** - 每个视频在处理前提取音频到 temp
|
||
✅ **结果合并** - 使用 map_speaker 合并 ASR 和说话人分离结果
|
||
✅ **独立输出** - 每个视频结果分别存入 output 目录
|
||
|
||
## 使用方法
|
||
|
||
### 1. 配置视频文件夹
|
||
|
||
编辑 `main.py` 中的 `VIDEO_FOLDER` 变量:
|
||
|
||
```python
|
||
# 视频文件夹路径(全局变量)
|
||
VIDEO_FOLDER = r"D:\Userfile\Projects\AnzezxianxHazardInspectAI\Code\audio"
|
||
```
|
||
|
||
**程序会自动:**
|
||
- ✅ 扫描文件夹中的所有视频文件
|
||
- ✅ 支持格式:mp4, avi, mkv, mov, flv, wmv, m4v
|
||
- ✅ 按文件名自动排序(时间戳格式的文件名会按时间顺序排列)
|
||
|
||
**文件名格式示例:**
|
||
```
|
||
VID_20251031_132320_019.mp4 → 2025-10-31 13:23:20
|
||
VID_20251031_140530_020.mp4 → 2025-10-31 14:05:30
|
||
VID_20251101_090000_021.mp4 → 2025-11-01 09:00:00
|
||
```
|
||
|
||
### 2. 运行批处理
|
||
|
||
```bash
|
||
# 激活虚拟环境
|
||
funasr_env\Scripts\activate
|
||
|
||
# 运行批处理
|
||
python main.py
|
||
```
|
||
|
||
## 工作流程
|
||
|
||
```
|
||
开始
|
||
↓
|
||
清空 temp/ 目录
|
||
↓
|
||
创建 output/ 目录
|
||
↓
|
||
并发处理每个视频:
|
||
1. 提取 WAV 到 temp/
|
||
2. 加载 ASR 模型
|
||
3. 执行语音识别
|
||
4. 加载说话人分离模型
|
||
5. 执行说话人分离
|
||
6. 合并结果(map_speaker)
|
||
7. 保存结果到 output/
|
||
8. 清理临时 WAV
|
||
↓
|
||
生成汇总报告 output/batch_summary.json
|
||
↓
|
||
清空 temp/ 目录
|
||
↓
|
||
完成
|
||
```
|
||
|
||
## 输出文件
|
||
|
||
### 单个视频结果
|
||
|
||
`output/{video_name}_result.json`
|
||
|
||
```json
|
||
{
|
||
"total_sentences": 50,
|
||
"sentences": [
|
||
{
|
||
"speaker": "speaker_0",
|
||
"text": "你好,请问这里是哪里?",
|
||
"begin_time": 0.50,
|
||
"end_time": 2.30,
|
||
"duration": 1.80
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 汇总报告
|
||
|
||
`output/batch_summary.json`
|
||
|
||
```json
|
||
{
|
||
"total_videos": 3,
|
||
"success_count": 3,
|
||
"failed_count": 0,
|
||
"total_time_seconds": 245.67,
|
||
"results": [
|
||
{
|
||
"video": "VID_20251031_132320_019.mp4",
|
||
"success": true,
|
||
"output": "output/VID_20251031_132320_019_result.json",
|
||
"total_sentences": 50,
|
||
"speaker_counts": {
|
||
"speaker_0": 25,
|
||
"speaker_1": 25
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 并发策略
|
||
|
||
### GPU 模式
|
||
- 根据显存自动调整并发数
|
||
- 每个视频约需 2-3GB 显存
|
||
- 公式:`并发数 = max(1, 显存总量 / 3GB)`
|
||
|
||
### CPU 模式
|
||
- 使用 CPU 核心数作为并发数
|
||
- 使用 `multiprocessing.cpu_count()` 获取
|
||
|
||
## 性能优化建议
|
||
|
||
### 1. GPU 用户
|
||
- 确保安装 CUDA 版本 PyTorch
|
||
- 8GB 显存:建议并发 2-3
|
||
- 12GB 显存:建议并发 4
|
||
- 24GB 显存:建议并发 8
|
||
|
||
### 2. CPU 用户
|
||
- 减少并发数避免内存不足
|
||
- 建议:`并发数 = CPU 核心数 / 2`
|
||
|
||
### 3. 内存优化
|
||
每个进程约需:
|
||
- ASR 模型:2-3GB
|
||
- 说话人分离模型:1-2GB
|
||
- 总计:3-5GB/进程
|
||
|
||
确保系统内存充足:`并发数 × 5GB < 可用内存`
|
||
|
||
## 自定义配置
|
||
|
||
### 调整并发数
|
||
|
||
编辑 `main.py` 的 `main()` 函数:
|
||
|
||
```python
|
||
# 固定并发数为 2
|
||
results = process_batch_concurrent(video_paths, max_workers=2)
|
||
```
|
||
|
||
### 修改说话人分离参数
|
||
|
||
编辑 `process_single_video()` 函数:
|
||
|
||
```python
|
||
diar_service = DiarizationService(
|
||
embedding_model="eres2netv2", # campplus/eres2net/eres2netv2
|
||
device="auto",
|
||
cluster_threshold=0.5, # 0.0-1.0,越高越严格
|
||
min_cluster_size=10 # 每个说话人最少片段数
|
||
)
|
||
```
|
||
|
||
### 修改 ASR 模型
|
||
|
||
编辑 `process_single_video()` 函数:
|
||
|
||
```python
|
||
asr_service = ASRService(
|
||
model_name="paraformer-zh", # 或 "SenseVoice"
|
||
device="auto"
|
||
)
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
### Q: 如何添加更多视频?
|
||
|
||
**A:** 只需将视频文件放入 `VIDEO_FOLDER` 指定的文件夹即可,程序会自动扫描。
|
||
|
||
### Q: 如何跳过某些视频?
|
||
|
||
**A:** 将这些视频移到其他文件夹,或修改 `SUPPORTED_VIDEO_FORMATS` 排除特定格式。
|
||
|
||
### Q: 处理中断了怎么办?
|
||
|
||
**A:** 重新运行即可,会自动清空 temp 目录,已完成的视频不会重复处理。
|
||
|
||
### Q: 如何查看处理进度?
|
||
|
||
**A:** 控制台会实时显示:
|
||
- 每个视频的处理状态
|
||
- 进度百分比
|
||
- 预计剩余时间
|
||
- 最终汇总报告
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
audio2/
|
||
├── main.py # 主程序
|
||
├── asr_service.py # ASR 服务
|
||
├── diarization_service.py # 说话人分离服务
|
||
├── map_speaker.py # 结果合并逻辑
|
||
├── temp/ # 临时目录(运行时清空)
|
||
└── output/ # 输出目录
|
||
├── video1_result.json
|
||
├── video2_result.json
|
||
└── batch_summary.json
|
||
```
|
||
|
||
## 依赖要求
|
||
|
||
- Python 3.10+
|
||
- FunASR 1.3+
|
||
- PyTorch 2.0+
|
||
- ffmpeg(用于提取音频)
|
||
- 3D-Speaker(说话人分离)
|
||
|
||
## 运行示例
|
||
|
||
```
|
||
============================================================
|
||
并发批量语音识别处理系统
|
||
============================================================
|
||
|
||
============================================================
|
||
清空临时目录...
|
||
============================================================
|
||
✓ 已删除:D:\...\audio2\temp
|
||
✓ 已创建:D:\...\audio2\temp
|
||
|
||
✓ 输出目录:D:\...\audio2\output
|
||
|
||
找到 1 个视频文件
|
||
- VID_20251031_132320_019.mp4
|
||
|
||
============================================================
|
||
并发批处理配置
|
||
============================================================
|
||
视频数量:1
|
||
最大并发:2
|
||
CPU 核心数:8
|
||
GPU: NVIDIA GeForce RTX 3060
|
||
|
||
[VID_20251031_132320_019.mp4] 加载 ASR 模型...
|
||
[VID_20251031_132320_019.mp4] 执行语音识别...
|
||
[VID_20251031_132320_019.mp4] 加载说话人分离模型...
|
||
[VID_20251031_132320_019.mp4] 执行说话人分离...
|
||
[VID_20251031_132320_019.mp4] 合并结果...
|
||
[VID_20251031_132320_019.mp4] ✓ 处理完成
|
||
- 句子数:50
|
||
- 说话人:{'speaker_0': 25, 'speaker_1': 25}
|
||
|
||
============================================================
|
||
处理完成汇总
|
||
============================================================
|
||
总耗时:123.4s
|
||
平均每个视频:123.4s
|
||
成功:1/1
|
||
失败:0
|
||
|
||
汇总报告:output\batch_summary.json
|
||
============================================================
|
||
|
||
清理临时文件...
|
||
============================================================
|
||
清空临时目录...
|
||
============================================================
|
||
|
||
✓ 全部完成!
|
||
输出目录:D:\...\audio2\output
|
||
```
|