使用Streamlit和OpenAI API构建视频摘要

news2024/9/23 23:26:33

本文提供了使用Streamlit和OpenAI创建的视频摘要应用程序的概述。该程序为视频的每个片段创建简洁的摘要,并总结视频的完整内容。

要运行应用程序,需要安装以下依赖项:

  • Python(3.7或更高版本)
  • Streamlit
  • OpenAI API密钥
  • llama_index
  • youtube_transcript_api
  • html2image
  • langchain

搭建环境

首先,需要设置我们的开发环境,可以使用以下代码片段将API密钥设置为环境变量:

 import os
 os.environ["OPENAI_API_KEY"] = '{your_Api_Key}'

然后导入所有的包

 from llama_index import StorageContext, load_index_from_storage
 from llama_index import VectorStoreIndex
 import streamlit as st
 from llama_index import download_loader
 from llama_index import GPTVectorStoreIndex
 from llama_index import LLMPredictor, GPTVectorStoreIndex, PromptHelper, ServiceContext
 from langchain import OpenAI
 from langchain.chat_models import ChatOpenAI
 
 from youtube_transcript_api import YouTubeTranscriptApi
 from youtube_transcript_api.formatters import JSONFormatter
 import json
 import datetime
 from html2image import Html2Image

处理用户输入和YouTube视频检索

以下代码是Streamlit的按钮和事件:我们提示用户输入一个YouTube视频链接。使用st.text_input捕获输入,并将其存储在youtube_link变量中。按钮的名字为“Summarize!”,当单击该按钮时将触发我们的处理过程。下面是相关的代码片段:

 youtube_link = st.text_input("Youtube link:")
 st.button("Summarize!", on_click=send_click)

获取视频文本和预处理

使用YouTubeTranscriptApi可以获得视频文本。然后将转录本格式化为JSON并保存到文件中。然后再使用Html2Image库捕获YouTube视频的屏幕截图:

 srt = YouTubeTranscriptApi.get_transcript(st.session_state.video_id, languages=['en'])
 formatter = JSONFormatter()
 json_formatted = formatter.format_transcript(srt)
 with open(transcript_file, 'w') as f:
     f.write(json_formatted)
 
 hti = Html2Image()
 hti.screenshot(url=f"https://www.youtube.com/watch?v={st.session_state.video_id}", save_as=youtube_img)

建立索引和查询语言模型

下面就是对上面获取文本的处理,使用llama_index库中的VectorStoreIndex类创建索引。索引是根据视频文本构建的,另外还定义了LLMPredictor和ServiceContext来处理语言模型交互。下面是相关的代码片段:

 documents = loader.load_data()
 
 # define LLM
 llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="gpt-3.5-turbo", max_tokens=500))
 service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
 
 # Create and load the index
 index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)
 index.storage_context.persist()
 
 # Load the index from storage
 storage_context = StorageContext.from_defaults(persist_dir=index_file)
 index = load_index_from_storage(storage_context, service_context=service_context)
 
 # Create a query engine for the index
 query_engine = index.as_query_engine()

生成视频摘要

这一步遍历视频文本并为视频的每个部分生成摘要。通过使用query_engine从视频部分构造的提示来查询语言模型。生成的摘要存储在section_response变量中:

 section_response = ''
 
 for d in transcript:
     # ...
 
     if d["start"] <= (section_start_s + 300) and transcript.index(d) != len(transcript) - 1:
         section_texts += ' ' + d["text"]
     else:
         end_text = d["text"]
 
         prompt = f"summarize this article from \"{start_text}\" to \"{end_text}\", limited to 100 words, start with \"This section of video\""
         response = query_engine.query(prompt)
         
         start_time = str(datetime.timedelta(seconds=section_start_s))
         end_time = str(datetime.timedelta(seconds=int(d['start'])))
 
         section_start_s += 300
         start_text = d["text"]
         section_texts = ''
 
         section_response += f"**{start_time} - {end_time}:**\n\r{response}\n\r"

生成最终总结

