SpeechRecognition/BATCH_USAGE.md

6.4 KiB
Raw Blame History

并发批量处理使用指南

功能特性

运行时自动清空 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.pymain() 函数:

# 固定并发数为 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