PdServer:调用MidjourneyAPI完成静夜思图文生成

欢迎沟通讨论,WX: cdszsz。公号:AIGC中文站。

今天我们将使用PdServer,通过Qwen大模型完成古诗的解析与prompt的生成,然后调用MidjourneyAPI完成图片的生成。有了文案和图片,我们就可以将其生成为一个古诗讲读视频。从生成图片上看,效果还是不错的,那就让我们开始吧!

图片

项目地址:

https://github.com/deanChang2021/PdServer_llm.git

目录

              PdServer的一些升级

              准备QWEN2.5环境

              准备MidjourneyAPI环境

              下载代码

              prompt优化

              请求Midjourney

              运行

              总结

  • PdServer的一些优化

这不是本文的重点,只是介绍PdServer最近的优化,你可以跳过。

1)实现了peewee的快捷ORM,并在初始化过程中,写入了admin用户,当我们在登陆时,可以使用admin/admin123进行登陆操作,相关代码在PdBaseKit包中。

图片

2)对结构进行了调整,并且允许将不同的类型的路由写入不同的文件中,然后进行注册即可。

图片

def register_blueprints(_app):    from server.apps import sys_app    from server.apps import document_app
    """你可以对不同的路由类型写入不同的文件,但一定要在此完成注册"""    _app.include_router(sys_app.router, prefix="/v1/api/trigger")    _app.include_router(document_app.router, prefix="/v1/api/trigger")

将service放到了db包中

图片

service将会使用我们的orm中的表。

  • QWEN2.5环境准备

我们在这一篇文章中已经介绍过Ollama与QWEN的安装,大家可以参考,这里就不再赘述。

【五天入门RAG】第二天:使用langchain完成一个最简单的代码任务

  • MidjourneyAPI环境准备

由于众所周知的原因,我们无法直接访问midjourney接口,因此我们将使用aigc中文站的midjourney接口。官网链接如下:

https://cnaigc.net

图片

(aigc中文站首页)

在本步骤中,我们主要获取midjourneyAPI以及token,以及了解对应的生成请求流程。

获取token

1)点击右上角,微信扫码登陆;

图片

2)f12打开浏览器调器,然后点击“前往midjourney中文站”;

图片

3)如下图所示,在右侧找到“picture?pageNum”接口后点击。然后点击标头;找到“Authorization”字段,复制右侧的token。

图片

到这里,我们已经获取了token。

生成API

POST https://cnaigc.net/woowoS-0.1/midjourney/imagine
##request##请注意保持语言的正确性。{"lang": "en",  "params": "   --ar 4:3  --v 6.0 ",  "picurl": "",  "prompt": prompt  }
##response{    "code": 200,    "msg": "操作成功",    "data": {        "code": 200,        "waitLen": 0,        "msg": "success",        "type": "generate",        "picUrl": null,        "businessId": "6020333778",        "opertion": null,        "params": "   --ar 1:1  --v 6.0 ",        "prompt": "A lonely bed illuminated by the bright moonlight, casting a chill like frost on the ground.",        "prompt_en": "A lonely bed illuminated by the bright moonlight, casting a chill like frost on the ground.",        "lang": "en"    }}

生成结果查询API

​​​​​​​

GET https://cnaigc.net/woowoS-0.1/midjourney/mjPicture?businessId=123123123
##requestbusinessId是我们的任务id,由imagine返回
##response{    "code": 200,    "msg": "操作成功",    "data": {        "id": null,        "businessid": "6020333778",        "prompt": "A lonely bed illuminated by the bright moonlight, casting a chill like frost on the ground.",        "prompt_en": "A lonely bed illuminated by the bright moonlight, casting a chill like frost on the ground.",        "params": "   --ar 1:1  --v 6.0 ",        "uploadpicurl": null,        "msgid": "1306153890064105482",        "hashmsg": "9c8ae8e1-be68-483d-88b9-e5d5a301187c",        "smallpicurl": "https://www.pdaigc.com/midjourneyOSS/previwImage/zdlzyy2024_A_lonely_bed_illuminated_by_the_bright_moonlight_cas_9c8ae8e1-be68-483d-88b9-e5d5a301187c.png",        "smallfilename": "zdlzyy2024_A_lonely_bed_illuminated_by_the_bright_moonlight_cas_9c8ae8e1-be68-483d-88b9-e5d5a301187c.png",        "picurl": "https://www.pdaigc.com/midjourneyOSS/image/zdlzyy2024_A_lonely_bed_illuminated_by_the_bright_moonlight_cas_9c8ae8e1-be68-483d-88b9-e5d5a301187c.png",        "filename": "zdlzyy2024_A_lonely_bed_illuminated_by_the_bright_moonlight_cas_9c8ae8e1-be68-483d-88b9-e5d5a301187c.png",        "filesize": 7181874.0,        "width": 2048,        "height": 2048,        "createby": "21",        "createdate": "2024-11-13 15:08:44",        "type": "generate",        "tasktype": null,        "updatedate": "2024-11-13 15:09:23",        "state": null,        "lang": "en"    }}

