FunASR实战教程:结合OCR实现音视频内容检索
1. 引言
1.1 学习目标
本文将带你从零开始,掌握如何使用FunASR实现音视频的自动语音识别(ASR),并进一步结合OCR 技术构建完整的多模态内容检索系统。通过本教程,你将能够:
- 部署并使用 FunASR WebUI 进行高效语音转文字
- 提取音视频中的语音文本与视觉字幕文本
- 构建统一的文本索引库,支持关键词搜索
- 实现“一句话定位到视频片段”的实用功能
该方案广泛适用于课程录像分析、会议纪要生成、媒体资产管理等场景。
1.2 前置知识
为顺利跟随本教程实践,请确保具备以下基础:
- 熟悉 Python 编程语言
- 了解基本命令行操作
- 对语音识别(ASR)和图像识别(OCR)有初步认知
- 拥有一台配备 GPU 的服务器或本地机器(推荐)
1.3 教程价值
当前大多数音视频检索仍依赖人工打标签,效率低下。本文提出的ASR + OCR 联合方案可自动化提取音视频中所有可读信息,构建高覆盖率的内容索引,显著提升检索准确率与处理速度。整个流程完全基于开源工具链,适合企业级轻量部署。
2. 环境准备与 FunASR 部署
2.1 系统要求
| 组件 | 推荐配置 |
|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 LTS |
| CPU | Intel i7 或同等性能以上 |
| 内存 | ≥ 16GB |
| 显卡 | NVIDIA GPU(显存 ≥ 8GB) |
| 存储 | ≥ 50GB 可用空间 |
2.2 安装依赖环境
# 创建虚拟环境 python3 -m venv funasr-env source funasr-env/bin/activate # 升级 pip pip install --upgrade pip # 安装 PyTorch(根据 CUDA 版本调整) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 FunASR 核心库 pip install modelscope funasr注意:若无 GPU 支持,可安装 CPU 版本 PyTorch,但识别速度会明显下降。
2.3 克隆并启动 WebUI
# 克隆科哥二次开发的 WebUI 项目 git clone https://github.com/kege/funasr-webui.git cd funasr-webui # 安装 WebUI 依赖 pip install -r requirements.txt # 启动服务 python app/main.py --port 7860 --device cuda启动成功后,访问http://<服务器IP>:7860即可进入图形界面。
3. 使用 FunASR 提取音频文本
3.1 上传音视频文件
在 WebUI 界面中:
- 点击“上传音频”按钮
- 选择
.mp4,.mkv,.wav等格式的音视频文件 - 系统会自动提取音频流用于识别
支持格式包括:WAV, MP3, M4A, FLAC, OGG, PCM。
3.2 配置识别参数
建议设置如下:
- 模型选择:Paraformer-Large(精度优先)
- 设备模式:CUDA(启用 GPU 加速)
- 语言检测:
auto(自动识别语种) - 启用 PUNC:✔ 开启标点恢复
- 输出时间戳:✔ 启用
3.3 执行识别并获取结果
点击“开始识别”,等待处理完成。识别完成后,可在三个标签页查看结果:
- 文本结果:纯净文本,便于后续处理
- 详细信息:包含每段话的时间戳和置信度
- 时间戳:精确到词级别的起止时间
示例输出:
[00:01:23.450 --> 00:01:26.780] 今天我们来讲解深度学习的基本原理。3.4 批量处理脚本(进阶)
对于大量文件,可通过 API 批量调用:
from funasr import AutoModel model = AutoModel( model="paraformer-zh", vad_model="fsmn-vad", punc_model="ct-punc" ) def transcribe_audio(file_path): res = model.generate(input=file_path) return res[0]["text"] # 批量处理目录下所有音频 import os for file in os.listdir("videos/"): if file.endswith(".mp4"): text = transcribe_audio(f"videos/{file}") with open(f"outputs/{file}.txt", "w") as f: f.write(text)4. 结合 OCR 提取画面文字
4.1 为什么需要 OCR?
仅靠 ASR 只能获取“说出来的内容”,而许多关键信息可能出现在屏幕上,例如:
- PPT 标题与要点
- 视频字幕条
- 图表数据标注
- 演讲者姓名职位
因此必须引入 OCR 补全视觉文本。
4.2 推荐 OCR 工具:PaddleOCR
安装方式:
pip install paddlepaddle-gpu # GPU 版本 pip install paddleocr4.3 视频抽帧处理
使用 OpenCV 按固定间隔抽取图像帧:
import cv2 import os def extract_frames(video_path, output_dir, interval=5): cap = cv2.VideoCapture(video_path) fps = int(cap.get(cv2.CAP_PROP_FPS)) count = 0 saved = 0 while True: ret, frame = cap.read() if not ret: break if count % (fps * interval) == 0: cv2.imwrite(f"{output_dir}/frame_{saved:04d}.jpg", frame) saved += 1 count += 1 cap.release()建议每 5 秒抽一帧,兼顾覆盖率与计算成本。
4.4 执行 OCR 识别
from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang='ch') def ocr_frame(image_path): result = ocr.ocr(image_path, cls=True) texts = [line[1][0] for line in result[0]] return "\n".join(texts) # 处理所有抽帧图片 all_ocr_text = "" for img in sorted(os.listdir("frames/")): text = ocr_frame(f"frames/{img}") all_ocr_text += f"[{img}]\n{text}\n\n"5. 构建统一内容索引系统
5.1 数据融合策略
将 ASR 和 OCR 输出进行合并,并保留来源标记:
{ "source": "asr", "timestamp": "00:01:23.450", "text": "今天我们来讲解深度学习的基本原理" } { "source": "ocr", "frame": "frame_0023.jpg", "time_range": "00:01:15.000-00:01:20.000", "text": "深度学习三要素:数据、模型、算力" }5.2 使用 Elasticsearch 建立全文索引
安装 ES(Docker 方式):
docker run -d --name elasticsearch \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ elasticsearch:8.11.3写入数据示例:
from elasticsearch import Elasticsearch es = Elasticsearch("http://localhost:9200") doc = { "text": "深度学习的基本原理", "source": "asr", "video_id": "lec_2026_intro", "timestamp": "00:01:23.450" } es.index(index="video_content", document=doc)5.3 实现关键词检索
查询“深度学习”相关片段:
res = es.search( index="video_content", body={ "query": { "match": { "text": "深度学习" } }, "size": 10 } ) for hit in res['hits']['hits']: print(f"[{hit['_source']['source']}] {hit['_source']['text']} @ {hit['_source'].get('timestamp', '-')}")输出示例:
[asr] 今天我们来讲解深度学习的基本原理 @ 00:01:23.450 [ocr] 深度学习三要素:数据、模型、算力 @ 00:01:15.0006. 高级优化技巧
6.1 时间对齐去重
ASR 与 OCR 可能在相近时间段提取相似内容,需做时间窗口去重:
def is_near_time(ts1, ts2, window_sec=5.0): t1 = sum(float(x) * m for x, m in zip(ts1.split(":"), [3600, 60, 1])) t2 = sum(float(x) * m for x, m in zip(ts2.split(":"), [3600, 60, 1])) return abs(t1 - t2) < window_sec若 ASR 与 OCR 文本相似且时间接近,则只保留 ASR 结果。
6.2 关键帧智能采样
代替固定间隔抽帧,可采用场景变化检测提升 OCR 效率:
def detect_scene_change(prev_frame, curr_frame, threshold=0.3): diff = cv2.absdiff(prev_frame, curr_frame) gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 25, 255, cv2.THRESH_BINARY) change_ratio = cv2.countNonZero(thresh) / gray.size return change_ratio > threshold仅在画面切换时执行 OCR,避免重复识别静态画面。
6.3 支持 SRT 字幕反向定位
利用 FunASR 输出的.srt文件,实现“点击字幕跳转播放”:
import pysrt subs = pysrt.open("subtitle_001.srt") for sub in subs: print(f"ID: {sub.index}, Start: {sub.start}, Text: {sub.text}")前端可通过 video.js 等播放器集成此功能。
7. 总结
7.1 核心收获
本文完整实现了基于FunASR + OCR的音视频内容检索系统,涵盖以下关键技术点:
- 成功部署科哥开发的 FunASR WebUI,支持高精度中文语音识别
- 掌握批量音频处理与时间戳提取方法
- 利用 PaddleOCR 补全画面文字信息,形成多模态输入
- 构建 Elasticsearch 全文索引,实现毫秒级关键词检索
- 提出时间对齐、关键帧采样等优化策略,提升系统实用性
7.2 下一步学习路径
- 尝试接入 Whisper 模型进行多语言对比测试
- 使用 Milvus 构建向量数据库,支持语义检索(如“找关于神经网络的内容”)
- 开发 Web 前端界面,集成视频播放与检索功能
- 探索实时流媒体识别(RTMP 推流场景)
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。