Artículo
· 21 mayo, 2024 Lectura de 10 min

Open AI integration with IRIS - La voz de su amo - ¿Estás enfadado?

Siguiendo con la serie de artículos sobre gestión de archivos de voz, vamos a ver cómo podemos convertir texto en audio y recibir el archivo con la voz elegida.
También exploraremos cómo un servicio de OpenAI puede ayudarnos a analizar un texto y determinar el estado de ánimo expresado en él.
Analicemos cómo puedes crear tu propio archivo de voz y cómo puede "leer" tus sentimientos.

La voz

OpenAI ofrece un servicio que puede crear un archivo de voz con su texto. Es un salvavidas si quieres integrar un servicio de respuesta de voz para personas con discapacidad visual.

Sé que hay muchas aplicaciones que pueden leer un texto y convertirlo en voz, por ejemplo, Loquendo, AWS, Text-to-speech by Google, etc...

Sin embargo, el problema de la mayoría de ellos es que la voz no es tan natural como cabría esperar. Esto sucede porque normalmente traducen el fonema tal como suena en el lenguaje verbal, pero no ponen énfasis ni emoción en el texto.
Por otro lado, cuando usas IA, entiende el contexto del texto e intenta agregar la entonación correcta de acuerdo con él, p.e. exclamación, pregunta, tristeza, alegría, etc...

Este servicio recupera el archivo directamente como una secuencia binaria en el objeto de respuesta. También te permite utilizar diferentes tipos de archivos de audio: MP3, OVG, etc...

No quería devolver el contenido directamente, planeaba devolver una cadena Base64 que el usuario pudiera convertir en un archivo, reproducirlo directamente, etc., y que pudiera usarse a través de una API de archivos.

El primer problema al que me enfrenté fue convertir el fichero %Stream.GlobalBinary a Base64.

Mi primer intento fue leer el binario y convertirlo como una cadena que decodifica Base64.

do tHttpResponse.Data.Rewind()
set response = ""
while tHttpResponse.Data.AtEnd {
    set temp=stream.Read(4000)
    set temp=$system.Encryption.Base64Encode(temp)
    set response = response_temp
}

Sin embargo, el contenido no se convirtió correctamente a Base64.

Sin embargo, como siempre, la comunidad me salva la vida (otra vez). La idea era convertir el %Stream.GlobalBinary a un %Stream.GlobalCharacter y luego leer el contenido en Base64.
Gracias, Marc Mundt por tu respuesta maravillosa.

Después de eso, creé la siguiente clase para convertir mi flujo GlobalBinary en GlobalCharacter.

