Artigo
· Dez. 26, 2023 8min de leitura

Integração de Open AI com o IRIS - Gerenciamento de arquivos

 

A inteligência artificial não é limitada apenas a gerar imagens por texto com instruções ou criar narrativas com direções simples.

Você também pode criar variações de uma foto ou incluir um plano de fundo especial a um já existente.

Além disso, você pode obter a transcrição de áudio, não importando o idioma e a velocidade do falante.

Então, vamos analisar como o gerenciamento de arquivos funciona.

O problema

Ao analisar as informações da OpenAI sobre os métodos que exigem um arquivo como valor de entrada, os parâmetros precisam ser fornecidos usando um multipart/form-data.

No IRIS, sabemos como criar uma chamada para um método POST usando conteúdo JSON. No entanto, nesse caso, usar um parâmetro com o conteúdo do arquivo no formato Base64 não será prático.

Para incluir o conteúdo do arquivo em um multipart/form-data, você precisa usar a classe %Net.MIMEPart.

Para incluir um arquivo na nossa chamada, você deve criar um cabeçalho Content-Disposition com o objeto de classe %Net.MIMEPart

set content = ##class(%Net.MIMEPart).%New()
set contentDisposition = "form-data; name="_$CHAR(34)_"image"_$CHAR(34)
set contentDisposition = contentDisposition_"; filename="_$CHAR(34)_fileName_$CHAR(34)
do content.SetHeader("Content-Disposition",contentDisposition)

Como utilizamos uma classe de Solicitação para reter os valores do nosso processo, precisamos converter o conteúdo em Base64 em um stream que constituirá o Corpo do nosso conteúdo.

Podemos operar o utilitário StreamUtils para converter o Base64 em um Stream.

Observação: a variável "pImage" contém a string Base64 do conteúdo do arquivo.

Do ##class(HS.Util.StreamUtils).Base64Encode(pImage, .tStream)
Set content.Body = tStream

Ainda assim, há um truque melhor que tive a sorte de aprender com um especialista da InterSystems no Global Summit 2023. Ele me ensinou que a execução é mais eficaz que StreamUtils, que, no final, tem um loop que lê a String e registra no Stream.

Essa solução é tão simples quanto usar um JSON e fazer o Get que o converte em um Stream.

set contentfile = {}
set contentfile.file = pImage
set content.Body = contentfile.%Get("file",,"stream<base64")

Depois de incluir todos os parâmetros necessários na chamada, podemos finalmente criar uma nova classe MIMEPart para envolver as partes.

Set rootMIME = ##class(%Net.MIMEPart).%New()
do rootMIME.Parts.Insert(content)
set writer = ##class(%Net.MIMEWriter).%New()
set tSC = writer.OutputToStream(tHttpRequest.EntityBody)
set tSC = writer.WriteMIMEBody(rootMIME)
Set tContentType = "multipart/form-data; boundary="_rootMIME.Boundary
set tSC = ..Adapter.SendFormDataArray(.tHttpResponse, "POST", tHttpRequest,,,url)

É assim que enviamos o conteúdo do arquivo para o método que precisamos na OpenAI.

Arquivos de imagem

O método de imagem permite enviar uma imagem e realizar uma variação. Como todas as ilustrações precisam estar no formato PNG, quando indicamos o conteúdo do arquivo no formato Base64, o nome do arquivo é gerado aleatoriamente com a extensão PNG.

Este é um exemplo de como isso altera uma foto.

Original Variação

Como você pode ver, o programa interpretou as instruções da sua própria maneira.

Ele decidiu que o logotipo da empresa era um círculo, então o substituiu por outro. Ele também reconheceu que o escritório tinha uma porta de vidro e a substituiu por outra, mas com uma parede de tijolos agora.

Além disso, ele modificou a cor da camisa e mudou a posição dos braços do homem.

Além disso, a OpenIA permite que você edite uma imagem ao fornecer uma máscara com a área em que deseja inserir o conteúdo indicado no prompt.

Utilizando a mesma imagem, apliquei uma máscara que removeu o plano de fundo da imagem.

Original Máscara

Quando pedi para me transportar para uma praia jamaicana, obtive o seguinte resultado:

