六安市网站建设_网站建设公司_JSON_seo优化
2026/1/17 2:38:49 网站建设 项目流程

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
CPUIntel 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 界面中:

  1. 点击“上传音频”按钮
  2. 选择.mp4,.mkv,.wav等格式的音视频文件
  3. 系统会自动提取音频流用于识别

支持格式包括: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 paddleocr

4.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.000

6. 高级优化技巧

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询