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), utilizandoctx.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 enctx.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
- Conversión de Formato de Audio Permite manejar notas de voz en formato OPUS y convertirlas a MP3 para su procesamiento.
- Integración con OpenAI Whisper Proporciona transcripciones precisas de notas de voz, lo que facilita la comprensión del contenido.
- Respuestas Personalizadas Utiliza el contexto del cliente (nombre y teléfono) para generar respuestas más relevantes y personalizadas.
- Manejo de Errores Robusto Garantiza que los errores se registren adecuadamente y que el usuario sea notificado de cualquier problema.
- 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
-
Pruebas Exhaustivas :
-
Realiza pruebas con diferentes formatos y tamaños de audio para garantizar la compatibilidad.
-
Evalúa la precisión de las transcripciones generadas por OpenAI Whisper.
-
Seguridad y Privacidad :
-
Asegúrate de proteger los datos del cliente y de cumplir con las regulaciones locales sobre privacidad de datos.
-
Escalabilidad :
-
Monitorea el rendimiento del flujo para manejar grandes volúmenes de mensajes y optimiza la infraestructura según sea necesario.