Agora, você pode se gabar das suas férias na próxima vez que encontrar seus amigos e familiares 😊

Imagem

Endpoint: POST https://api.openai.com/v1/images/variations

Isso permite que você crie uma modificação de uma imagem existente. Como não é necessário um prompt indicando as alterações desejadas, temos que confiar no gosto da IA em como ela interpretaria essa imagem. Além disso, é possível definir o tamanho e a forma como queremos que o resultado seja retornado, por exemplo, através de um link ou conteúdo em Base64.

Os parâmetros de entrada seriam os mencionados abaixo:

  • image: obrigatório
  • Aqui, você menciona o arquivo de imagem que deseja transformar.
  • n: opcional. Padrão 1
  • Nessa área, você determina o número máximo de imagens geradas. (Use números entre 1 e 10).
  • size: opcional. Padrão 1024x1024
  • Esse parâmetro caracteriza o tamanho da imagem gerada. O valor precisa ser "256x256", "512x512" ou "1024x1024".
  • response_format: opcional. Por padrão, é "url"
  • Esse elemento se refere ao formato desejado para retornar as imagens geradas. Os valores devem ser "url" ou "b64_json".

Endpoint: POST https://api.openai.com/v1/images/edits

Ele deixa você modificar uma imagem existente que, com base no arquivo de máscara, criará uma imagem de acordo com o prompt. Além disso, podemos especificar as dimensões e a forma como o resultado deve ser retornado, por exemplo, através de um link ou conteúdo em Base64.

Os parâmetros de entrada devem ser os seguintes:

  • image: obrigatório
  • Aqui, você menciona o arquivo de imagem que deseja alterar.
  • mask: obrigatório
  • Essa parte é relacionada ao arquivo de imagem da máscara que deve ser aplicada.
  • n: opcional. Padrão 1
  • Nessa área, você determina o número máximo de imagens geradas. (Use números entre 1 e 10).
  • size: opcional. Padrão 1024x1024
  • Esse parâmetro caracteriza o tamanho da imagem gerada. O valor precisa ser "256x256", "512x512" ou "1024x1024".
  • response_format: opcional. Por padrão, é "url"
  • Esse elemento se refere ao formato desejado para retornar as imagens geradas. Os valores devem ser "url" ou "b64_json".

Arquivos de áudio

As imagens não são os únicos arquivos gerenciados pela OpenAI. Também podemos usar arquivos de áudio para obter uma transcrição ou tradução da gravação fornecida.

Esse método usa o modelo Whisper, que permite diferenciar nomes próprios, marcas e gírias para oferecer transcrição e tradução corretas. Por exemplo, falar sobre "micromachine" como uma marca não é o mesmo que traduzir "micromachines" como um substantivo comum para o espanhol.

O exemplo a seguir é a transcrição de um comercial bem conhecido dos anos 80:

https://www.youtube.com/embed/zLP6oT3uqV8
[Isso é um link incorporado, mas você não pode ver conteúdo incorporado diretamente no site, porque recusou os cookies necessários para acessá-lo. Para ver o conteúdo incorporado, você precisa aceitar todos os cookies nas suas Definições de cookies]

Portanto, ao instruir o Whisper a fazer uma transcrição do áudio, o resultado é o seguinte:

{
    "text": "This is the Micromachine Man presenting the most midget miniature motorcade of micromachines. 
Each one has dramatic details, terrific trim, precision paint jobs, plus incredible micromachine pocket playsets. 
There's a police station, fire station, restaurant, service station, and more. Perfect pocket portables to take anyplace. 
And there are many miniature playsets to play with and each one comes with its own special edition micromachine vehicle and 
fun fantastic features that miraculously move. Raise the boat lift at the airport, marina, man the gun turret at 
the army base, clean your car at the car wash, raise the toll bridge. And these playsets fit together to form a micromachine world.
Micromachine pocket playsets, so tremendously tiny, so perfectly precise, so dazzlingly detailed, you'll want to pocket them all.
Micromachines and micromachine pocket playsets sold separately from Galoob. The smaller they are, the better they are."
}

Incrível! Você não acha?