生成是一个异步过程:首先通过生成 imagine 接口提交生成请求,返回 200 表示请求任务正确,将会执行。我们接下来需要 mjPicture轮询,midjourney生成是一个较慢的过程,因此,请保持至低10秒以上的间隔周期。

生成成功的判断标志,就是picurl字段不为空。同时,有一个smallpicurl字段是压缩后的图片链接。这里生成的图片都是midjourney风格,四张为一组。

图片

你可以在picurl(不是smallpicurl)字段后加上-1/-2/-3/-4查看切割后的单图,如下图所示,我在png前加上了-3,即可查看第3图。

pdaigc.com/midjourneyOSS/image/zdlzyy2024_A_tranquil_night_a_bed_under_the_pale_moonlight_the__1c0b3065-4858-4b3c-8b5f-4f1f5a53e258-3.png

图片

如果你对midjourney的参数还不够了解,可以通过这里学习:

第一篇:正确使用MJ,并生成一张图

第二篇:/imagine命令使用,及提示词结构初探

第三篇:MJ的其它命令

同时,https://cnaigc.net还支持vary,zoom,scale等操作,你都可以通过f12查看对应的接口。

  • 下载代码

如果你还不太会PdServer,建议你看一下这一篇:

PdServer[一]:快速开始

你可以从项目地址中下载项目:

https://github.com/deanChang2021/PdServer_llm.git

在pyCharm中,可以在启动时,选择从版本库下载代码。

图片

然后确认安装3.10的环境。

图片

下载后,pip install -r requirements.txt 完成依赖的安装。

图片

将serverMain.py配置为运行项,run,即可打开界面。

图片

业务流程介绍:

1)上传一张图片,这可以是你在小朋友语文课文中拍的《静夜思》;

2)通过uploader接口上传图片;

3)OCR识别图片中的古诗;

4)通过QWEN2.5解读古诗,并编写用于midjourney生成图片的Prompt;

5)调用MidjourneyAPI将Prompt生成图片。

A. 在document_app.py接口层中,实现了uploader。我们在apifox中选择了一张图片进行上传。

 

图片

图片

返回了200表示上传成功,并返回了一个随机名,这个名字我们后面会使用。

​​​​​​​

{    "code": 200,    "filename": "9221773084.PNG"}

B. 在document_app.py接口层中,实现了ocrPoem。我们在apifox中使用刚才返回的图片名。

图片

运行后将生成prompt与图片,我将prompt与midjourney生成的图片保存到了d:/test目录下。

图片

在documentService.py中,是实现代码,从中我们看到首先进行了ocr识别。然后通过chatPoem方法进行解析,得到了prompt。最后,通过requestMidjourneyImg()方法,请求cnaigc.net生成图片。在接下来的内容中,我们会对chatPoem与requestMidjourneyImg进行详细解读。

​​​​​​​

       def parsePoemTask(self, fileName) -> tuple[str, PoemInfo]:        filePath = getSaveUploadFilePath() + fileName        logging.info("filePath:" + filePath)
        """ocr对图片进行识别"""        poem:str = OCR().ocr(filePath, "chi_sim")
        """QWEN对古诗解析并生成prompt"""        ret = LLM().chatPoem(poem)
        redisUtil.incrKey(RedisCntType.POEM_PARSE_TOTALS)
        promptList:[] = ret.prompt        for prompt in promptList:            """midjourney基于prompt生成图片"""
            with open('d:/test/prompt.txt', mode='a', encoding='utf-8') as f:                f.write(prompt)                f.write("\n")
            self.requestMidjourneyImg(prompt)
        logging.info("--- end chat ----")
        return poem, ret

  • Prompt优化

我们将使用chatPoem方法调用QWEN2.5,方法实现如下,较为简单,在这里我们使用Pydantic将LLM的输出转换成了我们需要的格式PoemInfo。重点是我们给QWEN2.5的prompt编写。

