高效视频理解新路径:结合多模态与LLM的探索

大模型向量数据库视频服务

最近的项目中需要对短视频内容进行深度理解的能力。实际上我在去年探索如何从游戏视频中提取设计规则时(详情可参见之前的文章:《解读游戏设计:AI助你从视频中快速获取玩法规则》),已进行过初步的尝试。

当时采用的技术路径主要结合了语音识别(ASR)和基于视频抽帧的多模态信息理解。然而,实践后发现,该方案存在一些明显的局限性:

  • ASR的准确性问题: 语音识别倾向于字面转录,对于特定场景下的专业术语或一些非正式用语(例如游戏圈的“黑话”),其识别和转录的准确度往往难以保证,导致信息丢失或偏差。
  • 多模态理解的稳定性与连续性问题: 基于抽帧的多模态理解方法,在处理连续的视频流时,其输出结果的稳定性和内容的逻辑连续性有时表现不佳,难以形成对视频内容的连贯认知。

基于这些先前探索中遇到的挑战与思考,本文将拓展一种新的解决思路:利用视频中普遍存在的字幕信息来进行内容理解。当前主流短视频平台上的内容大多包含由创作者编辑嵌入的字幕。这些字幕通常信息密度高、经过提炼且准确性较好。因此,一个直观的想法是: 如果能有效、准确地提取这些字幕文本,无疑将极大提升视频内容理解的全面性和准确度。

当然,要将这个想法转化为一个稳定、高效的技术方案,必须解决以下几个关键问题:

  1. 字幕的精准提取与过滤: 如何选择合适的大模型来准确识别并提取视频帧中的字幕文本?同时,如何有效地区分并过滤掉画面中可能存在的非字幕文字(如游戏视频中的设置面板上的文字、聊天弹窗中的文字)的干扰?
  2. 效率与信息完整性的权衡: 如果对视频的每一帧都进行解码和字幕提取,计算成本和时间开销将非常巨大。但如果采用稀疏抽帧的策略,则存在遗漏关键、快速闪现字幕的风险。如何设计一种智能的采样或处理机制,在尽可能保证字幕信息覆盖率的同时,最大限度地降低冗余帧的处理开销?
  3. 提取结果的后处理与去噪: 由于视频画面复杂性和字幕识别的不确定性,初步提取出的字幕文本难免会包含噪声,例如重复的字幕行、无关的文字片段等。如何设计一套有效的后处理算法,对原始提取结果进行清洗和规范化,以保证最终输出字幕的准确性和可用性?
  4. 对无字幕视频的兼容性: 在设计自动化、批量处理的流程时,必须考虑到部分视频可能不包含字幕的情况。如何让整个处理流程具备良好的鲁棒性,能够自动识别并兼容处理这类无字幕视频,确保流程不中断?

只有解决好以上四个问题,我们才能设计出一个相对完善的方案。接下来,带着以上问题我们来对方案进行拆解。

项目已开源: https://github.com/skindhu/AI-VIDEO-UNSERSTANDING

技术方案拆解

整体技术架构

明确了需要解决的关键问题后,现在开始着手设计具体的实现方案。我采用了模块化的思路来搭建整个系统的技术框架,这样做的好处是结构清晰,便于后续迭代和维护。基于前文的分析,方案主要由以下几个核心模块构成:

  • video_processor: 视频预处理模块。负责视频的底层解析,例如解码视频、提取关键帧图像以及分离音频流。
  • audio_transcriber: 音频转录模块。接收 video\_processor 输出的音频流,利用ASR技术将其转录为文本,并生成 带时间戳的分段信息后续的优化需要 )。
  • visual_extractor: 视觉信息提取模块。这是方案中的核心视觉处理单元,专注于从视频帧图像中精准地提取字幕文本。
  • ai_service: AI服务调用层。作为一个统一的接口层,负责封装对各类第三方AI模型API(如语言模型、视觉语言模型、ASR模型等)的调用逻辑。
  • subtitle_processor: 字幕后处理模块。 对 visual\_extractor 输出的原始、可能带有噪声的字幕结果进行清洗和优化,如去除重复项、合并连续片段、格式化输出等,以提升最终字幕的质量和可用性。
  • summarizer: 内容摘要生成模块。利用 ai\_service 提供的强大的语言模型能力,整合来自 audio\_transcriber 的语音转录文本和 subtitle\_processor 处理后的字幕文本(以及可选的其他元信息),生成最终的视频内容摘要。

整体的技术架构如下图所示:

picture.image

接下来,我将逐一介绍关键模块的设计考量和实现细节。

