码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【机器学习】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环境:

    1. conda create -n video2text python=3.11
    2. conda activate video2text

    安装transformers库: 

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

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

    1. os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
    2. 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。

    1. import subprocess
    2. def extract_audio(input_file, output_file):
    3. """
    4. 使用FFmpeg从MP4文件中提取音频并保存为MP3格式。
    5. :param input_file: 输入的MP4文件路径
    6. :param output_file: 输出的MP3文件路径
    7. """
    8. # 构建FFmpeg命令
    9. ffmpeg_command = [
    10. 'ffmpeg', '-i', input_file, '-vn', '-acodec', 'libmp3lame', output_file
    11. ]
    12. try:
    13. # 执行命令
    14. subprocess.run(ffmpeg_command, check=True)
    15. print(f"音频已成功从 {input_file} 提取到 {output_file}")
    16. except subprocess.CalledProcessError as e:
    17. print(f"处理错误: {e}")

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

    首先安装ffmpeg-python:

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

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

    1. import ffmpeg
    2. def extract_audio(input_file, output_file):
    3. """
    4. 使用FFmpeg从MP4文件中提取音频并保存为MP3格式。
    5. :param input_file: 输入的MP4文件路径
    6. :param output_file: 输出的MP3文件路径
    7. """
    8. try:
    9. # 执行命令
    10. ffmpeg.input(input_file).output(output_file, acodec="libmp3lame", ac=2, ar="44100").run()
    11. print(f"音频已成功从 {input_file} 提取到 {output_file}")
    12. except subprocess.CalledProcessError as e:
    13. print(f"处理错误: {e}")

    3.4 Whisper将音频转为文本

    1. from transformers import pipeline
    2. def speech2text(speech_file):
    3. transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-medium")
    4. text_dict = transcriber(speech_file)
    5. return text_dict

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

    3.5 视频理解完整代码

    1. import os
    2. os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
    3. os.environ["CUDA_VISIBLE_DEVICES"] = "2"
    4. os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0"
    5. from transformers import pipeline
    6. import subprocess
    7. def speech2text(speech_file):
    8. transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-medium")
    9. text_dict = transcriber(speech_file)
    10. return text_dict
    11. def extract_audio(input_file, output_file):
    12. """
    13. 使用FFmpeg从MP4文件中提取音频并保存为MP3格式。
    14. :param input_file: 输入的MP4文件路径
    15. :param output_file: 输出的MP3文件路径
    16. """
    17. # 构建FFmpeg命令
    18. ffmpeg_command = [
    19. 'ffmpeg', '-i', input_file, '-vn', '-acodec', 'libmp3lame', output_file
    20. ]
    21. try:
    22. # 执行命令
    23. subprocess.run(ffmpeg_command, check=True)
    24. print(f"音频已成功从 {input_file} 提取到 {output_file}")
    25. except subprocess.CalledProcessError as e:
    26. print(f"处理错误: {e}")
    27. import argparse
    28. import json
    29. def main():
    30. parser = argparse.ArgumentParser(description="视频转文本")
    31. parser.add_argument("--video","-v", type=str, help="输入视频文件路径")
    32. parser.add_argument("--audio","-a", type=str, help="输出音频文件路径")
    33. args = parser.parse_args()
    34. print(args)
    35. extract_audio(args.video, args.audio)
    36. text_dict = speech2text(args.audio)
    37. print("视频内的文本是:\n" + text_dict["text"])
    38. #print("视频内的文本是:\n"+ json.dumps(text_dict,indent=4))
    39. if __name__=="__main__":
    40. 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 

  • 相关阅读:
    【阿里云】轻松玩转linux服务器
    牛客网刷题-(7)
    黑盒测试的5种方法介绍
    gbase 8a 基础语法概念问题
    三菱PLC若想实现以太网无线通讯,需要具备哪些条件?
    计算机网络第三章——数据链路层(中)
    ant的get任务
    计算机毕业设计ssm基于ssm的牧场管理系统6ui1j系统+程序+源码+lw+远程部署
    C++-继承-多继承-类型转换-内存结构分析-汇编分析-逆向分析(二)
    PIP安装
  • 原文地址:https://blog.csdn.net/weixin_48007632/article/details/140106912
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号