视频脚本生成器(基于openai API和streamlit)

utils.py: 

# 所有和ai交互的代码放进utils.py里(utils 通常是 “utilities” 的缩写,意为 “实用工具” 或 “实用函数”)from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_community.utilities import WikipediaAPIWrapper
import os# 根据主题和时长,规定创造性,获得视频的标题和脚本
def generate_script(subject, video_length, creativity, api_key):model = ChatOpenAI(api_key=api_key, base_url="https://api.gptsapi.net/v1",temperature=creativity)  # 初始化模型# 获得视频的标题title_template = ChatPromptTemplate.from_messages([("human", "请为主题为‘{subject}’的视频起一个吸引人的标题")])  # 定义提示模板title = (title_template | model).invoke({"subject": subject}).content  # 调用链的invoke,获得最终结果# 调用维基百科的API获得相关信息search = WikipediaAPIWrapper(lang="zh")search_result = search.run(subject)# 获得视频的脚本内容script_template = ChatPromptTemplate.from_messages([("human","""你是一位短视频频道的博主。根据以下标题和相关信息,为短视频频道写一个视频脚本。视频标题:{title},视频时长:{duration}分钟,人的正常语速约为每分钟 200 字,所以生成的脚本长度必须在 {min_length} 到 {max_length} 字之间。要求开头抓住眼球,中间提供干货内容,结尾有惊喜,脚本格式也请按照【开头、中间,结尾】分隔。整体内容的表达方式要尽量轻松有趣,吸引年轻人。脚本内容可以结合以下维基百科搜索出的信息,但仅作为参考,只结合相关的即可,对不相关的进行忽略:```{wikipedia_search}```注意:脚本长度不应该包括维基百科内容的字数。""")])# 计算最小和最大长度min_length = video_length * 200 - 20max_length = video_length * 200 + 20script = (script_template | model).invoke({"title": title,"duration": video_length,"wikipedia_search": search_result,"min_length": min_length,"max_length": max_length}).contentreturn search_result, title, script# 示例调用
# print(generate_script("deepseek大模型", 0.5, 0.7, os.getenv("OPENAI_API_KEY")))

 main.py:

# 网站的主页
import streamlit as st
from utils import generate_scriptst.title("视频脚本生成器")# 侧边栏
with st.sidebar:api_key = st.text_input("请输入OpenAI API密钥:",type="password")st.markdown("[获取api密钥](https://2233.ai/api)")# 输入其他信息
subject = st.text_input("请输入视频的主题:")
video_length = st.number_input("请输入视频的大致时长(单位:分钟)",min_value=0.1,step=0.1)
creativity = st.slider("请输入视频脚本的创造力(数字越小越严谨,数字越大越天马行空):",min_value=0.0,max_value=1.0,value=0.5,step=0.1)# 提交按钮(需要校验,点击提交按钮前输入了api密钥,并且输入了视频主题)
submit = st.button("生成脚本")
if submit and not api_key:st.info("请输入你的OpenAI API密钥")st.stop() #stop让后面的代码不再执行
if submit and not subject:st.info("请输入视频的主题")st.stop()
if submit:with st.spinner("AI正在思考中,请稍等···"): #“思考中”组件,只要缩进里的代码没有执行完,就一直有个加载的效果search_result,title,script = generate_script(subject,video_length,creativity,api_key)st.success("视频脚本已生成!")st.subheader("标题:")st.write(title)st.subheader("视频脚本:")st.write(script)with st.expander("维基百科搜索结果:"): #折叠展开组件st.info(search_result)

补充:

1、st.info:显示的信息会在一个蓝色背景的容器中呈现,更侧重于显示特定的信息性提示

st.write:会根据输入内容以不同样式显示,如普通文本正常显示,Markdown 文本会进行相应的格式渲染,列表和字典会以表格形式展示。功能更强大、更通用。

2、st.title:主标题

st.subheader:副标题

3、st.spinner:显示加载提示,用来告知用户应用正在处理任务,避免用户因为等待而产生困惑或不耐烦。 

使用 st.success显示的消息会被放置在一个带有绿色边框和背景的容器中,这种样式设计能让成功消息在页面上非常醒目,使用户能快速注意到操作已成功完成。

4、通过将相关功能封装在generate_script函数中,main.py只需要导入这个函数就可以使用其功能,而不需要关心其内部实现细节和相关的导入语句,即不需要再次导入openai相关的库。

