DALL-E e .NET: Gerando imagens com inteligência artificial

A integração de tecnologias de inteligência artificial em aplicações .NET tem se tornado cada vez mais comum, impulsionando a inovação e a criatividade em uma variedade de campos, desde design gráfico até desenvolvimento de jogos. Uma grande adição a esse panorama é a API do DALL-E, desenvolvida pela OpenAI. 

Neste artigo, exploraremos a integração da API do DALL-E em aplicações .NET. Vamos entender o que é o DALL-E, como ele funciona e como podemos aproveitar suas capacidades para criar imagens impressionantes diretamente de nossas aplicações .NET.

O que é o DALL-E?

O DALL-E é uma ferramenta desenvolvida pela OpenAI para geração de imagens e ilustrações únicas a partir de uma entrada textual do usuário. Ou seja, o usuário informa em formato de texto o que deseja que seja criado; o texto inserido é codificado em uma representação numérica; em seguida a rede neural generativa, treinada em um grande conjunto de dados de texto e imagem, começa a gerar uma imagem correspondente. Isso é feito através de uma série de camadas de rede neural, que transformam o vetor de entrada em uma representação visual.

O nome “DALL-E” é uma combinação de “Dali” e “WALL-E”.

“Dali” é uma referência ao famoso pintor surrealista espanhol Salvador Dalí, conhecido por suas obras de arte distintas e imaginativas. 

“WALL-E” é uma referência ao personagem principal do filme de animação da Pixar, “WALL-E”, que é um robô curioso e inventivo que desenvolve uma personalidade e um senso de criatividade ao longo do filme. 

Portanto, o nome “DALL-E” evoca a ideia de uma ferramenta de inteligência artificial capaz de gerar imagens artisticamente criativas e únicas, em homenagem à imaginação de Salvador Dalí e à inventividade de WALL-E.

Ideias de implementações em projetos

Agora que vimos como que o DALL-E funciona e a origem do seu nome podemos pensar em formas de implementar essa ferramenta de geração de imagens em nossas aplicações .NET. 

Abaixo vamos implementar um código base para uma aplicação .NET que faz chamadas HTTP para a API do DALL-E. O retorno dessa chamada pode ser processado e implementado, por exemplo, em sites de geração de imagens para histórias infantis em tempo real, onde é gerado uma imagem com base na história apresentada.

Outra possibilidade seria a geração de personagens para jogos 2D com base em descrições de aparência e personalidade. Isso seria particularmente útil para desenvolvedores de jogos que procuram uma maneira eficiente de criar uma variedade de personagens únicos e interessantes.

Também é possível implementar a criação de avatares personalizados para perfis de usuários, disponibilizando a opção de gerar avatares únicos e personalizados com base nas informações fornecidas durante o cadastro. Esses avatares podem ser adaptados de acordo com as preferências do usuário em relação a características físicas, estilo de cabelo, roupas e acessórios, proporcionando uma representação visual personalizada.

Como funciona a integração com o DALL-E

A integração com o DALL-E se dá por meio da sua API RESTful. Por meio dessa API, enviamos solicitações contendo descrições textuais e recebemos imagens geradas como resposta. É fundamental destacar que essas solicitações precisam ser autorizadas utilizando uma chave de API, disponível através do site da OpenAI. Assim, ao integrar o DALL-E em nossas aplicações, podemos utilizar clientes HTTP para interagir diretamente com a API. 

Criando o projeto .NET

Para a nossa aplicação de exemplo vamos utilizar um projeto de uma API construída em ASP.NET. Abaixo vemos a estrutura base da nossa aplicação na qual vamos adicionar o nosso código. Note que neste exemplo temos um controller chamado GenerateImageController e uma action do tipo POST chamada GenerateImg, recebendo um parâmetro “query”, que será a mensagem que enviaremos ao DALL-E. Adicionamos também um bloco try-catch para o caso de ocorrer algum erro em nossa aplicação.

				
					using Microsoft.AspNetCore.Mvc;
using System.Text;
using System.Text.Json;

namespace GenerateImageDALL_E.Controllers
{
	[Route("api/[controller]")]
	[ApiController]
	public class GenerateImageController : Controller
	{
		[HttpPost]
		public async Task<ActionResult> GenerateImg(string query)
		{
			try
			{
				//Nosso código
			}
			catch (Exception ex)
			{
				return StatusCode(500, $"Erro ao gerar a imagem: {ex.Message}");
			}
		}
	}
}
				
			

