ToB企服应用市场:ToB评测及商务社交产业平台

标题: Midjourney Imagine API 申请及使用 [打印本页]

作者: 罪恶克星    时间: 2024-7-25 21:39
标题: Midjourney Imagine API 申请及使用
Midjourney Imagine API 申请及使用

申请流程

要使用 Midjourney Imagine API,首先可以到 Midjourney Imagine API 页面点击「Acquire」按钮,获取请求所需要的凭证:
假如你尚未登录或注册,会自动跳转到登录页面邀请您来注册和登录,登录注册之后会自动返回当前页面。
在首次申请时会有免费额度赠予,可以免费使用该 API。
基本使用

接下来就可以在界面上填写对应的内容,如图所示:
在第一次使用该接口时,我们至少需要填写两个内容,一个是 authorization,直接在下拉列表里面选择即可。另一个参数是 prompt, prompt 就是我们想天生的图片描述内容,建议用英文描述,画的图会更准确结果更好,这里我们用了示例内容 Lamborghini speeds inside a volcano,代表要画一个兰博基尼在火山飞驰。
同时您可以注意到右侧有对应的调用代码天生,您可以复制代码直接运行,也可以直接点击「Try」按钮进行测试。
调用之后,我们发现返回结果如下:
  1. {
  2.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234197197067915365/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_f47263b6-ff92-44a3-88ee-51cf0e706aae.png?ex=662fdb36&is=662e89b6&hm=ca9be54907726937ed02517a13466bef2afb2825b7cda4b313de56a3c3310d0d&width=1024&height=1024",
  3.   "image_width": 1024,
  4.   "image_height": 1024,
  5.   "image_id": "1234197197067915365",
  6.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234197197067915365/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_f47263b6-ff92-44a3-88ee-51cf0e706aae.png?ex=662fdb36&is=662e89b6&hm=ca9be54907726937ed02517a13466bef2afb2825b7cda4b313de56a3c3310d0d&",
  7.   "raw_image_width": 2048,
  8.   "raw_image_height": 2048,
  9.   "progress": 100,
  10.   "actions": [
  11.     "upscale1",
  12.     "upscale2",
  13.     "upscale3",
  14.     "upscale4",
  15.     "reroll",
  16.     "variation1",
  17.     "variation2",
  18.     "variation3",
  19.     "variation4"
  20.   ],
  21.   "task_id": "1bae3bec-3ac4-4180-a148-74ee6cb68b98",
  22.   "success": true
  23. }
复制代码
返回结果一共有四个字段,介绍如下:

打开 image_url 大概 raw_image_url 所对应的链接,可以发现如图所示。
可以看到,这里天生了一张 2x2 的预览图。到现在为止,第一次 API 调用就完成了。
图像放大与变动

下面我们实行针对当前天生的照片进行进一步的操作,好比我们以为右上角第二张的图片还不错,但我们想进行一些变动微调,那么就可以进一步将 action 填写为 variation2,同时将 image_id 通报即可:
这时候得到的结果如下:
  1. {
  2.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234201336543969401/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_10dc56a7-ec16-4bac-878e-2338f2ae5f5d.png?ex=662fdf10&is=662e8d90&hm=9aec96bca35ae20b6f9ab536101b9c4ea255eb6216cbf7000ac554937da071f3&width=1024&height=1024",
  3.   "image_width": 1024,
  4.   "image_height": 1024,
  5.   "image_id": "1234201336543969401",
  6.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234201336543969401/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_10dc56a7-ec16-4bac-878e-2338f2ae5f5d.png?ex=662fdf10&is=662e8d90&hm=9aec96bca35ae20b6f9ab536101b9c4ea255eb6216cbf7000ac554937da071f3&",
  7.   "raw_image_width": 2048,
  8.   "raw_image_height": 2048,
  9.   "progress": 100,
  10.   "actions": [
  11.     "upscale1",
  12.     "upscale2",
  13.     "upscale3",
  14.     "upscale4",
  15.     "reroll",
  16.     "variation1",
  17.     "variation2",
  18.     "variation3",
  19.     "variation4"
  20.   ],
  21.   "task_id": "f4961620-1104-409f-9dc1-ba3ed15c2f4d",
  22.   "success": true
  23. }
