Artículo
· 8 dic, 2023 Lectura de 9 min

Integración Open AI con IRIS - Gestión de ficheros

 

La inteligencia artificial no se limita solo a generar imágenes a través de texto con instrucciones o crear narrativas con instrucciones sencillas.

También puedes hacer variaciones de una imagen o incluir un fondo especial a una ya existente.

Adicionalmente, podrás obtener la transcripción del audio sin importar su idioma y la velocidad del hablante.

Por tanto, analicemos cómo funciona la gestión de archivos.

El problema

Al analizar la información de OpenAI sobre los métodos que requieren un archivo como valor de entrada, los parámetros deben proporcionarse utilizando un multipart/form-data.

En IRIS sabemos cómo crear una llamada a un método POST utilizando contenido JSON. Sin embargo, en este caso, no será práctico utilizar un parámetro con el contenido del archivo en formato Base64.

Para incluir el contenido del archivo en un multipart/form-data, debe emplear la clase %Net.MIMEPart.

Para incluir un archivo en nuestra llamada, debe crear un encabezado Content-Disposition asociado con el objeto de clase %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)

Dado que utilizamos una clase Request para pasar los valores de nuestro proceso, debemos convertir el contenido Base64 en una stream que constituirá el body de nuestro contenido.

Podemos operar la utilidad StreamUtils para convertir Base64 en un Stream.

Nota: la variable “pImage” contiene la cadena Base64 del contenido del archivo.

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

Sin embargo, hay un truco mejor que tuve la suerte de aprender de un experto de InterSystems en el Global Summit 2023. Me enseñó que la ejecución es más efectiva que StreamUtils, que, al fin y al cabo, tiene un bucle que lee la cadena y los registros en el stream.

Esta solución es tan simple como usar un JSON y hacer el Get que lo convierte en un Stream.

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

Una vez incluido todos los parámetros requeridos en la llamada, crearemos finalmente una nueva clase MIMEPart que englobe las 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)

Así es como enviamos el contenido del archivo al método que necesitamos en OpenAI.

Archivos de imagen

El método de imagen le permite enviar una imagen y realizar una variación. Dado que todas las ilustraciones deben estar en formato PNG, cuando indicamos el contenido del archivo en formato Base64, el nombre del archivo se genera aleatoriamente con la extensión PNG.

Aquí tienes un ejemplo de cómo modifica una foto.

 

Original Variación

Como puedes ver, el programa ha interpretado las instrucciones a su manera.

Se ha decidido que el logo de la empresa sea un círculo, por lo que lo ha sustituido por otro. También ha reconocido que la oficina tenía una puerta de cristal y la ha sustituido por otra pero por ahora con pared de ladrillo.

Además, ha modificado el color de la camiseta y cambiado la posición de los brazos del hombre.

Además, OpenIA te permite editar una imagen proporcionando una máscara con el área donde deseas insertar el contenido indicado en el mensaje.

Utilizando la misma imagen, apliqué una máscara que eliminó el fondo de la imagen.

Original Máscara

Cuando le pedí que me transportara a una playa de Jamaica, obtuve el siguiente resultado:

Ahora podrás presumir de tus vacaciones la próxima vez que veas a tus amigos y familiares 😊

Imagen

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

Le permite crear una modificación de una imagen ya existente. Dado que no requiere un mensaje que indique cómo desea modificarla, debemos confiar en el gusto de la IA sobre cómo interpretaría esta imagen. Además, podemos definir el tamaño y la forma en que queremos que se devuelva el resultado, ya sea a través de un enlace o contenido en Base64.

Los parámetros de entrada serían los que se mencionan a continuación:

  • image: obligatoria
  • Aquí mencionas el archivo de imagen que deseas transformar.
  • n: Opcional. Predeterminado 1
  • En esta área, usted determina la cantidad máxima de imágenes a generar. (Utilice números entre 1 y 10).
  • size: Opcional. Predeterminado 1024x1024
  • Este parámetro caracteriza el tamaño de la imagen generada. El valor aquí debe ser “256x256”, “512x512” o “1024x1024”.
  • response_format: Opcional. Por defecto, es “url”
  • Este elemento trata sobre el formato en el que desea que se devuelvan las imágenes generadas. Los valores aquí deben ser “url” o “b64_json”.

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

Le permite modificar una imagen existente que, basándose en el archivo de máscara, creará una imagen según el mensaje. Además, podemos especificar las dimensiones y la forma en que queremos que nos devuelva el resultado, ya sea a través de un enlace o contenido en Base64.

Los parámetros de entrada deben ser los siguientes:

  • image: obligatoria
  • Aquí mencionas el archivo de imagen que deseas modificar.
  • mask: obligatoria
  • Esta parte trata sobre el archivo de imagen de máscara que se debe aplicar.
  • n: Opcional. Predeterminado 1
  • En esta área, usted determina la cantidad máxima de imágenes a generar. (Utilice números entre 1 y 10).
  • size: Opcional. Predeterminado 1024x1024
  • Este parámetro caracteriza el tamaño de la imagen generada. El valor aquí debe ser “256x256”, “512x512” o “1024x1024”.
  • response_format: opcional. Por defecto, es “url”
  • Este elemento trata sobre el formato en el que desea que se devuelvan las imágenes generadas. Los valores aquí deben ser “url” o “b64_json”.