ai-service 模块:统一的AI能力接口

首先来看 ai-service 模块。它的主要职责是封装和管理整个方案中对外部AI模型服务的调用。通过设立这样一个统一的接口层,可以更方便地接入、切换或管理不同的AI模型(例如后续会用到的 Gemini, Whisper, Qwen 系列等),同时也便于进行统一的配置管理、错误处理和成本监控。

在此方案中,ai-service 主要集成了以下几种关键的AI能力:

  • 语音转文本 (ASR): 我选用了业界知名的 Whisper 模型。其出色的性能和对多种语言的良好支持在许多评测中都得到了验证,足以满足对音频进行高质量转录的需求。
  • 视觉字幕提取: 这是本方案的关键环节之一。考虑到需要模型同时具备强大的图像理解能力和对中文场景的优秀处理能力,经过评估,我选择了国内领先的 qwen-vl-max (新账号注册前三个月每个月都有100w免费token) 来执行从视频帧中提取字幕的任务。为了提高字幕提取的准确性,尤其是在复杂的游戏画面中,精确地指示模型只提取“字幕”而非所有可见文字至关重要、我为此精心设计了 Prompt,明确告知模型字幕的定义,并要求其区分UI元素(如菜单、状态栏、得分板等)。以下是使用的 Prompt 示例:

“ 请识别并提取这张截图中的字幕文本内容。 字幕是指视频或游戏画面中作为内容解说或对话的文本,通常与画面内容紧密相关。 需要区分字幕与UI界面元素(如菜单、状态栏、计分板、玩家名称等)不同。 只返回真正的字幕文本,忽略所有界面UI元素中的文本。 不要添加任何解释或描述,只输出字幕内容本身。 如果没有识别到任何字幕,请回复'无字幕'。

  • 文本内容总结: 在最后的视频内容总结上,我选择了能力极为突出的gemini-2.5-pro模型,但考虑到调用Gemini还需要搭梯子,在某些环境不太方便,我也内置了qwen-plus文本模型作为备选,提供灵活选择。

video_processor 模块:源头活水与效率权衡

接下来讨论 video\_processor 模块。其核心功能——视频解析与帧提取,看似基础,却是整个后续分析流程的入口和数据基石。如果严格按照视频的原始帧率进行全量解码(例如,一个常见的2分钟、30 FPS的视频就包含 2×60×30=3600 帧),无疑会给后续的字幕提取任务带来巨大的时间开销。

而视频流本身往往包含大量时间上的冗余信息,尤其是在画面变化缓慢或内容静止的片段,相邻帧之间的差异极小。因此,并非每一帧都需要被提取出来用于后续分析。

为了在处理效率和信息完整性之间取得平衡,我采用了关键帧采样(Frame Sampling) 的策略。即并非处理视频的每一帧,而是设定一个合理的采样率(例如,配置为每秒提取1帧、2帧或5帧),以此大幅减少需要送入后续分析模块的初始帧数量。然而,如何定义“合理”的采样率,则需要仔细权衡其带来的利弊:

  • 较低的FPS(如1或2):可以显著减少提取的帧数,加快视频解码速度,减少磁盘占用,并可以减少后续字幕提取需要考虑的总帧数,从而加快整体处理速度。但是,可能会遗漏持续时间非常短的字幕(例如,仅在一两帧内闪现的字幕)。
  • 较高的FPS(如5或更高):提取更多帧,提高了捕捉到快速闪现字幕的可能性。但会增加视频解码时间和磁盘空间占用,并会给后续的字幕提取带来更大的基数。

而选择何种采样FPS取决于视频内容的特性:

  • 对于对话密集、字幕变化快的视频(如快节奏游戏解说、快速剪辑的Vlog),可能需要设置稍高的FPS(例如3-5)来尽量捕捉所有字幕。
  • 对于节奏较慢、字幕停留时间长的视频(如讲座、教程、风景片),较低的FPS(例如1-2)通常足够,且能显著提高效率。

经过对我所需要处理视频类型的分析,我采取的默认采样FPS是5,当然也可以灵活配置。视频解码采样是一个前置优化,它决定了进入后续阶段的总帧数池有多大,合理的FPS设置是整体效率的基础。

  
ffmpeg -i ${video\_path} -vf `fps=${frame\_rate}` -hide\_banner -loglevel error  

visual_extractor 模块:智能帧选择与并行处理

visual\_extractor 模块是本方案的核心引擎,负责从视频帧中提取关键的字幕信息。其基础工作流程是将 video\_processor 模块采样输出的视频帧序列,结合我们在 ai-service 中定义的优化 Prompt,输入给 qwen-vl-max 模型,以获取每帧画面中的字幕文本。