Class St.OpenAi.B64.Util Extends %RegisteredObject
{

/// Be cautious if changing CHUNKSIZE. Incorrect values could cause the resulting encoded data to be invalid.
/// It should always be a multiple of 57 and needs to be less than ~2.4MB when MAXSTRING is 3641144
Parameter CHUNKSIZE = 2097144;
ClassMethod B64EncodeStream(pStream As %Stream.Object, pAddCRLF As %Boolean = 0) As %Stream.Object
{
    set tEncodedStream=##class(%Stream.GlobalCharacter).%New()
    
    do pStream.Rewind()
    
    while ('pStream.AtEnd) {
        set tReadLen=..#CHUNKSIZE
        set tChunk=pStream.Read(.tReadLen)
        
        do tEncodedStream.Write($System.Encryption.Base64Encode(tChunk,'pAddCRLF))
        if (pAddCRLF && 'pStream.AtEnd) {
            do tEncodedStream.Write($c(13,10))
        }
    }
    
    do tEncodedStream.Rewind()
    
    quit tEncodedStream
}

}

Mi siguiente paso fue llamarlo desde la clase St.OpenAi.BO.Api.Connect y obtener Base64 correctamente.

set pResponse = ##class(St.OpenAi.Msg.Audio.SpeachResponse).%New()
do pResponseStream.Content.Rewind()
set contentfile = ##class(St.OpenAi.B64.Util).B64EncodeStream(pResponseStream.Content)
set content = ""
while ('contentfile.AtEnd)
{
   set content = content_contentfile.Read()
}
set pResponse.Content=content

¡Tengo mucha suerte de tener una comunidad tan maravillosa a mi lado!

¿Qué quieres decir en tu texto?

¿Cuál crees que es la intención aquí si tienes el siguiente texto?

“Mi vida no tiene sentido. Quiero dejarlo todo para siempre.”

Es posible que sienta que el hablante tiene la intención de hacerse algo malo a sí mismo. De hecho, como eres humano, entiendes cuál es el contexto y sabes "leer entre líneas".

Para una computadora, una palabra es una colección de 0 y 1, que deben transformarse en caracteres para que podamos entenderlos. Incluso colocamos las letras en un orden diferente; También tenemos palabras en otros idiomas: "Hello", "Hola" y "Ciao".

Podemos crear una relación entre la palabra “Hola” y su homóloga en inglés (“Hello”) o italiana (“Ciao”).

Sin embargo, no existe una manera fácil de relacionar la frase “Mi vida no tiene sentido” con algo negativo, o “Quiero dejarlo todo para siempre” con tu deseo de hacerte daño.

Si intentas hacer lo mismo que antes, podemos considerar que la frase “quiero dejarlo todo para siempre” significa que quieres hacerte daño. Puede que tenga sentido, pero en la misma línea en la siguiente frase “No me gusta esta ciudad. Quiero dejarlo todo para siempre” es neutral.

De hecho, el contexto es crucial para determinar si un texto es neutral o contiene violencia, odio o autolesión.

¿Cómo puedes entrenar tu IA con moderación?

Entrenar una IA para moderar textos implica varios pasos y consideraciones esenciales:

Recopilación de datos con etiquetas: Es fundamental reunir un conjunto de datos suficientemente grande y diverso que contenga ejemplos de textos que necesita moderar, etiquetados como apropiados o inapropiados según sus criterios de moderación.

Definición de criterios de moderación: Debe definir claramente qué tipos de contenido considera inapropiados y qué acciones se deben tomar al respecto (por ejemplo, eliminarlos, ocultarlos o marcarlos como potencialmente ofensivos).

Selección de Algoritmos y Modelos: Puede utilizar técnicas de aprendizaje automático supervisado, en las que los modelos se entrenan con ejemplos etiquetados, o técnicas de aprendizaje automático semisupervisadas, en las que se aprovechan ejemplos etiquetados y no etiquetados. Modelos como BERT, GPT o modelos específicos de clasificación de texto pueden resultar útiles en este caso.

Preprocesamiento de datos: Antes de entrenar el modelo, debe realizar tareas como tokenización, normalización del texto (por ejemplo, convertir todas las partes del texto a minúsculas), eliminación de caracteres especiales, etc.

Entrenamiento modelo: Utilice sus datos etiquetados para entrenar el modelo seleccionado. Durante el entrenamiento, el modelo aprenderá a distinguir entre textos apropiados e inapropiados según los criterios definidos.

Evaluación del desempeño del modelo: Después del entrenamiento, evalúe el rendimiento del modelo con la ayuda de un conjunto de datos de prueba independiente. Le ayudará a determinar qué tan bien se está generalizando el modelo y si necesita ajustes adicionales.

Ajuste y mejora continua: Es probable que necesite ajustar y mejorar su modelo a medida que recopila más datos y observa su desempeño en el mundo real. Puede implicar volver a entrenar el modelo con datos actualizados y optimización de parámetros.

Despliegue de producción: Una vez que esté satisfecho con el rendimiento del modelo, puede implementarlo en su sistema de moderación en línea para ayudar a automatizar el proceso de moderación de texto.

Es vital tener en cuenta que ningún sistema de moderación automatizado es perfecto, por lo que siempre es recomendable combinar la IA con la supervisión humana para abordar casos difíciles o nuevos tipos de contenido inapropiado.

El objetivo principal del servicio de "moderation" de OpenAI es proporcionar herramientas y modelos de inteligencia artificial para ayudar a las plataformas en línea a moderar y gestionar el contenido generado por los usuarios. Incluye detectar y mitigar contenido inapropiado como spam, incitación al odio, acoso, violencia, contenido sexual explícito, etc. El objetivo es ayudar a desarrollar un entorno en línea más seguro y saludable para los usuarios reduciendo la presencia de contenido dañino. Podemos hacerlo identificando contenido que pueda ser dañino y tomando medidas.

Al usar la moderación de OpenAI, el texto anterior nos arrojaría el siguiente resultado:

{
    "id": "modr-9FRqaywTVudh3Jk9FEYnxuRbrDmUH",
    "model": "text-moderation-007",
    "results": [
        {
            "flagged": true,
            "categories": {
                "sexual": false,
                "hate": false,
                "harassment": false,
                "self-harm": true,
                "sexual/minors": false,
                "hate/threatening": false,
                "violence/graphic": false,
                "self-harm/intent": true,
                "self-harm/instructions": false,
                "harassment/threatening": false,
                "violence": false
            },
            "category_scores": {
                "sexual": 6.480985575763043e-6,
                "hate": 0.00005180266089155339,
                "harassment": 0.000108763859316241,
                "self-harm": 0.861529529094696,
                "sexual/minors": 6.210859737620922e-7,
                "hate/threatening": 9.927841659873593e-8,
                "violence/graphic": 0.000012115803656342905,
                "self-harm/intent": 0.9326919317245483,
                "self-harm/instructions": 0.00005927650636294857,
                "harassment/threatening": 7.471672233805293e-6,
                "violence": 0.0008052702760323882
            }
        }
    ]
}

Se ha detectado que existe intención de autolesionarse, el porcentaje es:

Self-harm: 86.15%
Self-harm intent: 93.26%

Puedes desarrollar algunos filtros utilizando estos porcentajes y categorías detectadas y activar alertas o reenviar otro tipo de respuestas de forma más inteligente.

El modelo clasifica las siguientes categorías:

CATEGORIA DESCRIPCIÓN
hate
(Odio)
Contenido que exprese, incite o promueva el odio por motivos de raza, género, etnia, religión, nacionalidad, orientación sexual, condición de discapacidad o casta. El contenido de odio dirigido a grupos no protegidos (por ejemplo, jugadores de ajedrez) es acoso.
hate/threatening
(Odio/Amenaza)
Contenido de odio que incluya violencia o daño grave hacia el grupo objetivo por motivos de raza, género, etnia, religión, nacionalidad, orientación sexual, condición de discapacidad o casta.
harassment
(Acoso)
Contenido que exprese, incite o promueva lenguaje acosador hacia cualquier objetivo.
harassment/threatening
(Acoso/Amenaza)
Contenido de acoso que además incluya violencia o daño grave hacia cualquier objetivo.
self-harm
(Autolesiones)
Contenido que promueva, fomente o represente actos de autolesión como suicidio, cortes o lesiones y trastornos alimentarios.
self-harm/intent
(Autolesiones/Intención)
Contenido en el que el hablante expresa que está participando o tiene la intención de participar en actos de autolesión como suicidio, autolesiones/lesiones y trastornos alimentarios.
self-harm/instructions
(Autolesiones/Instrucciones)
Contenido que fomente la realización de actos de autolesión como suicidio, cortes o lesiones y trastornos alimentarios, o que brinde instrucciones o consejos sobre cómo cometer dichos actos.
sexual
(Sexual)
Contenido destinado a despertar excitación sexual, p.e. la descripción de la actividad sexual, o que promueva servicios sexuales (excluyendo educación y bienestar sexual).
sexual/minors
(Sexual/Menores)
Contenido sexual que incluya a una persona menor de 18 años.
violence
(Violencia)
Contenido que represente muerte, violencia o lesiones físicas.
violence/graphic
(Violencia/Gráfica)
Contenido que represente muerte, violencia o lesiones físicas con detalles gráficos.

El valor de la puntuación está entre 0 y 1, donde los valores más altos indican una mayor confianza. Las puntuaciones no deben interpretarse como probabilidades.

Speech

Endpoint: POST https://api.openai.com/v1/audio/speech

La API de audio proporciona un endpoint de voz basado en el modelo TTS (texto a voz). Viene con 6 voces integradas y se puede utilizar para hacer lo siguiente:

  • Narrar una publicación de blog escrita.
  • Produzca audio hablado en varios idiomas.
  • Ofrezca salida de audio en tiempo real mediante streaming.

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

  • model: Requerido.
  • Está relacionado con los modelos TTS disponibles: tts-1 o tts-1-hd.
  • input: Requerido.
  • Está conectado al texto utilizado para generar audio. La longitud máxima es 4096 caracteres.
  • voice: Requerido.
  • Está vinculado a la voz a emplear a la hora de generar el audio. Las voces admitidas son “alloy”, “echo”, “fable”, “onyx”, “nova” y “shimmer”. Las vistas previas de las voces están disponibles en la guía de texto a voz.
  • response_format: Opcional.
  • Está asociado al formato del audio. Los formatos admitidos son “mp3”, “opus”, “aac”, “flac”, “wav” y “pcm”. si no se indica, el valor predeterminado es “mp3”.
  • speed: Opcional.
  • Está vinculado a la velocidad del audio generado. Seleccione un valor entre “0,25” y “4,0”. Si no se indica, el valor predeterminado es “1,0”.

Moderations

Endpoint: POST https://api.openai.com/v1/moderations

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

  • model: Opcional.
  • Está relacionado con los modelos de moderación disponibles: text-moderation-stable o text-moderation-latest. si no se indica, el valor predeterminado es "text-moderation-latest".
  • input: Requerido.
  • Está conectado al texto para clasificar.

¿Que viene ahora?

Dado que OpenAI evoluciona continuamente, nadie sabe qué próxima característica lanzarán.

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

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