复制代码
打开 image_url,新天生的图片如下所示:
可以看到,针对上一张右上角的图片,我们再次得到了四张类似的照片。
这时候我们可以挑选此中一张进行精细化地放大操作,好比选第四张,那就可以 action 传入 upscale4,通过 image_id 再次传入当前图像的 ID 即可。
   注意: upscale 操作相比 variation 来说,Midjourney 的耗时会更短一些。
  返回结果如下:
  1. {
  2.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234202545208033400/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_34edc3f5-2bd0-4f5b-a372-03270b02289b.png?ex=662fe031&is=662e8eb1&hm=f8006c4d33a03dfd027dffe4eb46ab0d113a4910aef07497f0b335c8998b7858&width=512&height=512",
  3.   "image_width": 512,
  4.   "image_height": 512,
  5.   "image_id": "1234202545208033400",
  6.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1233387694839697411/1234202545208033400/36rgqit64j90qptsxnyq_Lamborghini_speeds_inside_a_volcano_id0494_34edc3f5-2bd0-4f5b-a372-03270b02289b.png?ex=662fe031&is=662e8eb1&hm=f8006c4d33a03dfd027dffe4eb46ab0d113a4910aef07497f0b335c8998b7858&",
  7.   "raw_image_width": 1024,
  8.   "raw_image_height": 1024,
  9.   "progress": 100,
  10.   "actions": [
  11.     "upscale_2x",
  12.     "upscale_4x",
  13.     "variation_subtle",
  14.     "variation_strong",
  15.     "zoom_out_2x",
  16.     "zoom_out_1_5x",
  17.     "pan_left",
  18.     "pan_right",
  19.     "pan_up",
  20.     "pan_down"
  21.   ],
  22.   "task_id": "03f62b17-a6f1-4c8e-9b4d-1fc7bd5b1180",
  23.   "success": true
  24. }
复制代码
此中 image_url 如图所示:
origin_url=image%2Fimage_VqBKsK5P1G.png&pos_id=img-EJPx6fTe-1715314690836)
这样我们就成功得到了一张兰博基尼的照片。
同时注意到 actions 里面又包含了几个可进行的操作,介绍如下:
upscale_2x:对画面放大2倍,得到 2 倍高清图。
upscale_4x:对画面放大 4 倍,得到4倍高清图。
zoom_out_2x:对画面进行缩小两倍操作(周围区域填充)。
zoom_out_1_5x:对画面进行缩小 1.5 倍操作(周围区域填充)。
pan_left:对画面进行左偏移操作。
pan_right:对画面进行右自制操作。
pan_up:对画面进行上偏移操作。
pan_down:对画面进行下偏移操作。
可以继承按照上述流程传入对应的变动指令进行一连生图操作。
图像改写(垫图)

该 API 也支持图像改写,俗称垫图,我们可以输入一张图片 URL 以及需要改写的描述笔墨,该 API 就可以返回改写后的图片。
   注意:输入的图片 URL 需要是一张纯图片,不能是一个网页里面展示一张图片,否则无法进行图像改写。建议使用图床(如阿里云 OSS、腾讯云 COS、七牛云、又拍云等)来上传获取图片的 URL。
  例如,我们这里有一张公路落日的图片,公路旁边有一些树木和楼房,如图所示:

现在我们想在它的基础上改写成海滩旁边,同时放一辆汽车停在路边。我们就可以构造如下的 prompt:
  1. https://cdn.acedata.cloud/v014oc.png an illustration of a car parked on the beach --iw 2
复制代码
可以看到,我们的 prompt 的最开头是一个 HTTPS 开头的图片链接,然后接着加一个空格,反面跟上 prompt 笔墨的内容。这里我们还用了额外的一些高级参数,如 —iw 2 来调解图片的权重。
我们可以将如上内容作为一个团体,通报给 prompt 字段,如图所示:
输出结果如下:
  1. {
  2.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234427310434947145/1234539663515975690/atmateosa5693_An_illustration_of_a_car_parked_on_the_beach_id26_cc8650ec-7e4b-4685-8911-78172430d8a7.png?ex=66311a28&is=662fc8a8&hm=c39707a1f22bc7f12874060ea6ed58ba37c188139ccc9a13c61ed9f37e66ea74&width=1456&height=816",
  3.   "image_width": 1456,
  4.   "image_height": 816,
  5.   "image_id": "1234539663515975690",
  6.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234427310434947145/1234539663515975690/atmateosa5693_An_illustration_of_a_car_parked_on_the_beach_id26_cc8650ec-7e4b-4685-8911-78172430d8a7.png?ex=66311a28&is=662fc8a8&hm=c39707a1f22bc7f12874060ea6ed58ba37c188139ccc9a13c61ed9f37e66ea74&",
  7.   "raw_image_width": 2912,
  8.   "raw_image_height": 1632,
  9.   "progress": 100,
  10.   "actions": [
  11.     "upscale1",
  12.     "upscale2",
  13.     "upscale3",
  14.     "upscale4",
  15.     "reroll",
  16.     "variation1",
  17.     "variation2",
  18.     "variation3",
  19.     "variation4"
  20.   ],
  21.   "task_id": "24a79e8b-a79d-471a-aef7-089dc0627ee8",
  22.   "success": true
  23. }