然而,正如前文所述,即便经过了 video\_processor 阶段基于固定 FPS 的初步采样优化(例如 5 FPS),得到的帧序列中仍然可能包含大量视觉上高度相似或不含字幕信息的冗余帧。例如,观察以下视频截图,其中的字幕画面中持续显示了超过3秒。如果按 5 FPS 采样,这短短3秒内就会产生约15帧图像,它们都包含几乎相同的字幕内容。对这些帧进行重复的视觉模型分析,无疑会造成巨大的计算资源浪费和时间消耗。

picture.image

因此,为了进一步提升处理效率、有效降低API调用成本和整体分析时长,我需要设计一种更智能的帧选择策略。目标是过滤掉尽可能多的冗余帧,将计算资源精准地聚焦于那些真正包含新信息或内容变化的关键帧上。

初步探索:基于ASR分段信息的过滤尝试

我首先想到的一个思路是利用 audio\_transcriber 模块输出的带时间戳的语音分段信息。因为通常情况下,字幕的出现是为了配合语音内容。一个直观的假设是:同一段语音(对应 Whisper 输出的一个 segment)可能对应着同一条或同一组连续的字幕。

基于这个假设,我可以尝试记录每个已处理语音分段的时间范围。如果后续某个待处理帧的时间戳落入了一个已被认为处理过的语音分段内,或许就可以跳过该帧的视觉分析。Whisper 输出的 segments 结构大致如下,包含了每个语音片段的起止时间戳:

picture.image

然而,经过进一步分析和实验验证,我发现实际情况更为复杂,语音与字幕的精确时间对应关系并非如此简单直接:

  • 时间戳不完全同步: 视觉字幕的显示时机(出现、消失)可能与对应语音的精确起止时间存在微小的、难以预测的偏差(例如字幕可能提前半秒出现,或延迟半秒消失)。
  • 内容呈现与分段不匹配: 一段较长的连续语音(被 Whisper 判定为一个 segment)在视觉呈现上,常常会被拆分成多行或多条字幕,在屏幕上逐步显示。如果仅因为某个帧落入了这个语音 segment 的时间范围就跳过处理,很可能会遗漏该语音段中后半部分才出现的字幕行。

优化策略:融合语音活动与时间采样的智能帧选择

鉴于单纯依赖 ASR 分段信息进行过滤存在丢失重要字幕的风险,我设计了一种融合语音活动信息与时间采样规则的更细致、更鲁棒的帧选择策略。该策略的核心思想是,优先关注内容可能发生变化的时间点,同时根据语音活动状态采用不同的采样密度:

  • 加载并利用语音分段信息: 首先获取 audio\_transcriber 生成的带时间戳的语音分段(segments)数据。
  • 优先分析语音边界帧: 重点关注那些标志着语音状态变化的“边界帧”——即视频从无声片段进入有声片段、或从有声片段进入无声片段的精确过渡时刻所对应的帧。这些时刻往往伴随着字幕的出现或消失,信息含量最高,应优先进行视觉分析。
  • 语音段内差量采样: 在检测到有语音活动的时间段(segment)内,我引入一个可配置的时间间隔阈值 segment_sample_interval(例如设为1秒)。只有当当前待考虑的帧与上一次实际被选中进行分析的帧之间的时间差超过此阈值时,才将当前帧加入待分析列表。这种方式旨在捕捉连续对话中可能发生的字幕滚动或切换,同时避免对内容稳定不变的帧进行过于密集的重复分析。(注:若此间隔设为0或负数,则退化为仅分析语音段的边界帧)。
  • 静音段内稀疏采样: 在没有语音活动的静音时间段内,可以假设字幕内容变化频率相对较低。因此,可以采用一个比语音段内更长的采样间隔 silent_sample_interval(例如设为2秒)来进行更加稀疏的采样分析,进一步节省计算资源。
  • 确保首帧分析: 无论采用何种采样逻辑,视频的第一帧(frame 0)总是会被纳入分析列表,以确保获取视频内容的初始状态信息。

通过实施这一多维度、动态调整的智能帧选择策略,可以尽量确保能够在不显著牺牲信息完整性的前提下,有效地过滤掉大量内容重复或无字幕信息的冗余帧。

最终加速:并行化处理

即便经过了固定FPS采样和上述智能帧选择两层优化,对于时长较长的视频,最终筛选出来需要调用视觉模型进行分析的关键帧数量仍可能不少。考虑到 AI 模型 API 调用通常是网络 I/O 密集型操作,传统的串行处理方式效率低下。

