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

目录

一、引言

二、FFmpeg工具介绍

2.1 什么是FFmpeg

2.2 FFmpeg核心原理

2.3 FFmpeg使用示例

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

3.1 FFmpeg安装

3.2 Whisper模型下载

3.3 FFmpeg抽取视频的音频

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

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

3.4 Whisper将音频转为文本

3.5 视频理解完整代码

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使用示例

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

sudo apt-get update && apt-get install ffmpeg

3.2 Whisper模型下载

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

创建并激活conda环境:

conda create -n video2text python=3.11
conda activate video2text

安装transformers库: 

pip install transformers -i https://mirrors.cloud.tencent.com/pypi/simple

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

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。

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:

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

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

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将音频转为文本

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 视频理解完整代码

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 subprocessdef 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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统 在大数据时代,数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取,Hive进行数据分析,ECharts进行数据可视化,以及基于协同过滤算法…

SuperMap GIS基础产品FAQ集锦(20240701)

一、SuperMap iDesktopX 问题1:对于数据提供方提供的osgb格式的数据,如何只让他生成一个s3mb文件呢?我用倾斜入库的方式会生成好多个s3mb缓存文件 11.1.1 【解决办法】不能控制入库后只生成一个s3mb文件;可以在倾斜入库的时候设…

2024第17届中国西部(重庆)留学移民海外置业展览会

2024第17届中国西部(重庆)留学移民海外置业展览会 邀请函 主办单位: 中国西部教体医融合博览会组委会 承办单位:重庆中博展览有限公司 展会背景: 成都和重庆是中国新一线城市,是西部经济的核心增长极&a…

代码随想录算法训练营第59天:动态[1]

代码随想录算法训练营第59天:动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: …

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航,就是当我们滑动页面到某一个位置的时候,导航不会因为滑动而消失,会固定在页面的顶部,我们来看一下如何实现; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来,这就需要…

Java案例抢红包

目录 一:题目要求: 二:思路分析:(遇见问题先想出完整的思路逻辑再去动手事半功倍) 三:具体代码: 一:题目要求: 二:思路分析:&#x…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了,这里不在熬述,它在LLM分析中,尤其是在语义相似度的计算中至关重要,在dot attention机制中,也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

JS(JavaScript)的BOM操作

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

一文汇总VSCode多光标用法

光标的创建 按住alt,鼠标左键单击,在单击位置生成光标/删除光标 按住ctrlalt,单击↑/↓,在每行同一个位置(若某一行较短,则在行尾)生成光标,这个不会删除光标,只会在光标…

Day61 代码随想录打卡|回溯算法篇---组合优化

本篇是针对上一题的优化,因为在计算所有可能的组合结果时,不是每一条路径都是我们需要遍历的,如图,当n和k都为4的时候,其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边&#xf…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程),也与go函数相对应。作为编程人员,我们只是使用go语句向Go的运行时系统提交一个并发任务,而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

美德政府转移比特币、以太坊引发市场下跌

小编通过链上地址监控,令人意外的发现德国和美国政府都进行了大规模的数字货币转移,转移了价值 1.5 亿美元的比特币和以太坊。这些大额转移势必引起了数字货币市场分析师和投资者的关注。 BTC价格 从今年起德国政府已转移了其持有的相当一部分比特币&…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练:利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

玩Stable Diffusion不可不知的5款真人模型!大佬都在用!(附模型包)

模型对于AI绘画起决定性作用,今天推荐5款超好用的Stable Diffusion模型。 这些模型都在市面上收获了各种好评,而且各具特色,能满足你对写实人像的各种要求。 1、MajicMIX realisric 麦橘写实 写实系的人像大模型,具有非常好的质…

数据结构笔记第3篇:双向链表

1、双向链表的结构 注意:这里的 "带头" 跟前面我们说的 "头结点" 是两个概念,实际前面的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头结点。 带头链表里的头结点,实际为 "哨兵…

勒索病毒--认知与防范

免责声明:本文仅做技术交流与学习... 目录 应急响应-勒索病毒 1、什么是勒索病毒? 勒索病毒是一种新型电脑病毒,主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大,一旦感染将给用户带来无法估量的损失。…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这篇文章带大家…

C++编程(七)继承

文章目录 一、继承(一)概念(二)语法格式(三)通过子类访问父类中的成员1. 类内2. 类外 (四)继承中的特殊成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值函数 二、多重继承…

怎样把热门抖音短视频下载保存到手机相册?

怎样把热门抖音短视频下载保存到手机相册? 1、在手机上打开抖音短视频APP; 2、打开后搜索或找到要下载保存的抖音短视频; 3、打开短视频后,点击右则的分享,并滑动找到保存到相册; 4、点击后等待完成下载,…

Python实现接糖果小游戏

介绍: 基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果,接住糖果会增加得分。 代码: import pygame import random import os# 初始化pygame和设置屏幕大小 pygame.init() screen_width, screen_height 800, 6…