【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战

目录

一、引言

二、FFmpeg工具介绍

[2.1 什么是FFmpeg](#2.1 什么是FFmpeg)

[2.2 FFmpeg核心原理](#2.2 FFmpeg核心原理)

[2.3 FFmpeg使用示例](#2.3 FFmpeg使用示例)

三、FFmpeg+Whisper二阶段法视频理解实战

[3.1 FFmpeg安装](#3.1 FFmpeg安装)

[3.2 Whisper模型下载](#3.2 Whisper模型下载)

[3.3 FFmpeg抽取视频的音频](#3.3 FFmpeg抽取视频的音频)

[3.3.1 方案一:命令行方式使用ffmpeg](#3.3.1 方案一:命令行方式使用ffmpeg)

[3.3.2 方案二:ffmpeg-python库使用ffmpeg](#3.3.2 方案二:ffmpeg-python库使用ffmpeg)

[3.4 Whisper将音频转为文本](#3.4 Whisper将音频转为文本)

[3.5 视频理解完整代码](#3.5 视频理解完整代码)

[3.6 视频理解模型部署](#3.6 视频理解模型部署)

四、总结


一、引言

上一篇对Whisper原理和实战进行了讲解,第7次拿到了热榜第一🏆。今天,我们在Whisper的基础上,引入ffmpeg工具对视频的音频进行抽取,再使用Whisper将音频转为文本,通过二阶段法实现视频内容的理解。

二、FFmpeg工具介绍

2.1 什么是FFmpeg

FFmpeg是一个开源的跨平台多媒体处理工具,它可以处理音频/视频数据,包括转码、转换格式、分割、合并等操作。

2.2 FFmpeg核心原理

  • 多媒体流的解析:FFmpeg能够解析各种常见的多媒体格式,包括MP4, MKV, AVI, MP3, OGG等,并将其转换为FFmpeg内部的统一表示格式,也就是所谓的复用格式(Container Format)和编码格式(Codec)。
  • 多媒体流的编码和解码:FFmpeg可以使用不同的编解码器来编码和解码音频/视频数据。例如,它可以使用H.264编码来压缩视频数据,使用AAC编码来压缩音频数据。
  • 过滤器(Filters):FFmpeg提供了一个强大的过滤器系统,可以用来处理视频和音频的各种效果,例如裁剪、裁切、旋转、缩放等。
  • 流的复用和解复用:FFmpeg可以将多个音频/视频流合并为一个文件,也可以将一个文件分离成多个音频/视频流。
  • 并行处理:FFmpeg利用多线程技术,可以并行处理多个任务,比如同时进行多个转码操作。

2.3 FFmpeg使用示例

bash 复制代码
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 192k -f mp3 output.mp3
  • -i input.mp4 指定输入文件。
  • -vn 表示禁用视频录制。
  • -ar 44100 设置采样率为44.1kHz。
  • -ac 2 设置声道数为2(立体声)。
  • -ab 192k 设置比特率为192k。
  • -f mp3 设置输出格式为MP3。
  • output.mp3 是输出文件的名称。

三、FFmpeg+Whisper二阶段法视频理解实战

3.1 FFmpeg安装

由于FFmpeg不支持pip安装,所以需要使用apt-get

bash 复制代码
sudo apt-get update && apt-get install ffmpeg

3.2 Whisper模型下载

这里与上一篇一样,还是采用transformers的pipeline,首先创建conda环境以及安装transformers

创建并激活conda环境:

bash 复制代码
conda create -n video2text python=3.11
conda activate video2text

安装transformers库:

bash 复制代码
pip install transformers -i https://mirrors.cloud.tencent.com/pypi/simple

基于transformers的pipeline会自动进行模型下载,当然,如果您的网速不行,请替换HF_ENDPOINT为国内镜像。

python 复制代码
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-medium")

不同尺寸模型参数量、多语言支持情况、需要现存大小以及推理速度如下

3.3 FFmpeg抽取视频的音频

3.3.1 方案一:命令行方式使用ffmpeg

首先将ffmpeg命令放入ffmpeg_command,之后采用subprocess库的run方法执行ffmpeg_command内的命令。

输入的视频文件为input_file,输出的音频文件为output_file。

python 复制代码
import subprocess
def extract_audio(input_file, output_file):
    """
    使用FFmpeg从MP4文件中提取音频并保存为MP3格式。

    :param input_file: 输入的MP4文件路径
    :param output_file: 输出的MP3文件路径
    """
    # 构建FFmpeg命令
    ffmpeg_command = [
        'ffmpeg', '-i', input_file, '-vn', '-acodec', 'libmp3lame', output_file
    ]

    try:
        # 执行命令
        subprocess.run(ffmpeg_command, check=True)
        print(f"音频已成功从 {input_file} 提取到 {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"处理错误: {e}")

3.3.2 方案二:ffmpeg-python库使用ffmpeg

首先安装ffmpeg-python:

python 复制代码
 pip install ffmpeg-python -i  https://mirrors.cloud.tencent.com/pypi/simple

引入ffmpeg库,一行代码完成音频转文本

python 复制代码
import ffmpeg
def extract_audio(input_file, output_file):
    """
    使用FFmpeg从MP4文件中提取音频并保存为MP3格式。

    :param input_file: 输入的MP4文件路径
    :param output_file: 输出的MP3文件路径
    """

    try:
        # 执行命令
        ffmpeg.input(input_file).output(output_file, acodec="libmp3lame", ac=2, ar="44100").run()
        print(f"音频已成功从 {input_file} 提取到 {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"处理错误: {e}")

3.4 Whisper将音频转为文本

python 复制代码
from transformers import pipeline
def speech2text(speech_file):
    transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-medium")
    text_dict = transcriber(speech_file)
    return text_dict

这里采用pipeline完成openai/whisper-medium的模型下载以及实例化,将音频文件输入实例化的transcriber对象即刻得到文本。

3.5 视频理解完整代码

python 复制代码
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0"

from transformers import pipeline
import subprocess

def speech2text(speech_file):
    transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-medium")
    text_dict = transcriber(speech_file)
    return text_dict
def extract_audio(input_file, output_file):
    """
    使用FFmpeg从MP4文件中提取音频并保存为MP3格式。

    :param input_file: 输入的MP4文件路径
    :param output_file: 输出的MP3文件路径
    """
    # 构建FFmpeg命令
    ffmpeg_command = [
        'ffmpeg', '-i', input_file, '-vn', '-acodec', 'libmp3lame', output_file
    ]

    try:
        # 执行命令
        subprocess.run(ffmpeg_command, check=True)
        print(f"音频已成功从 {input_file} 提取到 {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"处理错误: {e}")



import argparse
import json
def main():
    parser = argparse.ArgumentParser(description="视频转文本")
    parser.add_argument("--video","-v", type=str, help="输入视频文件路径")
    parser.add_argument("--audio","-a", type=str, help="输出音频文件路径")

    args = parser.parse_args()
    print(args) 

    extract_audio(args.video, args.audio)
    text_dict = speech2text(args.audio)
    print("视频内的文本是:\n" +  text_dict["text"])
    #print("视频内的文本是:\n"+ json.dumps(text_dict,indent=4))

if __name__=="__main__":
    main()

输出为:

3.6 视频理解模型部署

如果想将该服务部署成语音识别API服务,可以参考之前的FastAPI相关文章

四、总结

本文在上一篇音频转文本的基础上,引入了视频转音频,这样可以采用二阶段法:先提取音频,再音频转文字的方法完成视频内容理解。之后可以配上LLM对视频内提取的文本进行一系列应用。

希望可以帮到您,如果觉得有帮助的话,期待您的三连+投票!

如果您还有时间,可以看看我的其他文章:

《AI---工程篇》

AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效

AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署

AI智能体研发之路-工程篇(三):大模型推理服务框架Ollama一键部署

AI智能体研发之路-工程篇(四):大模型推理服务框架Xinference一键部署

AI智能体研发之路-工程篇(五):大模型推理服务框架LocalAI一键部署

《AI---模型篇》

AI智能体研发之路-模型篇(一):大模型训练框架LLaMA-Factory在国内网络环境下的安装、部署及使用

AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战

AI智能体研发之路-模型篇(三):中文大模型开、闭源之争

AI智能体研发之路-模型篇(四):一文入门pytorch开发

AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比

AI智能体研发之路-模型篇(六):【机器学习】基于tensorflow实现你的第一个DNN网络

AI智能体研发之路-模型篇(七):【机器学习】基于YOLOv10实现你的第一个视觉AI大模型

AI智能体研发之路-模型篇(八):【机器学习】Qwen1.5-14B-Chat大模型训练与推理实战

AI智能体研发之路-模型篇(九):【机器学习】GLM4-9B-Chat大模型/GLM-4V-9B多模态大模型概述、原理及推理实战

AI智能体研发之路-模型篇(十):【机器学习】Qwen2大模型原理、训练及推理部署实战

《AI---Transformers应用》

【AI大模型】Transformers大模型库(一):Tokenizer

【AI大模型】Transformers大模型库(二):AutoModelForCausalLM

【AI大模型】Transformers大模型库(三):特殊标记(special tokens)

【AI大模型】Transformers大模型库(四):AutoTokenizer

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

【AI大模型】Transformers大模型库(六):torch.cuda.OutOfMemoryError: CUDA out of memory解决

【AI大模型】Transformers大模型库(七):单机多卡推理之device_map

【AI大模型】Transformers大模型库(八):大模型微调之LoraConfig

相关推荐
机器之心4 分钟前
海外华人15人团队打造,统一理解与生成的图像模型,超越Nano banana登顶图像编辑
人工智能·openai
用户552796026057 分钟前
在老版本 HPC 系统上运行 Antigravity(反重力)
人工智能
helloweilei1 小时前
python 抽象基类
python
Axinyp1 小时前
Windows WSL2 安装 OpenClaw 踩坑指南
人工智能
用户8356290780511 小时前
Python 实现 PPT 转 HTML
后端·python
恋猫de小郭1 小时前
你用的 Claude 可能是虚假 Claude ,论文数据告诉你,Shadow API 中的欺骗性模型声明
前端·人工智能·ai编程
哥布林学者2 小时前
高光谱成像(四)最小噪声分数变换 MNF
机器学习·高光谱成像
Johny_Zhao2 小时前
centos7安装部署openclaw
linux·人工智能·信息安全·云计算·yum源·系统运维·openclaw
郑鱼咚2 小时前
现在的AI热潮,恰恰证明了这个世界就是个草台班子
前端·人工智能·程序员