在处理完所有视频片段后,,生成整个视频的最终摘要。生成的摘要存储在响应变量中:

 prompt = "Summarize this article of a video, start with \"This Video\", the article is: " + section_response
 response = query_engine.query(prompt)

显示结果

最后,我们使用streamlit显示生成的摘要和部分详细信息:

 st.subheader("Summary:")
 st.success(response, icon="🤖")
 
 with st.expander("Section Details: "):
     st.write(section_response)
 
 st.session_state.video_id = ''
 st.stop()

总结

本文演示了如何创建一个基于python的视频摘要程序。使用youtube_transcript_apto直接获取视频的文本,并通过OpenAI的语言模型来提供摘要。

作者没有个完整代码地址,所以有兴趣请与原文作者联系:

https://avoid.overfit.cn/post/a2ca634c772d4bcead5e2b72f3042b1e

作者:Abhijeetas

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

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

相关文章

Vue3+Vite+Pinia+Naive项目搭建之二:scss 的安装和使用

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步 Vue3.0 基础入门&#xff0c;快速入门。 1. 安装依赖 yarn add sass -D // or npm install sass -D 2. 页面样式初始化 reset.scss /* 新建 src/assets/style/reset.scss */ /* 页面样式初始化 */ html, body, div, s…

Linux VS Windows 孰优孰劣?

目录 1. 开源 vs. 闭源&#xff1a;2. 用户界面&#xff1a;3. 软件兼容性&#xff1a;4. 系统安全性&#xff1a;5. 社区支持和文档资源&#xff1a; Linux和Windows是两个主要的操作系统&#xff0c;它们在很多方面都有不同的特点和使用体验。以下是对Linux和Windows进行比较…

python_day1

单行注释规范&#xff0c;#号后留一空格 # 单行注释多行注释&#xff0c;三个单引号或三个双引号 duo hang zhu shi 赋值给变量时为字符串 n 123print(n)查看类型&#xff1a;type() a 111 b "111" if a b:print("true")print(a)print(type(a)) el…

Ubuntu20.04+Docker+ROS Noetic 可视化容器管理工具Portainer

1. 安装docker 官网教学安装网址&#xff1a;Install Docker Engine on Ubuntu | Docker Documentation 2. 安装noetic镜像 ros镜像网址 https://hub.docker.com/r/osrf/ros https://hub.docker.com/r/osrf/ros/tags sudo docker pull osrf/ros:noetic-desktop-full 3. 创…

高效提升控制效率 | 基于ACM32 MCU的LED灯箱控制器方案

前言 LED灯箱上各种文字、图案有序跳跃、交替辉映&#xff0c;产生强烈的视觉冲击力&#xff0c;被广泛应用于商场、美容美发、宾馆、娱乐场所等地方。 锁存器的工作原理 在LED和数码管显示方面&#xff0c;要维持一个数据的显示&#xff0c;往往要持续的快速的刷新。尤其…

vant省市区引入@vant/area-data官方数据报错问题解决

我们依照官方流程引入数据 yarn add vant/area-dataimport { areaList } from vant/area-data;Page({data: {areaList,}, });我们正常引入后会发现报错为 module ‘node_File/area-data/dist/data1.js’ is not defined 按照网上的vant-weapp的Area 省市区选择组件无法显示进行…

Segmentation fault (core dumped)问题解决

torch&#xff1a;1.10.0cu111 pandas:1.3.3 报错&#xff1a; 定位&#xff1a; df pd.DataFrame(columns[epoch, model.sigma1.cpu().detach().numpy(), model.sigma2.cpu().detach().numpy(),model.sigma3.cpu().detach().numpy(),iter,avg_ssim, avg_psnr,model.current…

LeetCode 75 —— 98. 验证二叉搜索树

LeetCode 75 —— 98. 验证二叉搜索树 一、题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子…

【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】

