Midjourney很好用,画面很美观,可是一群没有账号的伙伴用不了,所以想着做一个微信机器人去调用Midjourney来降低运用门槛,让大家都用起来。
建立微信机器人
必定不会从零开始自己建立,先去翻了翻GitHub,找到了一个现已介入ChatGPT的微信机器人。
github.com/zhayujie/ch…
Wechat robot based on ChatGPT, which using OpenAI api and itchat library. 运用ChatGPT建立微信谈天机器人,根据GPT3.5/4.0 API实现,支撑个人微信、大众号、企业微信布置,能处理文本、语音和图片,拜访操作体系和互联网。
预备
1. OpenAI账号注册
前往OpenAI注册页面创立账号,参阅这篇教程能够经过虚拟手机号来接收验证码。创立完账号则前往API办理页面创立一个 API Key 并保存下来,后面需求在项目中装备这个key。
项目中默许运用的对话模型是 gpt3.5 turbo,计费方法是约每 500 汉字 (包括请求和回复) 耗费 0.002,图片生成是每张耗费0.002,图片生成是每张耗费 0.016。
2.运转环境
支撑 Linux、MacOS、Windows 体系(可在Linux服务器上长期运转),一起需装置Python
。
建议Python版别在 3.7.1~3.9.X 之间,引荐3.8版别,3.10及以上版别在 MacOS 可用,其他体系上不确定能否正常运转。
(1) 克隆项目代码:
git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/
(2) 装置中心依靠 (必选):
能够运用
itchat
创立机器人,并具有文字沟通功用所需的最小依靠集合。
pip3 install -r requirements.txt
(3) 拓宽依靠 (可选,建议装置):
pip3 install -r requirements-optional.txt
假如某项依靠装置失败请注释掉对应的行再持续。
其间tiktoken
要求python
版别在3.8以上,它用于精确核算会话运用的tokens数量,强烈建议装置。
运用google
或baidu
语音辨认需装置ffmpeg
,
默许的openai
语音辨认不需求装置ffmpeg
。
装备
装备文件的模板在根目录的config-template.json
中,需复制该模板创立最终生效的config.json
文件:
cp config-template.json config.json
然后在config.json
中填入装备,以下是对默许装备的说明,可根据需求进行自定义修正(请去掉注释):
# config.json文件内容示例
{
"open_ai_api_key": "YOUR API KEY", # 填入上面创立的 OpenAI API KEY
"model": "gpt-3.5-turbo", # 模型称号。当use_azure_chatgpt为true时,其称号为Azure上model deployment称号
"proxy": "127.0.0.1:7890", # 署理客户端的ip和端口
"single_chat_prefix": ["bot", "@bot"], # 私聊时文本需求包括该前缀才能触发机器人回复
"single_chat_reply_prefix": "[bot] ", # 私聊时主动回复的前缀,用于区别真人
"group_chat_prefix": ["@bot"], # 群聊时包括该前缀则会触发机器人回复
"group_name_white_list": ["ChatGPT测验群", "ChatGPT测验群2"], # 敞开主动回复的群称号列表
"group_chat_in_one_session": ["ChatGPT测验群"], # 支撑会话上下文同享的群称号
"image_create_prefix": ["画", "看", "找"], # 敞开图片回复的前缀
"conversation_max_tokens": 1000, # 支撑上下文回忆的最多字符数
"speech_recognition": false, # 是否敞开语音辨认
"group_speech_recognition": false, # 是否敞开群组语音辨认
"use_azure_chatgpt": false, # 是否运用Azure ChatGPT service替代openai ChatGPT service. 当设置为true时需求设置 open_ai_api_base,如 https://xxx.openai.azure.com/
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在答复并处理人们的任何问题,并且能够运用多种语言与人沟通。", # 人格描述
# 订阅音讯,大众号和企业微信channel中请填写,当被订阅时会主动回复,可运用特别占位符。目前支撑的占位符有{trigger_prefix},在程序中它会主动替换成bot的触发词。
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,能够自在对话。\n支撑语音对话。\n支撑图片输出,画字最初的音讯将按要求创作图片。\n支撑角色扮演和文字冒险等丰厚插件。\n输入{trigger_prefix}#help 查看详细指令。"
}
装备说明:
1.个人谈天
- 个人谈天中,需求以 “bot”或”@bot” 为最初的内容触发机器人,对应装备项
single_chat_prefix
(假如不需求以前缀触发能够填写"single_chat_prefix": [""]
) - 机器人回复的内容会以 “[bot] ” 作为前缀, 以区别真人,对应的装备项为
single_chat_reply_prefix
(假如不需求前缀能够填写"single_chat_reply_prefix": ""
)
2.群组谈天
- 群组谈天中,群称号需装备在
group_name_white_list
中才能敞开群聊主动回复。假如想对一切群聊生效,能够直接填写"group_name_white_list": ["ALL_GROUP"]
- 默许只需被人 @ 就会触发机器人主动回复;另外群谈天中只需检测到以 “@bot” 最初的内容,相同会主动回复(方便自己触发),这对应装备项
group_chat_prefix
- 可选装备:
group_name_keyword_white_list
装备项支撑含糊匹配群称号,group_chat_keyword
装备项则支撑含糊匹配群音讯内容,用法与上述两个装备项相同。(Contributed byevolay) -
group_chat_in_one_session
:使群聊同享一个会话上下文,装备["ALL_GROUP"]
则作用于一切群聊
3.语音辨认
- 增加
"speech_recognition": true
将敞开语音辨认,默许运用openai的whisper模型辨认为文字,一起以文字回复,该参数仅支撑私聊 (注意由于语音音讯无法匹配前缀,一旦敞开将对一切语音主动回复,支撑语音触发画图); - 增加
"group_speech_recognition": true
将敞开群组语音辨认,默许运用openai的whisper模型辨认为文字,一起以文字回复,参数仅支撑群聊 (会匹配group_chat_prefix和group_chat_keyword, 支撑语音触发画图); - 增加
"voice_reply_voice": true
将敞开语音回复语音(一起作用于私聊和群聊),可是需求装备对应语音组成平台的key,由于itchat协议的限制,只能发送语音mp3文件,若运用wechaty则回复的是微信语音。
4.其他装备
-
model
: 模型称号,目前支撑gpt-3.5-turbo
,text-davinci-003
,gpt-4
,gpt-4-32k
(其间gpt-4 api暂未开放) -
temperature
,frequency_penalty
,presence_penalty
: Chat API接口参数,概况参阅OpenAI官方文档。 -
proxy
:由于目前openai
接口国内无法拜访,需装备署理客户端的地址,概况参阅#351 - 对于图画生成,在满足个人或群组触发条件外,还需求额外的关键词前缀来触发,对应装备
image_create_prefix
- 关于OpenAI对话及图片接口的参数装备(内容自在度、回复字数限制、图片大小等),能够参阅对话接口和图画接口文档直接在代码
bot/openai/open_ai_bot.py
中进行调整。 -
conversation_max_tokens
:表示能够回忆的上下文最大字数(一问一答为一组对话,假如累积的对话字数超出限制,就会优先移除最早的一组对话) -
rate_limit_chatgpt
,rate_limit_dalle
:每分钟最高问答速率、画图速率,超速后排队按序处理。 -
clear_memory_commands
: 对话内指令,主动清空前文回忆,字符串数组可自定义指令别名。 -
hot_reload
: 程序退出后,暂存微信扫码状况,默许封闭。 -
character_desc
装备中保存着你对机器人说的一段话,他会记住这段话并作为他的设定,你能够为他定制任何人格 (关于会话上下文的更多内容参阅该issue) -
subscribe_msg
:订阅音讯,大众号和企业微信channel中请填写,当被订阅时会主动回复, 可运用特别占位符。目前支撑的占位符有{trigger_prefix},在程序中它会主动替换成bot的触发词。
一切可选的装备项均在该文件中列出。
运转
1.本地运转
假如是开发机本地运转,直接在项目根目录下执行:
python3 app.py
终端输出二维码后,运用微信进行扫码,当输出 “Start auto replying” 时表示主动回复程序现已成功运转了(注意:用于登录的微信需求在付出处已完结实名认证)。扫码登录后你的账号就成为机器人了,能够在微信手机端经过装备的关键词触发主动回复 (任意老友发送音讯给你,或是自己发音讯给老友),参阅#142。
2.服务器布置
运用nohup指令在后台运转程序:
touch nohup.out # 首次运转需求新建日志文件
nohup python3 app.py & tail -f nohup.out # 在后台运转程序并经过日志输出二维码
扫码登录后程序即可运转于服务器后台,此时可经过ctrl+c
封闭日志,不会影响后台程序的运转。运用ps -ef | grep app.py | grep -v grep
指令可查看运转于后台的进程,假如想要重新发动程序能够先kill
掉对应的进程。日志封闭后假如想要再次打开只需输入tail -f nohup.out
。此外,scripts
目录下有一键运转、封闭程序的脚本供运用。
多账号支撑: 将项目复制多份,分别发动程序,用不同账号扫码登录即可实现一起运转。
特别指令: 用户向机器人发送 #reset即可清空该用户的上下文回忆。
建立Midjourney
相同不是从零开始写,从GitHub里找了找,果然找到了一个好项目。
github.com/novicezk/mi…
署理 MidJourney 的discord频道,实现api形式调用AI绘图
现有功用
- 支撑 Imagine 指令和相关U、V操作
- Imagine 时支撑增加图片base64,作为垫图
- 支撑 Describe 指令,根据图片生成 prompt
- 支撑 Blend 指令,多个图片混合
- 支撑 Imagine、V、Blend 图片生成进度
- 支撑中文 prompt 翻译,需装备百度翻译或 gpt
- prompt 灵敏词判别,支撑覆盖调整
- 任务队列,默许队列10,并发3。可参阅MidJourney订阅级别调整mj.queue
- 可选 user-token 衔接 wss,以获取错误信息和完整功用
- 支撑 discord域名(server、cdn、wss)反代,装备 mj.ng-discord
运用前提
- 科学上网
- docker环境
- 注册 MidJourney,创立自己的频道,参阅docs.midjourney.com/docs/quick-…
- 增加自己的机器人:流程说明
- user-wss方法,可不增加自己的机器人,但仍需参阅流程的第4、5步,获取用户Token、服务器ID、频道ID
危险须知
- 作图频繁等行为,触发midjourney验证码后,需赶快人工验证
- user-wss方法能够获取midjourney的错误信息、支撑图片变换进度,但可能会增加账号危险
快速发动
- /xxx/xxx/config目录下创立 application.yml(mj装备项)、banned-words.txt(可选,覆盖默许的灵敏词文件);参阅src/main/resources下的文件
- 发动容器,映射config目录
docker run -d --name midjourney-proxy \
-p 8080:8080 \
-v /xxx/xxx/config:/home/spring/config \
--restart=always \
novicezk/midjourney-proxy:2.1.4
- 拜访
http://ip:port/mj
查看API文档
附: 不映射config目录方法,直接在发动指令中设置参数
docker run -d --name midjourney-proxy \
-p 8080:8080 \
-e mj.discord.guild-id=xxx \
-e mj.discord.channel-id=xxx \
-e mj.discord.user-token=xxx \
-e mj.discord.bot-token=xxx \
--restart=always \
novicezk/midjourney-proxy:2.1.4
本地开发
- 依靠java17和maven
- 更改装备项: 修正src/main/application.yml
- 项目运转: 发动ProxyApplication的main函数
- 更改代码后,构建镜像:
docker build . -t midjourney-proxy
集成
midjourney_bot.py
这个需求从零开始写,Midjourney Proxy服务运用JAVA布置,并经过HTTP能够拜访,所以这个机器人就是纯粹的运用HTTP调用服务。
import time
import requests
from config import conf
class MidJourneyBot(object):
def __init__(self):
pass
def mj_create_img(self,query):
url = conf().get("midjourney_url")
url = url + "/trigger/submit"
if query.endswith("."):
query = query[:-1]
bodyParams = {
"action": "IMAGINE",
"prompt": query
}
# 1. 运用PSOT拜访Midjourney接口生成图片
response = requests.post(url, json=bodyParams)
print(response)
# 2. 定时器获取图片生成状况
if (response.status_code == 200):
data = response.json()
# 接口调用成功
if (data['code'] == 1):
job_id = data['result']
# 开始循环调用图片生成状况接口
return True, self.check_job_status(job_id)
return False, "Not Implemented"
# 3. 生成成功返回图片地址
return False, "Not Implemented"
# 运用定时器定期获取图片生成状况
def check_job_status(self,job_id):
base_url = conf().get("midjourney_url")
url = f"{base_url}/task/{job_id}/fetch"
try:
while True:
response = requests.get(url)
if response.status_code == 200:
data = response.json()
status = data['status']
if status == 'SUCCESS':
return data['imageUrl']
elif status in ['error', 'expired']:
raise Exception(f'Job failed with status {status}')
else:
raise Exception('Failed to check job status')
time.sleep(2) # 每5秒查看一次
except Exception as e:
print(e)
修正chat_gpt_bot.py文件
找到:elif context.type == ContextType.IMAGE_CREATE:代码行 替换原有调用OpenAI图片生成服务的代码,运用Midjourney实现高质量图片生成。