5、如果在使用 Streamlit 的 number_input 函数时仅设置了 min_value 和 max_value,而没有指定 value 参数,那么数字输入框的初始值会默认为 min_value。如果没有提供 min_value,则默认的初始值将是 0(除非指定了 value 参数来覆盖这个默认值)。

6、st.stop() 并不是结束整个 Python 程序,而是停止 Streamlit 应用的当前执行流程,不再执行后续的 Streamlit 命令。如果这个 Streamlit 应用是在服务器上运行,服务器仍然在运行,并且用户可以继续与应用进行交互(例如重新输入内容)。

 报错记录(详细报错信息可在部署页面的右下角查看):

1、安装依赖错误:

requirements.txt不能用pip freeze生成,会很混乱,交给ai总结即可

2、import错误:

langchain

langchain-openai

langchain-community

streamlit

openai

python-dotenv

wikipedia #虽然写的是从langchain里导入,但是有bug,就按照ai的建议加上一个独立的wikipedia

(尽管 langchain-community 或其相关模块可能试图导入或使用 wikipedia 包,但这个包本身并不是这些库的默认依赖项。因此,如果您在代码中使用了 WikipediaAPIWrapper 或者其他需要 wikipedia 包的功能,您需要手动安装它。)

3、生成的视频脚本长度不会自己调节

prompt设计得不好,后来加上了对“脚本长度”的详细解释

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

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

相关文章

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么? 一句话来说: surface是一块用于填充图像数据的内存。 surfaceView 是什么? 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中,但在wms 中可以理解为…

Longformer:处理长文档的Transformer模型

Longformer:处理长文档的Transformer模型 摘要 基于Transformer的模型由于自注意力操作的二次复杂度,无法处理长序列。为了解决这一限制,我们引入了Longformer,其注意力机制与序列长度呈线性关系,使其能够轻松处理数…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

MySQL为什么默认引擎是InnoDB ?

大家好,我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB ?】面试题。希望对大家有帮助; MySQL为什么默认引擎是InnoDB ? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB,主要…

蓝桥杯真题k倍区间

题目如下 代码解析: 成功AC

python项目之requirements.txt文件

Python项目中可以包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号用以新环境部署。 当我们开发新项目的时候,会用virtualenv创建很多python独立环境,这时候就会出现在不同环境下安装相同的模块的情况,这时候…

算法题(53):对称二叉树

审题: 需要我们判断二叉树是否满足对称结构,并返回判断结果 思路: 方法一:递归 其实是否对称分成两部分判断 第一部分:根节点是否相等 第二部分:根节点一的左子树和根节点二的右子树是否相等,根…

使用 cmake

使用前注意 : CMake是一种跨平台的构建系统,它用于管理软件构建过程,尤其适合多语言、多配置的项目。CMake不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件。 如果仅仅使用 qt 编…

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先,要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理,还是其他功能?明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时,你需要选择适合的编程语言、…

学习数据结构(5)单向链表的实现

(1)头部插入 (2)尾部删除 (3)头部删除 (4)查找 (5)在指定位置之前插入节点 (6)在指定位置之后插入节点 (7)删除…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构,通过 Key 可以快速查找到对应的 Value。B 树索引由根页面(Root&am…

Vue-cli 脚手架搭建

安装node.js 官网下载node.js安装包,地址:Node.js — Download Node.js 先在node.js即将要安装的路径下创建两个文件夹:node_cache(缓存)、node_global(全局) 点击安装包&#xf…

深度解析 DeepSeek R1:强化学习与知识蒸馏的协同力量

DeepSeek-R1 的问世,无疑在 AI 领域激起了千层浪。自发布仅一周,它便凭借卓越的性能和创新的技术,成为 AI 社区热议的焦点,代表着人工智能在推理和理解能力上的重大飞跃。今天我们一起深度解析一下DeepSeek-R1 一、强大基石&…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

笔记本搭配显示器

笔记本:2022款拯救者Y9000P,显卡RTX3060,分辨率2560*1600,刷新率:165Hz,无DP1.4口 显示器:2024款R27Q,27存,分辨率2560*1600,刷新率:165Hz &…

在php中怎么打开OpenSSL

(点击即可进入聊天助手) 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展,需要进行以下步骤 …

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…

K8S 快速实战

K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…

134.力扣刷题--加油站--滑动窗口

你知道的,失败总是贯穿人生的始终。 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#x…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…