Saltar a contenido

Manejo de Notas de Voz con Workflow y OpenAI Whisper

Este flujo de trabajo (Workflow) está diseñado para procesar mensajes de notas de voz utilizando la librería @elimeleth/vct-flow. Integra funcionalidades avanzadas como la conversión de formatos de audio, transcripción de voz a texto mediante OpenAI Whisper y la generación de respuestas personalizadas con un asistente.


Requisitos Previos

Advertencia

Antes de ejecutar el código, asegúrate de instalar las siguientes dependencias:

bash pnpm install openai fluent-ffmpeg ffmpeg-static

Además, asegúrate de que el archivo .env contenga las credenciales necesarias, como la clave de API de OpenAI.


Código de Implementación

import "dotenv/config";

import { Workflow, GlobalRouter, helpers, Context, InternalMethods, Database } from "@elimeleth/vct-flow";
import { Assistant } from "@elimeleth/vct-layers";

export default new Workflow("voice")
    .addAction(async (ctx, methods) => {
        const { send, end, extensions: { provider } } = methods;
        try {
            if (ctx.message && ctx.message.audioMessage && ctx.message.audioMessage.ptt) {
                // Aviso al usuario que se está procesando el audio
                await send("Dame un momento para escucharte 😎");

                // Convierte el audio de OPUS a MP3
                const path = await helpers.convertOpusToMp3(ctx.file_dir_path);

                // Envía el archivo a OpenAI Whisper para transcripción
                ctx.body = await helpers.sendToOpenaiWhisper(path);

                console.log(`🤖 Fin voz a texto....[TEXT]: ${ctx.body}`);

                // Genera la respuesta utilizando el asistente
                return Assistant.layer({
                    invoke_params: {
                        extra: {
                            additional_instructions: `
                                Estas son metadata de la información del cliente con quien interactúas:
                                Nombre: ${ctx?.name || "Nombre no asignado aún"}
                                Teléfono: ${ctx.from}
                            `,
                            truncation_strategy: {
                                type: "last_messages",
                                last_messages: 20 // Limita el historial a los últimos 20 mensajes
                            }
                        }
                    },
                    functions: {
                        send: async (answer, save_metadata) => {
                            // Procesa la respuesta y elimina duplicados
                            let chunks = answer.output.split("\n\n").filter(a => Boolean(a));
                            let body = [...new Set(chunks)] as string[];

                            // Envía la respuesta al cliente
                            await methods.send([{
                                body: body,
                                save_metadata
                            }]);
                        }
                    }
                })(ctx, methods);
            } else {
                // Si el mensaje no es una nota de voz
                await send("Recibí un mensaje que no es un audio de voz.");
            }
        } catch (error) {
            // Manejo de errores
            console.error("Error procesando mensaje de audio:", error);
            await send("Ocurrió un error al procesar el mensaje de audio.");
            return await end();
        }
    });

Explicación del Flujo

1. Validación del Mensaje

  • El flujo verifica si el mensaje recibido contiene un audio de tipo ptt (Push-To-Talk), utilizando ctx.message.audioMessage.ptt.

2. Conversión del Formato de Audio

  • La función convertOpusToMp3(ctx.file_dir_path) convierte el archivo de audio del formato OPUS a MP3, necesario para enviarlo a OpenAI Whisper.

3. Transcripción de Voz a Texto

  • Una vez convertido el audio, se utiliza sendToOpenaiWhisper(path) para transcribir el contenido del archivo MP3 a texto. El resultado se almacena en ctx.body.

4. Generación de Respuesta con el Asistente

  • La transcripción se envía al asistente configurado mediante Assistant.layer, que genera una respuesta basada en el contexto y los metadatos del cliente (nombre y teléfono).
  • La respuesta se divide en fragmentos únicos (chunks) y se envía al cliente.

5. Manejo de Mensajes No Válidos

  • Si el mensaje no contiene un audio válido, el sistema notifica al usuario con un mensaje de error.

6. Manejo de Errores

  • En caso de error, el sistema registra el problema en la consola y envía un mensaje informando al usuario que ocurrió un problema.

Funcionalidades Destacadas

  1. Conversión de Formato de Audio Permite manejar notas de voz en formato OPUS y convertirlas a MP3 para su procesamiento.
  2. Integración con OpenAI Whisper Proporciona transcripciones precisas de notas de voz, lo que facilita la comprensión del contenido.
  3. Respuestas Personalizadas Utiliza el contexto del cliente (nombre y teléfono) para generar respuestas más relevantes y personalizadas.
  4. Manejo de Errores Robusto Garantiza que los errores se registren adecuadamente y que el usuario sea notificado de cualquier problema.
  5. Optimización del Historial Limita el historial del asistente a los últimos 20 mensajes, mejorando la eficiencia y relevancia de las respuestas.

Consideraciones para Producción

  1. Pruebas Exhaustivas :

  2. Realiza pruebas con diferentes formatos y tamaños de audio para garantizar la compatibilidad.

  3. Evalúa la precisión de las transcripciones generadas por OpenAI Whisper.

  4. Seguridad y Privacidad :

  5. Asegúrate de proteger los datos del cliente y de cumplir con las regulaciones locales sobre privacidad de datos.

  6. Escalabilidad :

  7. Monitorea el rendimiento del flujo para manejar grandes volúmenes de mensajes y optimiza la infraestructura según sea necesario.