性能分析 要说sql有问题&#xff0c;需要拿出证据&#xff0c;因此需要性能分析 Mysql查询优化器&#xff08;Mysql Query Optimizer&#xff09; Mysql中有专门负责优化SELECT语句的优化器模块&#xff0c;主要功能&#xff1a;通过计算分析系统中收集到的统计信息&#xf…

Mali Offline Compiler - 官方视频教学 - 笔录

文章目录 目的Mali Offline Compiler 使用实例视频分析 shadermalioc 命令制定你想要分析的 shader制定你想要分析的着色器对应的 GPU实例解析内容硬件结构 & 驱动 & Shader 类型信息寄存器、是否堆溢出、16-bit 算术占比寄存器的使用量减少浮点精度优化堆溢出与否16-b…

基于Java+vue前后端分离学习交流论坛设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

easyExcel实现动态导出需要的字段列

easyExcel实现动态导出需要的字段列 实体概况 package excel;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.…

C++学习笔记-第11单元 标准模板库介绍

第11单元 标准模板库介绍 文章目录 第11单元 标准模板库介绍单元导读11.1 标准模板库(STL)基础11.2 STL容器简介11.3 STL迭代器简介11.3.1 使用迭代器访问容器中的元素11.3.2 迭代器类型11.3.3 迭代器支持的运算符操作 11.4 顺序容器11.4.1 顺序容器的逻辑结构11.4.2 代码展示s…

Vue组件库Element-快速入门

目录 什么是Element 快速入门 什么是Element Element&#xff1a;是饿了么团队研发的&#xff0c;一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库组件&#xff1a;组成网页的部件&#xff0c;例如超链接、按钮、图片、表单、表格、分页条等官网&#xff1a;…

avoidLabelOverlap无效果,echarts环形标签重叠,echarts数据重叠

在开发echarts环形图时,会出现数据重叠的现象.比如下面这情况.不可能为了数据将环形图变得太小,这样环形图太小也不美观.后来在官网上查找有一个avoidLabelOverlap属性,结果加上去后也没啥用 解决方法: 除了加上面:avoidLabelOverlap:true以外,还要加另外一个属性:minAngle:1…

win10系统中Pensieve(Sigcomm17)算法部署与运行

win10系统中Pensieve算法部署与运行 一、环境配置1、Anaconda环境配置2、Pycharm安装3、Pensieve安装包配置4、Pensieve数据集生成5、Pensieve代码运行6、Pensieve代码修改 一、环境配置 1、Anaconda环境配置 下载并且安装 Anaconda 官网下载地址&#xff1a;https://www.ana…

【Java基础教程】(六)程序概念篇 · 末:全面讲解Java方法的定义及应用、方法重载及递归~

Java基础教程之程序概念 末 本节学习目标1️⃣ 方法的定义与使用1.1 概念&#x1f50d; 在编写代码时&#xff0c;怎么判断什么情况下应该定义方法? 1.2 方法重载1.3 方法递归 &#x1f33e; 总结 本节学习目标 掌握Java中方法的定义结构、方法重载的概念与应用&#xff1b;…

EulerOS2.0SP10操作系统Esxi虚拟机安装手记

本文记录了在 Esxi7.0平台上新建虚拟机安装华为EulerOS2.0SP10国产操作系统的过程&#xff0c;仅供参考。 一、新建虚拟机 1、在VCenter上选中集群&#xff0c;右键选择新建虚拟机 2、在新建虚拟机视图点NEXT 3、输入虚拟机名称&#xff08;自定义&#xff09;&#xff0c;选…

Apikit 自学日记:如何引用全局变量

引用全局变量 一、什么是全局变量 全局变量可以在测试过程中动态取值以及赋值&#xff0c;比如&#xff1a;使用登录接口获取 token&#xff0c;将 token 值赋值给自定义全局变量 global_token&#xff0c;然后在另一个需要使用该token的接口中&#xff0c;使用 {{global_toke…

css,less,scss中的深度选择器,结合elementUi使用

css中深度选择器用到的是 >>>加类名 可以很方便的找到自己想要修改的样式 lees中用到 /deep/ 加类名 scss中用到::v-deep 加类名