​​​​​​​

    def chatPoem(self, poem : str) -> Union[PoemInfo, None]:        outputParser = PydanticOutputParser(pydantic_object=PoemInfo)    
        prompt = ChatPromptTemplate.from_messages([            ("system", "{parser_instructions} 你输出的结果请使用中文。"),            ("human",
             "你好,请你作为一个语文老师。我将会给你一篇文章,文章会被三个#符号包围,请你认真阅读理解文章,并完成如下三个任务:任务1:提取作者、作者年代、创作时间。任务2:文章的详细解读,解读至少需要有200字。任务3:请你根据文章的大意,将诗词分为至少8个画面镜头,并为每个画面镜头编写英文prompt,每一个prompt需要包含画面背景描述、画面时代描述、画面的风格描述、画面主体描述,画面的风格需要符合文章的时代背景与风格,每一个prompt用英语描述,我需要使用这些prompt用于midjourney生成图片,每一个prompt不能少于50个汉字。\n###{book_introduction}###")        ])
        book_introduction = poem #"            静夜思 床前明月光,疑是地上霜,举头望明月,低头思故乡。"
        model = Ollama(model=CHAT_MODEL)
        chain = prompt | model | outputParser        ret : PoemInfo = chain.invoke({"book_introduction": book_introduction,                            "parser_instructions": outputParser.get_format_instructions()})        if ret:            return ret        else:            return None
                                 class PoemInfo(BaseModel):    bookName: str = Field(description="作者")    authorName: str = Field(description="作者年代")    publishDate: str = Field(description="创作时间")    parse: str = Field(description="解读")    prompt: List[str] = Field(description="画面描述")

我的提示词如下:

”你好,请你作为一个语文老师。我将会给你一篇文章,文章会被三个#符号包围,请你认真阅读理解文章,并完成如下三个任务:

任务1:提取作者、作者年代、创作时间。

任务2:文章的详细解读,解读至少需要有200字。

任务3:请你根据文章的大意,将诗词分为至少8个画面镜头,并为每个画面镜头编写英文prompt,每一个prompt需要包含画面背景描述、画面时代描述、画面的风格描述、画面主体描述,画面的风格需要符合文章的时代背景与风格,每一个prompt用英语描述,我需要使用这些prompt用于midjourney生成图片,每一个prompt不能少于50个汉字。

\n###{book_introduction}###"

你也可以根据自己的理解,来编写更有效的提示词。

  • 请求Midjourney

在前文已经提示生成图片是一个异步过程,因此,在我们的实现中,通过while来轮询,直到picurl字段有返回值。

​​​​​​​

    def requestMidjourneyImg(self, prompt):        param ={"lang": "en",                    "params": "   --ar 4:3  --v 6.0 ",                    "picurl": "",                    "prompt": prompt                    }        res = POST(param, MIDJOURNEY_IMG_URL, MIDJOURNEY_IMG_TOKEN)        if(type(res) != type({})):            logging.info("not a dict")            jsonRes = json.loads(res)        logging.info(jsonRes["data"]["businessId"])        logging.info("收到请求的businessId["+jsonRes["data"]["businessId"]+"]")
        while(True):            params = {"businessId":jsonRes["data"]["businessId"]}            res = GET(GET_MIDJOURNEY_IMG_URL, params, MIDJOURNEY_IMG_TOKEN)
            if (type(res) != type({})):                logging.info("not a dict")                jsonPicRes = json.loads(res)            logging.info(jsonPicRes)            logging.info(jsonPicRes["data"]["picurl"])                        if jsonPicRes["data"]["picurl"]:                logging.info("ok:"+ jsonPicRes["data"]["picurl"])                writeImg2Local(jsonPicRes["data"]["picurl"], "d:/test",jsonPicRes["data"]["picurl"].split("/")[-1])                break            else:                logging.info("sleep")                time.sleep(6)
        logging.info("收到图片:"+jsonPicRes["data"]["picurl"])

MIDJOURNEY_IMG_URL 是我们的请求URL,我已经配置到了config.ini中。MIDJOURNEY_IMG_TOKEN是我们的请求token,需要按前述的步骤获取,并写入到config.ini中。POST/GET方法是我改写后的方法,已经将我们的token整合了进去。

writeImg2Local()方法会将我们的图片url 写入到本地,在这里我写入到了d:/test目录中。

OK,到这里,我们已经完成了编辑工作,让我们来运行吧。

  • 运行

ocrPoem接口运行非常慢需要近10分钟,因为我们的图片生成过程很慢,我们需要不断的轮询。最后生成了了如下的prompt与图片。

图片

看了一下,生成的图片还不错,如果我们将比例调整为 --ar 4:3,再将风格化调整为 --s 750效果会更好。

图片

图片

图片

  • 总结