Archivos de audio

Las imágenes no son las únicas que gestiona OpenAI. También podemos utilizar archivos de audio para obtener una transcripción o traducción de la grabación proporcionada.

Este método utiliza el modelo Whisper, que le permite diferenciar nombres propios, marcas y jerga para proporcionar una transcripción y traducción correcta. Por ejemplo, no es lo mismo hablar de “micromachine” como marca que traducir “micromáquinas” como sustantivo común al español.

El siguiente ejemplo es una transcripción de un conocido anuncio publicitario de los años 80:

https://www.youtube.com/embed/zLP6oT3uqV8
[Este es un enlace integrado, pero no puede ver el contenido integrado directamente en el sitio porque rechazó las cookies que se necesitan para acceder a él. Para ver el contenido integrado, debe aceptar todas las cookies desde la Configuración de cookies]

Entonces, el resultado de indicarle a Whisper que haga una transcripción del audio para nosotros es el que se indica a continuación:

{
    "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."
}

¡Es increíble! ¿No lo crees?

El resultado mencionado anteriormente es posible gracias al entrenamiento que ha recibido el modelo Whisper. Podemos ver algo de información al respecto en el siguiente diagrama que ofrece la página de OpenAI.

 

Puede encontrar más información en https://openai.com/research/whisper

Recuerde que es crucial informar al programa sobre el nombre del archivo porque el servicio necesita saber qué tipo de archivo está procesando (por ejemplo, WAV, MP3, OGG, etc.).

Dado que solo incluimos el contenido Base64 en nuestra llamada, también debemos indicar la extensión del archivo para crear el nombre del archivo con texto aleatorio y la extensión sugerida.

Por ejemplo, el mensaje St.OpenAi.Msg.Audio.AudioRequest tiene la propiedad "type" para revelar el tipo de audio: MP3, OGG, WAV, FLAC, etc.

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

Este método le permite transcribir el contenido de audio al idioma de audio.

Los parámetros de entrada deben ser los siguientes:

  • file: obligatorio
  • Aquí especificas el archivo de audio que deseas transcribir (no el nombre del archivo). Admite los siguientes formatos: FLAC, MP3, MP4, MPEG, MPGA, M4A, OGG, WAV o WEBM
  • model: Requerido.
  • El modelo a utilizar para realizar la transcripción. Por ahora, sólo está disponible “whisper-1”
  • language: Opcional. Por defecto, es el idioma del audio.
  • Si se indica, según ISO-639-1, mejorará la precisión y la latencia.
  • prompt: opcional.
  • Es un texto opcional para guiar el estilo del modelo o continuar con el segmento de audio anterior. El mensaje aquí debe coincidir con el idioma del audio.
  • response_format: Opcional. Por defecto, es "json".
  • En esta parte, aclara el formato de la salida de la transcripción. Utilice una de las siguientes opciones: “json”, “text”, “verbose_json”.
  • temperature: Opcional. De forma predeterminada, el valor es 0.
  • La temperatura de muestreo debe estar entre 0 y 1. Mientras que valores más altos como 0,8 harán que la salida sea más aleatoria, valores más bajos como 0,2 la harán más enfocada y determinista. Si se establece en 0, el modelo utilizará la probabilidad logarítmica para aumentar la temperatura automáticamente hasta alcanzar ciertos umbrales.

Puedes ver documentación de este método en https://platform.openai.com/docs/api-reference/audio/createTranscription<.

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

Este método te permite traducir el contenido de audio al inglés.

Los parámetros de entrada deben ser los siguientes:

  • file: obligatorio
  • Es el archivo de audio que desea traducir (no el nombre del archivo). Admite los siguientes formatos: FLAC, MP3, MP4, MPEG, MPGA, M4A, OGG, WAV o WEBM
  • model: Requerido.
  • En este campo, escribe el modelo que se utilizará para realizar la transcripción. Por ahora, sólo está disponible "whisper-1".
  • prompt: Opcional.
  • Es un texto opcional para guiar el estilo del modelo o continuar con el segmento de audio anterior. El mensaje aquí debe estar en inglés.
  • response_format: Opcional. Por defecto, es "json".
  • Aquí usted determina el formato de la salida de la transcripción en una de las siguientes opciones: “json”, “text”, “verbose_json”.
  • temperature: Opcional. De forma predeterminada, el valor es 0.
  • La temperatura de muestreo está entre 0 y 1. Mientras que valores más altos como 0,8 harán que la salida sea más aleatoria, valores más bajos como 0,2 la harán más enfocada y determinista. Si se establece en 0, el modelo empleará la probabilidad logarítmica para elevar la temperatura automáticamente hasta que se alcancen umbrales particulares.

Puedes encontrar mas documentación sobre este método en https://platform.openai.com/docs/api-reference/audio/createTranscription.

¿Que será lo siguiente?

Dado que OpenAi está en continua evolución, la próxima iteración será el método para convertir texto en audio y algunas otras características nuevas.

Recuerda marcar el artículo con un “me gusta” si te ha gustado.

Comentarios (0)1
Inicie sesión o regístrese para continuar