复制代码
这时候我们就得到了如下天生的图片:

可以看到,在原来的图片团体风格和构图不变的前提下,整个场景变成了海滩旁边,同时公路上还出现了汽车,这就是 Prompt with Image。
图像融合

该 API 也支持图像融合,我们可以传入多张图片,以实现不同的图片融合结果。
好比说这里我们一共有两张图片,一张是一只玩具熊,另一张是一个电锯,分别如图所示:


现在我们想把二者融合起来,让这只熊拿着这个电锯,怎么做呢?
我们可以构造如下的 prompt:
  1. https://cdn.acedata.cloud/8fapzl.png https://cdn.acedata.cloud/c1igbw.png The bear is holding the chainsaw --iw 2
复制代码
可以发现,和 Image with Prompt 类似,我们这里将多张图片 URL 放在了 prompt 开头,并以空格分隔,末了再加上笔墨 prompt,将如上内容作为一个团体通报给 prompt 参数,运行结果如下:
  1. {
  2.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234291876639674388/1234547236830973972/kcisok_The_bear_is_holding_the_chainsaw_id8873344_ad605bc4-ba19-4807-b94f-367dab672f7a.png?ex=66312136&is=662fcfb6&hm=0fb1e2261c9a30b04de9da9b23b7562eb73677f1bbda1fae52c7243b12d25aac&width=1024&height=1024",
  3.   "image_width": 1024,
  4.   "image_height": 1024,
  5.   "image_id": "1234547236830973972",
  6.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234291876639674388/1234547236830973972/kcisok_The_bear_is_holding_the_chainsaw_id8873344_ad605bc4-ba19-4807-b94f-367dab672f7a.png?ex=66312136&is=662fcfb6&hm=0fb1e2261c9a30b04de9da9b23b7562eb73677f1bbda1fae52c7243b12d25aac&",
  7.   "raw_image_width": 2048,
  8.   "raw_image_height": 2048,
  9.   "progress": 100,
  10.   "actions": [
  11.     "upscale1",
  12.     "upscale2",
  13.     "upscale3",
  14.     "upscale4",
  15.     "reroll",
  16.     "variation1",
  17.     "variation2",
  18.     "variation3",
  19.     "variation4"
  20.   ],
  21.   "task_id": "891f2645-ee15-4c7b-ac24-d98163c8e57e",
  22.   "success": true
  23. }
复制代码
我们就得到了如下结果:

可以看到,我们就成功实现了图片融合。
   注意:图片融合最多可以支持 5 个图片 URL作为输入,也就是最多支持 5 张图片融合,输入格式同上。
  异步回调