Com a nossa estrutura base definida, vamos agora implementar a lógica da action GenerateImg. O primeiro passo será armazenar a nossa chave gerada no site da OpenAI em uma string para que possamos utilizá-la nas nossas requisições. Em projetos reais é indicado guardar a chave em um local seguro.

Caso não saiba como gerar uma chave no site da OpenAI, nós temos um tutorial que ensina desde a criação da conta até a geração da chave.

				
					string openaiApiKey = "sua chave aqui";
				
			

Em seguida, vamos iniciar a construção do corpo da nossa requisição, que será feito com um objeto dinâmico em que adicionaremos os campos necessários.

				
					var requestBody = new
{
    model = "dall-e-3",
    prompt = query,
    n = 1,
    size = "1024x1024",
    quality = "hd"
}; 
				
			

No campo “model”, podemos especificar qual modelo queremos utilizar. Neste caso, optamos pelo “dall-e-3”. Uma alternativa seria o modelo “dall-e-2”, mas ele apresenta desempenho inferior.

No campo “prompt” vamos inserir o conteúdo da mensagem, que aqui é o valor recebido no nosso endpoint através do parâmetro “query”.

No campo “n” deve ser informado quantas imagens vão ser geradas. Podemos solicitar 1 imagem por vez com “dall-e-3” (é possível solicitar mais fazendo solicitações paralelas) ou até 10 imagens por vez usando “dall-e-2”.

No campo “size” vamos definir o tamanho da nossa imagem. As imagens podem ter um tamanho de 1024×1024, 1024×1792 ou 1792×1024 pixels.

Caso você não declare o campo “quality” a imagem será gerada como “standard”, mas ao usar o DALL·E 3 você pode definir a qualidade como “hd”, que cria imagens com detalhes mais aprimorados. 

Agora precisamos realizar a serialização do nosso objeto “requestBody” para poder enviá-lo em nossa requisição.

				
					var requestBodyJson = JsonSerializer.Serialize(requestBody);
				
			

Após criar o JSON, vamos criar um cliente HTTP para fazer a solicitação à API da OpenAI.

				
					using (var httpClient = new HttpClient())
{
    //nosso código
}
				
			

O código da requisição será dividido em três partes. Primeiro, adicionamos nossa chave de autorização no cabeçalho da requisição:

				
					httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {openaiApiKey}");
				
			

Em seguida, enviamos a solicitação usando o método POST:

				
					var response = await httpClient.PostAsync("https://api.openai.com/v1/images/generations",
					  new StringContent(requestBodyJson, Encoding.UTF8, application/json"));
				
			

E por fim, validamos se a requisição foi bem-sucedida. Se positivo, vamos ler a resposta como uma string e desserializar para um JsonElement. Após isso, podemos capturar apenas a URL da imagem e retornar na nossa API um status de sucesso e o link da nossa imagem. Se negativo, retornamos o status BadRequest. 

				
					if (response.IsSuccessStatusCode)
{
	string responseBody = await response.Content.ReadAsStringAsync();
	var responseObject = JsonSerializer.Deserialize(responseBody);
	string content = responseObject.GetProperty("data")[0].GetProperty("url").GetString();
	return Ok(content);
}
else
{
	return BadRequest(response.StatusCode);
}
				
			

Ao executarmos a aplicação é possível enviar uma query e receber o link de uma imagem. As URLs das imagens expiram após 1 hora, portanto, dependendo da aplicação é indicado salvar a imagem.

Abaixo vemos um exemplo de requisição no Swagger:

E abrindo a URL da imagem, temos o seguinte resultado:

Neste artigo vimos uma demonstração da capacidade da inteligência artificial quando combinada com a robustez e flexibilidade do ambiente .NET, que serve de ponto de partida para o desenvolvimento de uma ampla gama de cenários, desde a criação de artes para sites simples até a geração de conteúdo visual para aplicações de software em larga escala. Ao aproveitar as capacidades dessas duas áreas, os desenvolvedores podem criar aplicativos mais inteligentes, eficientes e adaptáveis, impulsionando assim a próxima geração de tecnologia.

Acelere a sua carreira conosco!

Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui

Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui

Conclusão

Neste artigo vimos uma demonstração da capacidade da inteligência artificial quando combinada com a robustez e flexibilidade do ambiente .NET, que serve de ponto de partida para o desenvolvimento de uma ampla gama de cenários, desde a criação de artes para sites simples até a geração de conteúdo visual para aplicações de software em larga escala. Ao aproveitar as capacidades dessas duas áreas, os desenvolvedores podem criar aplicativos mais inteligentes, eficientes e adaptáveis, impulsionando assim a próxima geração de tecnologia.