通过使用.NET C#,我们可以开发一个POC(概念验证),使用Open AI的DALL-E模型从文本输入生成图像。
在这篇博文中,我们将探讨使用Open AI的DALL-E模型开发一个C#Console Application
,从文本中生成图像的步骤。
💬 什么是Open AI的DALL-E?
DALL-E几乎可以生成任何东西的图像,从黄色的潜水艇到有翅膀的猪。它已经在大量的图像和文本描述的数据集上进行了训练,使它能够学习如何从自然语言输入中生成图像。在这篇文章中,我们将探讨如何将C#与DALL-E结合起来,用代码生成图像。
DALL-E生成的
🧵用C语言开发
在这个项目中,我们将使用Visual Studio和C#与.NET 6来创建一个控制台应用程序。
💡 如果你打算使用其他.NET版本,你可能需要做一些调整。
第1步:控制台应用程序和依赖性
让我们用C#和.NET 6创建我们的控制台应用程序,让我们安装依赖性。
项目名称: ConsoleAppOpenAI.DALL_E
dotnet add Microsoft.Extensions.Http
👇 these are for loading configuration from JSON files
dotnet add Microsoft.Extensions.Configuration
dotnet add Microsoft.Extensions.Configuration.Json
👇 this is optional
dotnet add Microsoft.Extensions.Configuration.UserSecrets
进入全屏模式 退出全屏模式
安装依赖项的命令
已安装的依赖项
步骤2:IOpenAIProxy接口
在这个接口中,我们将只公开从Open AI生成和下载图片的方法。
namespace ConsoleAppOpenAI.DALL_E.HttpServices;
public interface IOpenAIProxy
{
//👇 Send the Prompt Text with and return a list of image URLs
Task<GenerateImageResponse> GenerateImages(
GenerateImageRequest prompt,
CancellationToken cancellation = default);
//👇 Download the Image as byte array
Task<byte[]> DownloadImage(string url);
}
进入全屏模式 退出全屏模式
IOpenAIProxy.cs文件
第3步:生成图像模型
让我们用记录来定义我们的模型。记录简化了阅读,因为它们只是POCO类。
namespace ConsoleAppOpenAI.DALL_E.HttpServices
{
public record class GenerateImageRequest(
string Prompt,
int N,
string Size);
public record class GenerateImageResponse(
long Created,
GeneratedImageData[] Data);
public record class GeneratedImageData(string Url);
}
进入全屏模式 退出全屏模式
生成图像模型DTO
第4步:创建一个Open AI账户
为了使用OpenAI的API,我们需要在OpenAI平台上创建一个账户。注册过程很简单,在几分钟内就可以完成。
- 我们只需要访问OpenAI的网站:platform.openai.com/overview。
- 然后点击右上角的 “注册 “按钮。
- 点击该按钮,开始注册过程。
第5步:设置配置文件/appsettings.json
为了访问DALL-E模型,我们需要为我们的应用程序设置订阅ID和API密钥。
从这些菜单中收集它们:
用这些值更新appsettings.json
或secrets.json
文件。
{
"OpenAi": {
"OrganizationId": "{Subscription Id goes here}",
"ApiKey": "{API Key goes here}",
"Url": "https://api.openai.com",
"DALL-E": {
"Size": "1024x1024",
"N": 1
}
}
}
进入全屏模式 退出全屏模式
appsettings.json文件
💡 不要忘记将复制到输出目录设置为Copy if newerfor appsettings.json。
第6步:打开AI HTTP服务实现
创建一个名为OpenAIHttpService
的类,有一个接收IConfiguration
的构造函数,并读取我们刚才设置的配置。
using ConsoleAppOpenAI.DALL_E.HttpServices;
using Microsoft.Extensions.Configuration;
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
namespace ConsoleAppOpenAI.DALL_E.Services;
public class OpenAIHttpService : IOpenAIProxy
{
readonly HttpClient _httpClient;
readonly string _subscriptionId;
readonly string _apiKey;
public OpenAIHttpService(IConfiguration configuration)
{
//👇 reading settings from the configuration file
var openApiUrl = configuration["OpenAi:Url"] ?? throw new ArgumentException(nameof(configuration));
_httpClient = new HttpClient { BaseAddress = new Uri(openApiUrl) };
_subscriptionId = configuration["OpenAi:SubscriptionId"];
_apiKey = configuration["OpenAi:ApiKey"];
}
public async Task<GenerateImageResponse> GenerateImages(GenerateImageRequest prompt, CancellationToken cancellation = default)
{
throw new NotImplementedException();
}
public async Task<byte[]> DownloadImage(string url)
{
throw new NotImplementedException();
}
}
进入全屏模式 退出全屏模式
接下来应该是GenerateImages()
方法的实现:
public async Task<GenerateImageResponse> GenerateImages(GenerateImageRequest prompt, CancellationToken cancellation = default)
{
using var rq = new HttpRequestMessage(HttpMethod.Post, "/v1/images/generations");
var jsonRequest = JsonSerializer.Serialize(prompt, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
//serialize the content to JSON and set the correct content type
rq.Content = new StringContent(jsonRequest);
rq.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
//👇 Including the Authorization Header with API Key
var apiKey = _apiKey;
rq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
//👇 Including the Subscription Id Header
var subscriptionId = _subscriptionId;
rq.Headers.TryAddWithoutValidation("OpenAI-Organization", subscriptionId);
var response = await _httpClient.SendAsync(rq, HttpCompletionOption.ResponseHeadersRead, cancellation);
response.EnsureSuccessStatusCode();
var content = response.Content;
var jsonResponse = await content.ReadFromJsonAsync<GenerateImageResponse>(cancellationToken: cancellation);
return jsonResponse;
}
进入全屏模式 退出全屏模式
最后是DownloadImage()
方法的实现:
public async Task<byte[]> DownloadImage(string url)
{
var buffer = await _httpClient.GetByteArrayAsync(url);
return buffer;
}
进入全屏模式 退出全屏模式
第7步:消耗API
回到Program.cs
文件,让我们把所有东西连在一起,开始调用 API 来生成图像。
using ConsoleAppOpenAI.DALL_E.HttpServices;
using ConsoleAppOpenAI.DALL_E.Services;
using Microsoft.Extensions.Configuration;
using System.Reflection;
Console.WriteLine("Starting commandline for DALL-E [Open AI]");
var config = BuildConfig();
IOpenAIProxy aiClient = new OpenAIHttpService(config);
Console.WriteLine("Type your first Prompt");
var msg = Console.ReadLine();
var nImages = int.Parse(config["OpenAi:DALL-E:N"]);
var imageSize = config["OpenAi:DALL-E:Size"];
var prompt = new GenerateImageRequest(msg, nImages, imageSize);
var result = await aiClient.GenerateImages(prompt);
foreach (var item in result.Data)
{
Console.WriteLine(item.Url);
var fullPath = Path.Combine(Directory.GetCurrentDirectory(), $"{Guid.NewGuid()}.png");
var img = await aiClient.DownloadImage(item.Url);
await File.WriteAllBytesAsync(fullPath, img);
Console.WriteLine("New image saved at {0}", fullPath);
}
Console.WriteLine("Press any key to exit");
Console.ReadKey();
static IConfiguration BuildConfig()
{
var dir = Directory.GetCurrentDirectory();
var configBuilder = new ConfigurationBuilder()
.AddJsonFile(Path.Combine(dir, "appsettings.json"), optional: false)
.AddUserSecrets(Assembly.GetExecutingAssembly());
return configBuilder.Build();
}
进入全屏模式 退出全屏模式
做完这些,我们应该有一个与DALL-E模型集成的运行POC。
生成我们的第一个图像
这是我第一次尝试的输出。
Prompt: Wide and green garden with a lot of flowers, with sunflowers, and a small dog running around
进入全屏模式 退出全屏模式
看看这个由我们的应用程序和DALL-E生成的美丽图像。
总结
将C#与DALL-E集成是一个简单的过程,它允许我们以编程方式生成图像。
通过使用Open AI的API,我们可以轻松地发送文本描述,并收到高质量的图像作为回应。
这种整合开辟了许多可能性,如为数据可视化生成图像,创建自定义艺术品,或自动化图像创建任务。随着DALL-E的不断完善,我们可以期待未来有更多令人兴奋的应用。