使用Unity 接入 Stable-Diffusion-WebUI 文生图天生图像

[复制链接]
发表于 2026-2-7 06:12:49 | 显示全部楼层 |阅读模式
参考:stable diffusion 远端跑图—— Api根本知识把握 - 知乎 (zhihu.com)

1、准备工作(下载启动器)

这一部分就不多赘诉了,我使用的是B站秋叶大佬的整合包,要启用API

网上蛮多本身设置的,大概须要设暗码之类的。经本身测试,使用整合包的话就不设置这个API账号暗码了,否则会出现客户端堕落,毗连不上等题目(大概是我操纵不当,我也还没研究透)

附带:可以下一个Postman来测试接口

2、接口测试

FastAPI - Swagger UI 这内里有许多接口,临时只研究了一下文生图的接口,关于文生图的这些哀求体参数还没摸透现在。


  • 找到文生图的 Post 接口



  • 打开,里头有个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迭代次数,那我界说的时间就对应上。这个详细照旧得看他所吸收得字段名是啥,尚有他得数据范例是啥。(传错的话好像协程好像会陷入无法开释的状态,然后就是重启大法....)
    1. public class txt2imgMes
    2. {
    3.    public int steps;
    4.    public string prompt;
    5.    public int batch_size;
    6.  
    7. }
    复制代码



  • 哀求的方法的话,UnityWebRequest 和 WWW 类我都试了一下,都行得通。之前做Post测试的时间,偶然接口只能用此中一种方法,很希奇我也不知道啥题目。别的须要加上哀求头,试了一下不加哀求头也会堕落。
  1. #region UnityWebRequest 请求
  2. //  创建Post请求
  3. UnityWebRequest requestPost = new UnityWebRequest(URL, UnityWebRequest.kHttpVerbPOST);
  4. //  实例请求体
  5. txt2img_Mes txt2imgMes = new txt2img_Mes();
  6. txt2imgMes.prompt = "puppy dog";
  7. txt2imgMes.steps = 15;
  8. txt2imgMes.batch_size = 2;
  9. string str = JsonConvert.SerializeObject(txt2imgMes);
  10. // 将Json字符串转换为byte[]
  11. byte[] postData = Encoding.UTF8.GetBytes(str);
  12. //  添加请求头
  13. requestPost.SetRequestHeader("Accept", "application/json");
  14. requestPost.SetRequestHeader("Content-Type", "application/json");
  15. //  实例上传处理器,并将 postData 设置为上传的数据
  16. requestPost.uploadHandler = new UploadHandlerRaw(postData);
  17. //  使用构造函数创建 Post 请求,需要实例下载器存储数据及上传处理器
  18. //  通过静态方法 UnityWebRequest.Post() 创建Post请求,会自动实例分配下载处理器和上传处理器。
  19. requestPost.downloadHandler = new DownloadHandlerBuffer();
  20. yield return requestPost.SendWebRequest();
  21. if (requestPost.isHttpError || requestPost.isNetworkError)
  22. {
  23.    Debug.Log(requestPost.error);
  24. }
  25. else
  26. {
  27.    Debug.Log("图片生成中");
  28.    string text = requestPost.downloadHandler.text;
  29.    action.Invoke(text);
  30. }
  31. #endregion
复制代码


  • 界说吸收返回数据的对象。之条件到过,返回的图片信息是一个base64字符串数组,然后试了一下用List列表去吸收,也是可以的(毕竟列表也是通过数组实现的)。刚刚Postman测试的时间可以看到,返回的数据不止图片的信息一个,但只须要用到 images 这一个信息,以是只界说了这个对象用于吸收
  1. public class txt2imgReturnMes
  2. {
  3.    //  返回的图片信息是一个string字符串
  4.    //  使用 List ,Json数据有的值是空值,对于接收的数据类型个人更常用引用类型
  5.    public List<string> images;
  6.    //  public string[] images;
  7. }
复制代码


  • 剖析数据获取图片,反序列化获取的数据,然后将字符串转为byte字节流数据,天生图片,然后就可以了。
  1. StartCoroutine(PostRequest(Url, (string str) =>
  2. {
  3.     Debug.Log(str);
  4.     txt2img_ReturnMes byteMes = JsonConvert.DeserializeObject<txt2img_ReturnMes>(str);
  5.     Debug.Log("获取返回数据");
  6.     Debug.Log(byteMes.images.Count);
  7.    
  8.     byte[] bytes = Convert.FromBase64String(byteMes.images[0]);
  9.     Texture2D texture = new Texture2D(1, 1);
  10.     texture.LoadImage(bytes);
  11.     image.texture = texture;
  12.     byte[] bytes2 = Convert.FromBase64String(byteMes.images[1]);
  13.     Texture2D texture2 = new Texture2D(1, 1);
  14.     texture2.LoadImage(bytes2);
  15.     image2.texture = texture2;
  16. }));
复制代码


  • 出图,看起来还行,没那么抽象了哈哈哈

研究一下这些调试的参数,反面再去研究一下图生图,看能不能通过用户照相直接天生一张图出来。
有题目的地方还请各位指正,感谢。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表