参考:stable diffusion 远端跑图—— Api根本知识把握 - 知乎 (zhihu.com)
1、准备工作(下载启动器)
这一部分就不多赘诉了,我使用的是B站秋叶大佬的整合包,要启用API。
网上蛮多本身设置的,大概须要设暗码之类的。经本身测试,使用整合包的话就不设置这个API账号暗码了,否则会出现客户端堕落,毗连不上等题目(大概是我操纵不当,我也还没研究透)
附带:可以下一个Postman来测试接口
2、接口测试
FastAPI - Swagger UI 这内里有许多接口,临时只研究了一下文生图的接口,关于文生图的这些哀求体参数还没摸透现在。
- 打开,里头有个Try it out,点击之后会出现一个哀求体,然后底下会有一个Execute的实验按钮,然后在底下就能直接复制这个接口的地点了。这个接口其着实上面图片就有了,就是你的本机ip加上/sdapi/v1/txt2img
- 测试接口。可以在这个网站上直接测试接口。我这用的是Postman,实在没什么区别。在Postman中创建一个Post哀求,填入地点。
- 添加哀求体,选择json数据,输入哀求体内容(如上所说,调试参数还没搞明白),然后发送等候返回数据即可。
- 剖析数据。假如没堕落的话,会返回一些信息,此中images是一个base64的字符串数组(反面在Unity会用到), 就是图片信息(是的,贼长一串),然后parameters就是你的哀求体了(调试的参数),关于info(我不知道哈哈哈),
- 检察图片。可以复制这一长串字符串(images内里的。上面提到了这是数组,你的哀求体假如写了出图是几张,假如你出的是两张图,那你直接复制进去肯定是剖析不出来的,本身找到此中一张的信息拿出来用)。然后打开 Base64 to Image Decoder / Converter (codebeautify.org) 这个网站,将你的字符串输入进去(去掉首位的双引号啊中括号之类的),你就可以得到你天生的图片咯。
ps:额...有点抽象。关于调试参数这些的,网上有挺多内容的,各人可以自行查阅一下。
3、Unity 接入
- 发下疯,亚雷**,我从前写post接口测试的时间,都是传的json字符串,直接将数据序列化传输即可。测这玩意的时间,测了半天跑不通,就是422,读取不了我的数据。网上看了许多险些都是python,官方文档也是用的python案例,好像也就是传个地点,然后不也是直接传的json字符串。有够绝望,误打误撞将数据转成byte字节流数据上传,成了....
- 在场景里搞个RawImage用来等下吸收天生的图片,然后准备个dll文件,放在Plugins下。这是一个序列化和反序列化的库文件。也可以直接在VS里装,但我不知道咋回事,装好了之后重新打开脚本,引用直接报错了,索性直接下一个dll丢到里头。
- 代码的话,思绪无非就是创建结构体大概来,表现你要上传的数据,然后序列化成json字符串,在转byte字节流,发送哀求,然后收到哀求,然后剖析数据啊如许。
- 须要注意的几点就是:
1、json 数据常会有空值,但是值范例是没有空值的,以是我界说吸收数据的时间更常用一些引用范例来吸收,克制出现错误。
2、构建哀求体的结构体或类时,字段名要对应Api接口的哀求参数名。如api接口 prompt提示词和steps迭代次数,那我界说的时间就对应上。这个详细照旧得看他所吸收得字段名是啥,尚有他得数据范例是啥。(传错的话好像协程好像会陷入无法开释的状态,然后就是重启大法....)
- public class txt2imgMes
- {
- public int steps;
- public string prompt;
- public int batch_size;
-
- }
复制代码
- 哀求的方法的话,UnityWebRequest 和 WWW 类我都试了一下,都行得通。之前做Post测试的时间,偶然接口只能用此中一种方法,很希奇我也不知道啥题目。别的须要加上哀求头,试了一下不加哀求头也会堕落。
- #region UnityWebRequest 请求
- // 创建Post请求
- UnityWebRequest requestPost = new UnityWebRequest(URL, UnityWebRequest.kHttpVerbPOST);
- // 实例请求体
- txt2img_Mes txt2imgMes = new txt2img_Mes();
- txt2imgMes.prompt = "puppy dog";
- txt2imgMes.steps = 15;
- txt2imgMes.batch_size = 2;
- string str = JsonConvert.SerializeObject(txt2imgMes);
- // 将Json字符串转换为byte[]
- byte[] postData = Encoding.UTF8.GetBytes(str);
-
- // 添加请求头
- requestPost.SetRequestHeader("Accept", "application/json");
- requestPost.SetRequestHeader("Content-Type", "application/json");
- // 实例上传处理器,并将 postData 设置为上传的数据
- requestPost.uploadHandler = new UploadHandlerRaw(postData);
- // 使用构造函数创建 Post 请求,需要实例下载器存储数据及上传处理器
- // 通过静态方法 UnityWebRequest.Post() 创建Post请求,会自动实例分配下载处理器和上传处理器。
- requestPost.downloadHandler = new DownloadHandlerBuffer();
-
- yield return requestPost.SendWebRequest();
- if (requestPost.isHttpError || requestPost.isNetworkError)
- {
- Debug.Log(requestPost.error);
- }
- else
- {
- Debug.Log("图片生成中");
- string text = requestPost.downloadHandler.text;
- action.Invoke(text);
- }
- #endregion
复制代码
- 界说吸收返回数据的对象。之条件到过,返回的图片信息是一个base64字符串数组,然后试了一下用List列表去吸收,也是可以的(毕竟列表也是通过数组实现的)。刚刚Postman测试的时间可以看到,返回的数据不止图片的信息一个,但只须要用到 images 这一个信息,以是只界说了这个对象用于吸收
- public class txt2imgReturnMes
- {
- // 返回的图片信息是一个string字符串
- // 使用 List ,Json数据有的值是空值,对于接收的数据类型个人更常用引用类型
- public List<string> images;
- // public string[] images;
- }
复制代码
- 剖析数据获取图片,反序列化获取的数据,然后将字符串转为byte字节流数据,天生图片,然后就可以了。
- StartCoroutine(PostRequest(Url, (string str) =>
- {
- Debug.Log(str);
- txt2img_ReturnMes byteMes = JsonConvert.DeserializeObject<txt2img_ReturnMes>(str);
- Debug.Log("获取返回数据");
- Debug.Log(byteMes.images.Count);
-
- byte[] bytes = Convert.FromBase64String(byteMes.images[0]);
- Texture2D texture = new Texture2D(1, 1);
- texture.LoadImage(bytes);
- image.texture = texture;
-
- byte[] bytes2 = Convert.FromBase64String(byteMes.images[1]);
- Texture2D texture2 = new Texture2D(1, 1);
- texture2.LoadImage(bytes2);
- image2.texture = texture2;
- }));
复制代码
研究一下这些调试的参数,反面再去研究一下图生图,看能不能通过用户照相直接天生一张图出来。
有题目的地方还请各位指正,感谢。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |