视频脚本生成器(基于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,一经查实,立即删除!

相关文章

表格结构标签

<!-- thead表示表格的头部 tbody表示表格的主体 --> <thead></thead> <tbody></tbody> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

19 压测和常用的接口优化方案

高并发的平台应用&#xff0c;项目上线前离不开一个重要步骤就是压测&#xff0c;压测对于编码中的资源是否问题的排查&#xff0c;性能的调优都是离不开的。测试还要做测试报告&#xff0c;出具了测试报告给到运维团队才能上线。 压测的测试报告主要有以下几个方面:1.响应时间…

Android --- CameraX讲解

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

Longformer:处理长文档的Transformer模型

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

想学习Python编程,应该如何去学习呢

学习Python编程是一个循序渐进的过程&#xff0c;以下是一个详细的学习路径和建议&#xff1a; 一、基础入门 安装Python环境&#xff1a; 从Python官方网站下载并安装适合你操作系统的Python版本。确保将Python添加到系统路径中&#xff0c;以便在命令行中方便地访问。 学习…

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

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

CAP 定理的 P 是什么

分布式系统 CAP 定理 P 代表什么含义 作者之前在看 CAP 定理时抱有很大的疑惑&#xff0c;CAP 定理的定义是指在分布式系统中三者只能满足其二&#xff0c;也就是存在分布式 CA 系统的。作者在网络上查阅了很多关于 CAP 文章&#xff0c;虽然这些文章对于 P 的解释五花八门&am…

MySQL为什么默认引擎是InnoDB ?

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

Java手写简单Merkle树

Java手写Merkle树代码 package com.blockchain.qgy.component;import com.blockchain.qgy.model.MerkleTreeNode; import com.blockchain.qgy.util.SHAUtil;import java.util.*;public class MerkleTree<T> {//merkle树private List<MerkleTreeNode<T>> lis…

jinfo命令详解

jinfo [option]option 有以下这些选项参数 -flag : 打印 指定名称的 jvm 参数值&#xff1b;-flag [|-] : 启动或禁用指定名称的 jvm参数&#xff1b;-flag : 设置指定名称的 jvm 参数值&#xff1b;-sysprops: 打印 java 系统属性-h | -help: 打印 jinfo 命令帮助信息 1&…

蓝桥杯真题k倍区间

题目如下 代码解析&#xff1a; 成功AC

python项目之requirements.txt文件

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

【设计模式-行为型】访问者模式

一、什么是访问者模式 说起来访问者模式&#xff0c;其实很少用。我一直在思考该用什么样的例子把这个设计模式表述清晰&#xff0c;最近突然想到一个例子也许他就是访问者。港片有过很辉煌的年代&#xff0c;小的时候一直在看港片觉得拍的非常好&#xff0c;而且演员的演技也在…

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

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

Java知识速记:深拷贝与浅拷贝

Java知识速记&#xff1a;深拷贝与浅拷贝 什么是浅拷贝&#xff1f; 浅拷贝指的是创建一个新对象&#xff0c;但新对象的属性值是对原对象属性值的引用。当原对象的属性是基本类型时&#xff0c;浅拷贝能够直接复制其值&#xff1b;当属性是对象时&#xff0c;仅复制引用&…

使用 cmake

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

数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)

单链表操作的C/C实现详解 在数据结构中&#xff0c;单链表是一种非常基础且重要的数据结构。它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C实现的单链表及其各种操作。 一、单链表的定义 const int N 1e5; //单链表 t…

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

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

第28章 星骗计划的开篇

深夜&#xff0c;万籁俱寂&#xff0c;世界仿佛被按下了静音键。东方艾艾独自坐在窗前&#xff0c;月光如银纱般倾洒在屋内&#xff0c;给一切都蒙上了一层梦幻的色彩。这时&#xff0c;小谷的声音在他脑海里悠悠响起&#xff1a;“主人&#xff0c;咱们所长虽年事已高&#xf…

如何将IP切换到海外:详细指南

在现代互联网应用中&#xff0c;IP地址成为了网络通信和数据交换的基础。然而&#xff0c;很多时候&#xff0c;由于区域限制或隐私保护的需求&#xff0c;用户可能需要将自己的IP地址切换到海外。无论是为了绕过地域限制访问内容&#xff0c;还是为了提高隐私安全&#xff0c;…