我在这里只是一个演示代码,此过程是同步的,在实际的生产环境中不可能这样做,需要将接口设计为异步。

同时,使用QWEN生成Midjourney的prompt也可以再优化提升,并生成更多的画面,可以让效果更好。

好的,今天的内容就到这里,感谢大家。

项目地址:

https://github.com/deanChang2021/PdServer_llm.git

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

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

相关文章

论文 | The Capacity for Moral Self-Correction in LargeLanguage Models

概述 论文探讨了大规模语言模型是否具备“道德自我校正”的能力,即在收到相应指令时避免产生有害或偏见输出的能力。研究发现,当模型参数达到一定规模(至少22B参数)并经过人类反馈强化学习(RLHF)训练后&…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架,用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分,提供了全面的安全解决方案,包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 (1&am…

删库跑路,启动!

起因:这是一个悲伤的故事,在抓logcat时 device待机自动回根目录了,而题主对当前路径的印象还停留在文件夹下,不小心在根目录执行了rm -rf * … 所以,这是个悲伤的故事,东西全没了…device也黑屏了&#xff…

unity单例模式的不同声明(待完善

总结: 这段代码实现了一个泛型单例模式(Singleton Pattern),用于确保某个类(由泛型参数 T 指定)在整个应用程序中只有一个实例,并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长,低代码开发平台以其快速构建应用程序的优势,满足了企业对高效开发的需求。例如,启效云低代码平台通过范式化和高颗粒度的可配…

3. Sharding-Jdbc核⼼流 程+多种分⽚策略

1. Sharding-Jdbc 分库分表执⾏核⼼流程 Sharding-JDBC执行流程 1. SQL解析 -> SQL优化 -> SQL路由 -> SQL改写 -> SQL执⾏-> 结果归并 ->返回结果简写为:解析->路由->改写->执⾏->结果归并1.1 SQL解析 1. SQL解析过程分为词法解析…

解读Nature:Larger and more instructable language models become less reliable

目录 Larger and more instructable language models become less reliable 核心描述 核心原理 创新点 举例说明 大模型训练,微调建议 Larger and more instructable language models become less reliable 这篇论文的核心在于对大型语言模型(LLMs)的可靠性进行了深入…

A3超级计算机虚拟机,为大型语言模型LLM和AIGC提供强大算力支持

热门大语言模型项目地址:www.suanjiayun.com/mirrorDetails?id66ac7d478099315577961758 近几个月来,我们目睹了大型语言模型(LLMs)和生成式人工智能强势闯入我们的视野,显然,这些模型在训练和运行时需要…

跟着尚硅谷学vue2—基础篇4.0

11. 收集表单数据 收集表单数据&#xff1a; 若&#xff1a;<input type"text"/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值。 若&#xff1a;<input type"radio"/>&#xff0c;则v-model收集的是value值&…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计好节点的数目 代码与解题思路 先读题&#xff1a;题目要求我们找出好节点的数量&#xff0c;什么是好节点&#xff1f;“好节点的所有子节点的数量都是相同的”&#xff0c;拿示例一…

js中typeOf无法区分数组对象

[TOC]&#xff08;js中typeOf无法区分数组对象) 前提&#xff1a;很多时候我们在JS中用typeOf来判断值类型&#xff0c;如&#xff1a;typeOf ‘abc’//string ,typeOf 123 //number; 但当判断对象为数组时返回的仍是’object’ 这时候我们可以使用Object.prototype.toString.c…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

使用 Vision 插件让 GitHub Copilot 识图问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。GitHub Copilot 在刚刚召开的全球技术大会上宣布升级了 GitHub Copilot 背后的大语言模型&#xff0c;现在已经正式启用 GPT 4…

LeetCode面试经典150题C++实现,更新中

用C实现下面网址的题目 https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1、数组\字符串 88合并两个有序数组 以下是使用 C 实现合并两个有序数组的代码及测试用例 C代码实现 #include <iostream> #include &l…

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)

前言 没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起也分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…

Serverless架构在实时数据处理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 引言 Ser…

Mysql篇-三大日志

概述 undo log&#xff08;回滚日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现了事务中的原子性&#xff0c;主要用于事务回滚和 MVCC。 redo log&#xff08;重做日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现…

VTK知识学习(8)-坐标系统

1、概述 计算机图形学里常用的坐标系统有4种&#xff1a; 1&#xff09;、Model坐标系统。定义模型时所采用的坐标系统&#xff0c;通常是局部的笛卡儿坐标系。 2&#xff09;、World坐标系统。是放置Actor的三维空间坐标系。 Actor&#xff08;vtkActor类&am…