由于 Midjourney 天生图片需要等待一段时间,以是本 API 也默认设计为了长等待模式。但在部分场景下,长等待大概会带来一些额外的资源开销,因此本 API 也提供了异步 Webhook 回调的方式,当图片天生成功或失败时,其结果都会通过 HTTP 请求的方式发送到指定的 Webhook 回调 URL。回调 URL 接收到结果之后可以进行进一步的处置惩罚。
下面演示详细的调用流程。
首先,Webhook 回调是一个可以接收 HTTP 请求的服务,开发者应该替换为本身搭建的 HTTP 服务器的 URL。此处为了方便演示,使用一个公开的 Webhook 样例网站 https://webhook.site/,打开该网站即可得到一个 Webhook URL,如图所示:
将此 URL 复制下来,就可以作为 Webhook 来使用,此处的样例为 https://webhook.site/995d0a91-d737-40a7-a3b9-5baf68ed924c。
接下来,我们可以设置字段 callback_url 为上述 Webhook URL,同时填入 prompt,如图所示:
点击测试之后会立即得到一个 task_id 的相应,用于标识当前天生使命的 ID,如图所示:
稍等片刻,等图片天生结束,可以发发现 Webhook URL 收到了一个 HTTP 请求,如图所示:
其结果就是当前使命的结果,内容如下:
  1. {
  2.   "success": true,
  3.   "task_id": "f6e39eaf-652a-4bf5-a15c-79d8b143b80a",
  4.   "image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234291876639674388/1234551030549839932/kcisok_A_cat_sitting_on_a_table_id2724480_591c5c85-ec80-42ab-9fe5-9adfbed192e4.png?ex=663124be&is=662fd33e&hm=da725eb74aae375d60beec38b4cd26c5a7b373b1662f222ff838a8ea6fd5e798&width=1024&height=1024",
  5.   "image_width": 1024,
  6.   "image_height": 1024,
  7.   "image_id": "1234551030549839932",
  8.   "raw_image_url": "https://midjourney.cdn.acedata.cloud/attachments/1234291876639674388/1234551030549839932/kcisok_A_cat_sitting_on_a_table_id2724480_591c5c85-ec80-42ab-9fe5-9adfbed192e4.png?ex=663124be&is=662fd33e&hm=da725eb74aae375d60beec38b4cd26c5a7b373b1662f222ff838a8ea6fd5e798&",
  9.   "raw_image_width": 2048,
  10.   "raw_image_height": 2048,
  11.   "progress": 100,
  12.   "actions": [
  13.     "upscale1",
  14.     "upscale2",
  15.     "upscale3",
  16.     "upscale4",
  17.     "reroll",
  18.     "variation1",
  19.     "variation2",
  20.     "variation3",
  21.     "variation4"
  22.   ]
  23. }
复制代码
此中 success 字段标识了该使命是否实行成功,假如实行成功,还会有同样的 actions, image_id, image_url 字段,和上文介绍的返回结果是一样的,别的还有 task_id 用于标识使命,以实现 Webhook 结果和最初 API 请求的关联。
假如图片天生失败,Webhook URL 则会收到类似如下内容:
  1. {
  2.   "success": false,
  3.   "task_id": "7ba0feaf-d20b-4c22-a35a-31ec30fc7715",
  4.   "error": {
  5.     "code": "bad_request",
  6.     "message": "Unrecognized argument(s): `-c`, `x`"
  7.   }
  8. }
复制代码
这里的 success 字段会是 false,同时还会有 error.code 和 error.message 字段描述了使命错误的详情信息,Webhook 服务器根据对应的结果进行处置惩罚即可。
流式输出

Midjourney 官方在天生图片的时候是有进度的,在最开始是一张含糊的照片,然后颠末几次迭代之后,图片逐渐变得清晰,末了得到完整的图片。
以是,一张图片的天生过程约莫可以分为「发送死令」->「开始生图(多次迭代逐渐清晰)」->「生图完毕」的阶段。
在没开启流式输出的情况下,本 API 从发起请求到返回结果,实际上是从上述「发送死令」->「生图完毕」的全过程,中间生图的过程也全被包含在里面,由于 Midjourney 本身天生图片速率较慢,整个过程约莫需要等待一分钟或更久。
以是为了更好的用户体验,本 API 支持流式输出,即当「开始生图」的时候就开始返回结果,每当绘制进度有变化,就会流式将结果输出,直至生图结束。
假如想流式返回相应,可以更改请求头里面的 accept 参数,修改为 application/x-ndjson,不过调用代码需要有对应的更改才能支持流式相应。
Python 样例代码:
  1. import requests
  2. url = 'https://api.acedata.cloud/midjourney/imagine?token={token}'
  3. headers = {
  4.     'content-type': 'application/json',
  5.     'accept': 'application/x-ndjson'
  6. }
  7. body = {
  8.     "prompt": "a beautiful cat"
  9. }
  10. r = requests.post(url, headers=headers, json=body, stream=True)
  11. for line in r.iter_lines():
  12.     print(line.decode())