O resultado acima mencionado é possível devido ao treinamento que o modelo Whisper recebeu. Podemos ver algumas informações sobre isso no diagrama a seguir oferecido pela página da OpenAI.

 

Confira mais informações em https://openai.com/research/whisper

Lembre-se de que é fundamental informar ao programa o nome do arquivo, porque o serviço precisa saber o tipo de arquivo que está processando (por exemplo, WAV, MP3, OGG etc.).

Como só incluímos o conteúdo em Base64 na nossa chamada, também precisamos indicar a extensão do arquivo para criar o nome do arquivo com texto aleatório e a extensão sugerida.

Por exemplo, a mensagem St.OpenAi.Msg.Audio.AudioRequest tem a propriedade "type" para revelar o tipo de áudio: MP3, OGG, WAV, FLAC etc.

Endpoint: https://api.openai.com/v1/audio/transcriptions

Esse método deixa você transcrever o conteúdo de áudio no idioma do áudio.

Os parâmetros de entrada devem ser os seguintes:

  • file: obrigatório
  • Aqui, você especifica o arquivo de áudio que deseja transcrever (não o nome do arquivo). Os seguintes formatos são compatíveis: FLAC, MP3, MP4, MPEG, MPGA, M4A, OGG, WAV ou WEBM
  • model: obrigatório.
  • O modelo que será usado para fazer a transcrição. Por enquanto, somente "whisper-1" está disponível
  • language: opcional. Por padrão, é o idioma do áudio.
  • Se indicado, de acordo com o ISO-639-1, melhorará a precisão e latência.
  • prompt: opcional.
  • É um texto opcional para orientar o estilo do modelo ou continuar o segmento de áudio anterior. A mensagem aqui deve corresponder ao idioma do áudio.
  • response_format. Opcional. Por padrão, é "json".
  • Nesta parte, você indica o formato da saída da transcrição. Use uma das seguintes opções: "json", "text", "verbose_json".
  • temperature: opcional. Por padrão, o valor é 0.
  • A temperatura de amostragem deve estar entre 0 e 1. Valores mais altos, como 0,8, deixam a saída mais aleatória, enquanto valores mais baixos, como 0,2, a deixam mais focada e determinística. Se definido como 0, o modelo usará a probabilidade logarítmica para aumentar a temperatura automaticamente até que sejam atingidos limites específicos.

Veja a documentação para esse método em https://platform.openai.com/docs/api-reference/audio/createTranscription<.

Endpoint: https://api.openai.com/v1/audio/translations

Esse método deixa você traduzir o conteúdo de áudio para o inglês.

Os parâmetros de entrada devem ser os seguintes:

  • file: obrigatório
  • É o arquivo de áudio que você deseja traduzir (não o nome do arquivo). Os seguintes formatos são compatíveis: FLAC, MP3, MP4, MPEG, MPGA, M4A, OGG, WAV ou WEBM
  • model: obrigatório.
  • Nesse campo, você digita o modelo que será utilizado para fazer a transcrição. Por enquanto, somente "whisper-1" está disponível.
  • prompt: opcional.
  • É um texto opcional para orientar o estilo do modelo ou continuar o segmento de áudio anterior. A mensagem aqui deve estar em inglês.
  • response_format. Opcional. Por padrão, é "json".
  • Aqui você determina o formato da saída da transcrição como uma das seguintes opções: "json", "text", "verbose_json".
  • temperature: opcional. Por padrão, o valor é 0.
  • A temperatura de amostragem fica entre 0 e 1. Valores mais altos, como 0,8, deixam a saída mais aleatória, enquanto valores mais baixos, como 0,2, a deixam mais focada e determinística. Se definido como 0, o modelo usará a probabilidade logarítmica para aumentar a temperatura automaticamente até que sejam atingidos limites específicos.

Veja a documentação para esse método em https://platform.openai.com/docs/api-reference/audio/createTranscription.

O que vem a seguir?

Como a OpenAI está em evolução contínua, a próxima iteração será o método para converter texto em áudio e alguns outros novos recursos.

Lembre-se de marcar o artigo com uma "curtida" se você gostou.

Discussão (0)1
Entre ou crie uma conta para continuar