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

简介: 本文提供了使用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

目录
相关文章
|
4天前
|
API 网络架构 UED
构建RESTful API的最佳实践
【8月更文挑战第54天】在数字化时代,RESTful API已成为连接不同软件系统、提供数据服务的关键桥梁。本文将深入探讨如何构建高效、可维护的RESTful API,涵盖设计原则、安全策略和性能优化等关键方面。通过具体代码示例,我们将一步步展示如何实现一个简洁、直观且功能强大的API。无论你是新手还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
51 33
|
15天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
5天前
|
API
构建高效RESTful API的最佳实践
【9月更文挑战第21天】在数字化时代,API已成为软件应用间沟通的桥梁。本文将探讨如何设计和维护一个高效的RESTful API,确保它不仅能够快速响应,同时也易于扩展和维护。我们将通过实际的代码示例来揭示这些最佳实践背后的逻辑和原理,帮助你构建一个既稳定又灵活的后端服务。
|
8天前
|
安全 JavaScript NoSQL
构建高效后端API的实用指南
【9月更文挑战第18天】在数字化时代,后端API是连接数据与应用的桥梁。本文将深入探讨如何设计并实现高效、可扩展且安全的后端API,从理解RESTful原则到选择合适的编程语言和框架,再到数据库设计和优化查询,最后通过代码示例展示如何将理论应用于实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你构建更好的后端系统。
12 1
|
14天前
|
JSON API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API
18 6
|
16天前
|
JSON 安全 API
构建高效后端API的五大原则
【9月更文挑战第10天】在数字化时代,后端API成为了连接用户与服务、实现数据流动的重要桥梁。本文将深入探讨如何设计并构建一个高效、可扩展且安全的后端API系统。我们将从RESTful架构开始,逐步深入到错误处理、安全性、性能优化和文档编写等方面,为读者提供一套完整的后端API构建指南。无论你是初学者还是有经验的开发者,这篇文章都将为你带来新的视角和思考。
|
18天前
|
JavaScript 测试技术 API
探索后端开发:构建高效API的艺术
【9月更文挑战第8天】本文旨在揭示后端开发中一个经常被忽视的领域——API设计。通过深入浅出的方式,我们将探讨如何构建一个既高效又易于维护的API。文章将涵盖设计原则、最佳实践以及一些常见的陷阱和解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在后端开发的道路上更进一步。
|
17天前
|
设计模式 测试技术 API
Micronaut魔法书:揭秘构建超光速RESTful API的绝密技术!
【9月更文挑战第10天】在现代Web开发中,构建RESTful API至关重要。Micronaut作为一款轻量级框架,能够快速创建高效API。本文探讨使用Micronaut构建RESTful API的最佳设计模式与实践,涵盖注解(如`@Controller`、`@Get`)、代码组织、REST原则、数据验证及测试等方面,帮助开发者构建结构清晰、可维护性强的API服务。示例代码展示了如何使用Micronaut实现用户管理API,强调了良好设计模式的重要性。
33 3
|
17天前
|
存储 安全 API
探索后端开发:构建高效API的艺术
【9月更文挑战第9天】在数字时代的浪潮中,后端开发如同一位默默无闻的艺术家,精心雕琢着每一个数据交互的细节。本文将带你走进后端的世界,从基础概念到实战技巧,一起学习如何打造高效、稳定且易于扩展的API。我们将通过深入浅出的方式,探讨后端开发的哲学与实践,让你在编码之旅中,找到属于自己的节奏和和谐。让我们一起跟随代码的脚步,解锁后端开发的无限可能。
|
9天前
|
存储 JavaScript NoSQL
深入浅出后端开发:构建你的第一个RESTful API
【9月更文挑战第17天】在数字时代的浪潮中,后端开发是支撑起整个互联网的骨架。本文将引导读者了解后端开发的基本概念,并通过一个实际的代码示例,展示如何从零开始构建一个简单的RESTful API。我们将一起探索API设计的哲学、选择合适的后端语言和框架,以及实现数据存储和接口测试的过程。无论你是编程新手,还是希望扩展你的技术栈,这篇文章都将为你提供一次全面而深入的后端开发之旅。
27 0