# 并发批量处理使用指南 ## 功能特性 ✅ **运行时自动清空 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 ```