stable diffusion webui 文生图(txt2img)api接口调用(使用C#)

[复制链接]
查看882 | 回复0 | 2023-8-11 20:47:45 | 显示全部楼层 |阅读模式
唠嗑

本次将跟读者讲一下如何通过C#请求sd webui api 【txt2img】接口,如果读者觉得文章有用,请给【点个赞】吧,有问题可以评论区提问。
实战

1.配置api启用参数

启动webui时,需加上【–api】 命令以保证api接口可以被调用。如果需要设置密码,可以通过【–api-auth 账号:密码】和【–gradio-auth 账号:密码】 的方式启用。如下图所示的方式,进行开启即可。
注:这里只设置–api-auth的密码是无效了,login接口,是用于ui页面登录的,原有代码是没有api-auth接口返回token的。(如果说错了,欢迎指正)

2.本地运行

访问http://127.0.0.1:7860/docs 可以看到swagger文档,但是有时候,会发现访问不到,且报了超时的错误。
原因是swagger界面有js文件是引用cdn的,如果科学上网就一定可以访问到,不科学上网,则有时可以有时不行!


3.代码实战

3.1请求/响应类

创建一个C#项目,这里我用控制台,也可以是webapi、mvc等都可以的。如下,创建两个dto类
  1. /// <summary>
  2.     ///  Txt2Img 文生图 请求实体类
  3.     /// </summary>
  4.     public partial class Text2ImgRequestDto
  5.     {
  6.         /// <summary>
  7.         /// 高度(不适用这个去设置,容易导致图片生成重复的内容,因sd的模型,一般都是基于512去训练的)
  8.         /// </summary>
  9.         public long? height { get; set; } = 512;
  10.         /// <summary>
  11.         /// 宽度(不适用这个去设置,容易导致图片生成重复的内容,因sd的模型,一般都是基于512去训练的)
  12.         /// </summary>
  13.         public long? width { get; set; } = 512;
  14.         /// <summary>
  15.         /// 反向提示词
  16.         /// </summary>
  17.         public string? negative_prompt { get; set; }
  18.         /// <summary>
  19.         /// 正向提示词
  20.         /// </summary>
  21.         public string prompt { get; set; }
  22.         /// <summary>
  23.         /// 面部修复(画人像的时候可以考虑使用)
  24.         /// </summary>
  25.         public bool? restore_faces { get; set; } = false;
  26.         /// <summary>
  27.         /// 总批次数
  28.         /// </summary>  
  29.         public long? n_iter { get; set; } = 1;
  30.         /// <summary>
  31.         /// 单批数量(每次生成的图片数量)
  32.         /// </summary>
  33.         public long? batch_size { get; set; } = 4;
  34.         /// <summary>
  35.         /// Sampler 采样方法,默认Euler
  36.         /// </summary>
  37.         public string sampler_index { get; set; } = "Euler a";
  38.         /// <summary>
  39.         /// 随机种子数,默认为-1
  40.         /// </summary>
  41.         public long? seed { get; set; } = -1;
  42.         /// <summary>
  43.         /// 生成步数,默认20
  44.         /// </summary>
  45.         public long? steps { get; set; } = 20;
  46.         
  47.         /// <summary>
  48.         /// 平铺
  49.         /// </summary>
  50.         public bool? tiling { get; set; } = false;
  51.         /// <summary>
  52.         /// 设置模型(不设置会自动有默认的模型)
  53.         /// </summary>
  54.         //public Dictionary<string, object> override_settings { get; set; }  = new Dictionary<string, object>() { { "sd_model_checkpoint", "deliberate_v2.ckpt" } };
  55.         / <summary>
  56.         / Hr Resize X
  57.         / </summary>
  58.         //public long? hr_resize_x { get; set; }
  59.         / <summary>
  60.         / Hr Resize Y
  61.         / </summary>
  62.         //public long? hr_resize_y { get; set; }
  63.         / <summary>
  64.         / 放大倍数
  65.         / </summary>
  66.         //public string hr_upscaler { get; set; }
  67.         /// <summary>
  68.         /// 关键词相关性
  69.         /// </summary>
  70.         public double? cfg_scale { get; set; } = 7;
  71.     }
复制代码
  1. /// <summary>
  2.     /// 文生图 响应体类
  3.     /// </summary>
  4.     public class Text2ImgResponseDto
  5.     {
  6.         /// <summary>
  7.         /// 生成的图片数组
  8.         /// </summary>
  9.         public List<string> images = new List<string>();
  10.         /// <summary>
  11.         /// request请求中的body
  12.         /// </summary>
  13.         public Text2ImgRequestDto parameters = new Text2ImgRequestDto();
  14.         /// <summary>
  15.         /// 返回的图片数组生成参数信息
  16.         /// </summary>
  17.         public string? info { get; set; }
  18.     }
复制代码
3.2请求sd api接口

1、在控制台程序中,需要安装【RestSharp】和【Newtonsoft.Json】nuget包,一个用于做api请求,另一个用于json的序列化。

2、添加以下代码到你的项目中,直接运行即可,请求的是本地运行的接口,如下的【http://127.0.0.1:7860/sdapi/v1/txt2img】,需要替换为读者自己的路径。
3、设置请求头:如果读者本地设置了api接口访问需要登录,则需要在header中添加【Authorization】,并设置token。
4、设置请求体:需要创建一个【Text2ImgRequestDto】对象,并且【prompt(提示词)】属性值需要进行赋值,以保证sd接口的正常调用。
  1. using ConsoleApp1;
  2. using Newtonsoft.Json;
  3. using RestSharp;
  4. using System.Threading.Channels;
  5. //使用restclient进行请求
  6. var client = new RestClient("http://127.0.0.1:7860/sdapi/v1/txt2img");
  7. var request = new RestRequest();
  8. //添加i请求头
  9. request.AddHeader("Content-Type", "application/json");
  10. //request.AddHeader("Authorization", "Basic xxxxxx");  //如果启动时加了--api-auth,则需要加上token,否则会返回
  11. request.AddHeader("Accept", "*/*");
  12. request.AddHeader("Connection", "keep-alive");
  13. //构造请求体内容,param中的参数,可以看【Text2ImgRequestDto】中的解析
  14. var param = new Text2ImgRequestDto();
  15. param.prompt = "a hat cat";//提示词
  16. request.AddParameter("application/json", param, ParameterType.RequestBody);
  17. RestResponse response = client.Post(request);
  18. var result = JsonConvert.DeserializeObject<Text2ImgResponseDto>(response.Content);
  19. Console.WriteLine("执行完!");
复制代码
5、执行请求:执行RestClient的Post方法进行请求。
6、json序列化:使用【Newtonsoft.Json】的【JsonConvert.DeserializeObject】将请求结果转为实体类,如下图:
(1)images:是接口返回给我们的base64图片数组,因【Text2ImgRequestDto】设置了默认生成【4张图】,所以这里的数组长度为【4】。
(2)parameters:request请求中的body。
(3)info:返回的图片数组生成参数信息

3.4效果图

复制images数组其中一张图片的base64值,在网上找一个base64转图片的在线工具,粘贴后,可以看到生成的图片如下,这表示我们成功通过接口请求了sd webui api接口。

Request failed with status code Unauthorized

如果调用接口时,报了“Request failed with status code Unauthorized”错误,这个时候,需要看看是不是加了"–api-auth"参数?如果是的话,则需要请求token后,加到请求token中才可以。可以参考我的这篇文章的方式去请求token。

如果还是会报权限的异常,可以用以下的方式,传递账密进行调用


来源:https://blog.csdn.net/qq_40600379/article/details/131147196
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则