6.4 KiB
6.4 KiB
并发批量处理使用指南
功能特性
✅ 运行时自动清空 temp 目录 ✅ 并发批处理 - 根据 GPU 显存/CPU 核心数自动调整并发数 ✅ 预提取 WAV - 每个视频在处理前提取音频到 temp ✅ 结果合并 - 使用 map_speaker 合并 ASR 和说话人分离结果 ✅ 独立输出 - 每个视频结果分别存入 output 目录
使用方法
1. 配置视频文件夹
编辑 main.py 中的 VIDEO_FOLDER 变量:
# 视频文件夹路径(全局变量)
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. 运行批处理
# 激活虚拟环境
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
{
"total_sentences": 50,
"sentences": [
{
"speaker": "speaker_0",
"text": "你好,请问这里是哪里?",
"begin_time": 0.50,
"end_time": 2.30,
"duration": 1.80
}
]
}
汇总报告
output/batch_summary.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() 函数:
# 固定并发数为 2
results = process_batch_concurrent(video_paths, max_workers=2)
修改说话人分离参数
编辑 process_single_video() 函数:
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() 函数:
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