视频脚本生成器(基于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 - 20
    max_length = video_length * 200 + 20

    script = (script_template | model).invoke(
        {
            "title": title,
            "duration": video_length,
            "wikipedia_search": search_result,
            "min_length": min_length,
            "max_length": max_length
        }
    ).content

    return 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_script

st.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设计得不好,后来加上了对“脚本长度”的详细解释

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java每日精进1.31(SpringSecurity)

在所有的开发的系统中&#xff0c;都必须做认证(authentication)和授权(authorization)&#xff0c;以保证系统的安全性。 一、基础使用 1.依赖 <dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.bo…

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里&#xff0c;随着项目的增长和需求的变化&#xff0c;如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

一、html笔记

(一)前端概述 1、定义 前端是Web应用程序的前台部分,运行在PC端、移动端等浏览器上,展现给用户浏览的网页。通过HTML、CSS、JavaScript等技术实现,是用户能够直接看到和操作的界面部分。上网就是下载html文档,浏览器是一个解释器,运行从服务器下载的html文件,解析html、…

9.2k star!PiliPala一个第三方B站客户端!

软件介绍 链接 PiliPala一个在Github上收获9.2k star的开源第三方bilibili客户端&#xff0c;支持安卓和ios端安装使用。应用界面简洁无广、除核心功能外无任何冗余功能和服务&#xff0c;让我们可以尽情的享受内容带给我们的快乐。 基础的功能如登录、点赞收藏、评论、关注、…

嵌入式C语言:大小端详解

目录 一、大小端的概念 1.1. 大端序&#xff08;Big-endian&#xff09; 1.2. 小端序&#xff08;Little-endian&#xff09; 二、大小端与硬件体系的关系 2.1. 大小端与处理器架构 2.2. 大小端与网络协议 2.3. 大小端对硬件设计的影响 三、判断系统的大小端方式 3.1.…

ZZNUOJ(C/C++)基础练习1031——1040(详解版)

1031 : 判断点在第几象限 题目描述 从键盘输入2个整数x、y值&#xff0c;表示平面上一个坐标点&#xff0c;判断该坐标点处于第几象限&#xff0c;并输出相应的结果。 输入 输入x&#xff0c;y值表示一个坐标点。坐标点不会处于x轴和y轴上&#xff0c;也不会在原点。 输出 输出…

8.[前端开发-CSS]Day08-图形-字体-字体图标-元素定位

一、额外知识补充 1 border图形 边框的形状 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…

大白话讲清楚embedding原理

Embedding&#xff08;嵌入&#xff09;是一种将高维数据&#xff08;如单词、句子、图像等&#xff09;映射到低维连续向量的技术&#xff0c;其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…

利用metaGPT多智能体框架实现智能体-1

1.metaGPT简介 MetaGPT 是一个基于大语言模型&#xff08;如 GPT-4&#xff09;的多智能体协作框架&#xff0c;旨在通过模拟人类团队的工作模式&#xff0c;让多个 AI 智能体分工合作&#xff0c;共同完成复杂的任务。它通过赋予不同智能体特定的角色&#xff08;如产品经理、…

当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例

目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…

windows10 配置使用json server作为图片服务器

步骤1&#xff1a;在vs code中安装json server, npm i -g json-server 注意&#xff1a;需要安装对应版本的json server&#xff0c;不然可能会报错&#xff0c;比如&#xff1a; npm i -g json-server 0.16.3 步骤2&#xff1a;出现如下报错&#xff1a; json-server 不是…

洛谷 P1164 小A点菜 C语言

P1164 小A点菜 - 洛谷 | 计算机科学教育新生态 题目背景 uim 神犇拿到了 uoi 的 ra&#xff08;镭牌&#xff09;后&#xff0c;立刻拉着基友小 A 到了一家……餐馆&#xff0c;很低端的那种。 uim 指着墙上的价目表&#xff08;太低级了没有菜单&#xff09;&#xff0c;说&…

向上调整算法(详解)c++

算法流程&#xff1a; 与⽗结点的权值作⽐较&#xff0c;如果⽐它⼤&#xff0c;就与⽗亲交换&#xff1b; 交换完之后&#xff0c;重复 1 操作&#xff0c;直到⽐⽗亲⼩&#xff0c;或者换到根节点的位置 这里为什么插入85完后合法&#xff1f; 我们插入一个85&#xff0c;…

50. 正点原子官方系统镜像烧写实验

一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统&#xff0c;然后通过这个系统来完成烧写工作。 切记&#xff01;使用OTG烧写的时候要先把SD卡拔出来&…

AI智能化模型助力太阳能光伏板自动巡检运维,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下太阳能光伏板污损缺陷智能检测识别系统

随着全球科技和能源领域的飞速发展&#xff0c;清洁新能源&#xff0c;尤其是太阳能&#xff0c;正以前所未有的速度融入我们的日常生活。太阳能光伏板作为转换太阳能为电能的关键设备&#xff0c;其普及程度日益提高&#xff0c;从偏远乡村到繁华都市&#xff0c;无处不在地展…

深度学习 DAY3:NLP发展史

NLP发展史 NLP发展脉络简要梳理如下&#xff1a; (远古模型&#xff0c;上图没有但也可以算NLP&#xff09; 1940 - BOW&#xff08;无序统计模型&#xff09; 1950 - n-gram&#xff08;基于词序的模型&#xff09; (近代模型&#xff09; 2001 - Neural language models&am…

FireFox | Google Chrome | Microsoft Edge 禁用更新 final版

之前的方式要么失效&#xff0c;要么对设备有要求&#xff0c;这次梳理一下对设备、环境几乎没有要求的通用方式&#xff0c;universal & final 版。 1.Firefox 方式 FireFox火狐浏览器企业策略禁止更新_火狐浏览器禁止更新-CSDN博客 这应该是目前最好用的方式。火狐也…