因此,我使用多线程对 visual\_extractor 的核心处理逻辑进行了并行化。具体来说,我将通过智能帧选择策略确定下来的最终待分析帧列表,分发给一个线程池中的多个工作线程(或创建多个异步任务)来并发地调用 ai\_service 进行字幕提取。这使得多个API请求可以同时进行,从而显著提升整体的处理吞吐量和效率

结合帧提取采样率优化、智能帧选择和多线程并行处理这三种策略,可以在保证分析质量(尽可能不遗漏重要字幕)的前提下,大幅缩短视频理解所需的总时间。

subtitle_processor 与 Summarizer 模块:后处理与整合输出

最后,介绍以下负责字幕后处理的 subtitle\_processor 模块和执行最终内容摘要生成的 Summarizer 模块。尽管这两个模块的功能相对聚焦,但在实现中同样需要关注一些关键细节,以确保最终输出内容的质量和整个处理流程的健壮性。

subtitle_processor 模块:字幕清洗与规范化

该模块接收来自 visual\_extractor 并行处理后汇集的、带有原始帧号(或时间戳)的字幕提取结果。其核心任务是对这些可能包含噪声和冗余的原始数据进行清洗与规范化,主要执行以下步骤:

  1. 时序排序与初步过滤: 首先,根据原始帧号或时间戳对所有提取结果进行严格排序,确保字幕序列的时间顺序正确。在此过程中,直接过滤掉由视觉模型明确返回的、表示未检测到字幕或分析失败的占位符文本(例如,我们在 Prompt 中约定的 '无字幕' 返回值),去除第一层明显的噪声。
  2. 基于内容相似度的去重: 这是关键的去噪步骤。由于同一条字幕可能在视频中持续显示多帧,导致被 visual\_extracto r 重复提取。为了消除这种冗余,我采用了基于字符串内容相似度的去重策略。具体实现上,利用 Python 的 difflib.SequenceMatcher 算法(或其他高效的相似度计算方法)来比较时间上相邻(或在预设时间窗口内)的字幕文本。如果两条字幕的相似度高于一个预设阈值(我们当前默认设置为 0.9,该值可根据实际应用效果灵活配置调整),则认为它们指向的是同一条字幕内容,系统会进行合并处理(例如,保留第一次出现的时间戳,丢弃后续重复项)。这一步能显著压缩字幕序列,去除冗余信息,得到更精简、准确的字幕流。

Summarizer 模块:智能摘要生成与容错处理

Summarizer 模块是整个流程的终点,负责调用Gemini-2.5-pro 或 qwen-plus,根据前序模块处理得到的文本信息,生成结构化或非结构化的视频内容摘要。在设计该模块时,我重点考虑了对各种输入情况的容错处理和智能判断逻辑:

系统会首先评估经过 subtitle\_processor 清洗后的最终字幕文本长度。如果字幕内容足够丰富(即长度达到预设的有效阈值),我会优先采用这些质量相对较高的字幕信息作为生成摘要的主要依据。若字幕长度不足(这可能意味着原始视频无有效字幕,或者提取到的多为非字幕类的视觉文本噪声),系统则会启动回退机制,尝试转而利用 audio\_transcriber 输出的语音转录文本进行总结。当然,在极端情况下,如果视频既无有效字幕,也无有效语音转录(例如音频质量极差或完全静音),则该视频可能被标记为无法有效处理。

此外,为了缓解先前讨论的ASR准确性问题 并进一步提升摘要的整体质量与相关性,我还引入了上下文增强的策略。在调用大模型进行总结时,允许将视频的标题、分类标签、已有描述等元数据信息整合进 Prompt 中。这些额外的背景信息能够为模型提供更丰富的上下文,有助于其更好地理解视频主题,即使在主要依赖可能存在瑕疵的ASR文本进行总结时,也能引导生成更精准、更贴合原视频内容的摘要。

总结

至此,整个方案设计完毕,相对于之前仅基于语音识别(ASR)和基于视频抽帧的多模态信息方案,新方案的理解准确性上得到极大提升。而相对于不做任何优化的字幕提取方案,结合帧提取采样率优化、智能帧选择和多线程并行处理这三种策略的优化手段最终处理的时间开销也降低了百倍以上。当然,目前的方案也并非真正意义的视频理解,而是采取了曲线救国的方式,也许某天有了相对成熟并且开源的端到端视频理解大模型,我们就不用这么麻烦。

项目已开源: https://github.com/skindhu/AI-VIDEO-UNSERSTANDING

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论