复制代码
运行结果:
  1. {"image_id":"1112780200447578272","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780200447578272/grid_0.webp","actions":[],"progress":0}
  2. {"image_id":"1112780227496640635","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780227496640635/grid_0.webp","actions":[],"progress":15}
  3. {"image_id":"1112780238934523994","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780238934523994/grid_0.webp","actions":[],"progress":31}
  4. {"image_id":"1112780254398918716","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780254398918716/grid_0.webp","actions":[],"progress":46}
  5. {"image_id":"1112780265933262858","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780265933262858/grid_0.webp","actions":[],"progress":62}
  6. {"image_id":"1112780280965648394","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780280965648394/grid_0.webp","actions":[],"progress":78}
  7. {"image_id":"1112780292621598860","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780292621598860/grid_0.webp","actions":[],"progress":93}
  8. {"image_id":"1112780319758766080","image_url":"https://midjourney.cdn.zhishuyun.com/attachments/1111955518269948007/1112780319758766080/dawn97_ignore81c5c24e-ea94-4ae2-aee4-252a98a347ed_a_beautiful_c_e20c3bc8-8827-4c99-9cf5-7d56c2e9d47f.png","actions":["upsample1","upsample2","upsample3","upsample4","variation1","variation2","variation3","variation4"],"progress":100}
复制代码
可以看到,启用流式输出之后,返回结果就是逐行的 JSON 了。在这里我们用 Python 里面的 iter_lines 方法自动获取了下一行的内容并打印出来。
假如要手动进行处置惩罚逐行 JSON 结果的话可以使用 \r\n 来进行分割。
例如在浏览器情况中,用 JavaScript 的 axios 库来实现手动处置惩罚,代码可改写如下:
  1. axios({
  2.   url: 'https://api.zhishuyun.com/midjourney/imagine?token={token}',
  3.   data: {
  4.     prompt: 'a beautiful cat',
  5.     action: 'generate'
  6.   },
  7.   headers: {
  8.     'accept': 'application/x-ndjson',
  9.     'content-type': 'application/json'
  10.   },
  11.   responseType: 'stream',
  12.   method: 'POST',
  13.   onDownloadProgress: progressEvent => {
  14.      const response = progressEvent.target.response;
  15.      const lines = response.split('\r\n').filter(line => !!line)
  16.      const lastLine = lines[lines.length - 1]
  17.      console.log(lastLine)
  18.   }
  19. }).then(({ data }) => Promise.resolve(data));
复制代码
但注意在 Node.js 情况中,实现稍有不同,代码可写为如下:
  1. const axios = require('axios');
  2. const url = 'https://api.zhishuyun.com/midjourney/imagine?token={token}';
  3. const headers = {
  4.   'Content-Type': 'application/json',
  5.   'Accept': 'application/x-ndjson'
  6. };
  7. const body = {
  8.   prompt: 'a beautiful cat',
  9.   action: 'generate'
  10. };
  11. axios.post(url, body, { headers: headers, responseType: 'stream' })
  12.   .then(response => {
  13.     console.log(response.status);
  14.     response.data.on('data', chunk => {
  15.       console.log(chunk.toString());
  16.     });
  17.   })
  18.   .catch(error => {
  19.     console.error(error);
  20.   });
复制代码
Java 样例代码:
  1. import okhttp3.*;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. public class Main {
  6.     public static void main(String[] args) {
  7.         String url = "https://api.zhishuyun.com/midjourney/imagine?token={token}";
  8.         OkHttpClient client = new OkHttpClient();
  9.         MediaType mediaType = MediaType.parse("application/json");
  10.         RequestBody body = RequestBody.create(mediaType, "{"prompt": "a beautiful cat"}");
  11.         Request request = new Request.Builder()
  12.                 .url(url)
  13.                 .post(body)
  14.                 .addHeader("Content-Type", "application/json")
  15.                 .addHeader("Accept", "application/x-ndjson")
  16.                 .build();
  17.         client.newCall(request).enqueue(new Callback() {
  18.             @Override
  19.             public void onFailure(Call call, IOException e) {
  20.                 e.printStackTrace();
  21.             }
  22.             @Override
  23.             public void onResponse(Call call, Response response) throws IOException {
  24.                 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
  25.                 try (BufferedReader br = new BufferedReader(
  26.                         new InputStreamReader(response.body().byteStream(), "UTF-8"))) {
  27.                     String responseLine;
  28.                     while ((responseLine = br.readLine()) != null) {
  29.                         System.out.println(responseLine);
  30.                     }
  31.                 }
  32.             }
  33.         });
  34.     }
  35. }
复制代码
运行结果都是类似的。
别的注意到,流式输出的结果多了一个字段叫做 progress,这个代表绘制进度,范围是 0-100,假如需要,您也可以在页面展示这个信息。
   注意:当绘制未完全完成的时候,actions 字段是空,即无法对中间过程的图片做进一步的处置惩罚操作。绘制完毕之后,绘制过程中产生的 image_url 会被销毁。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4