Saltar a contenido

Text to speach

Integración de Generación de Voz para Mensajes en Telegram usando Eleven Labs y OpenAI

Este código permite al bot de Telegram generar mensajes de voz en respuesta a palabras clave específicas, empleando Eleven Labs y OpenAI para la síntesis de voz. Los flujos de activación del bot envían audios personalizados en función del proveedor de voz seleccionado. La implementación se adapta bien para asistentes virtuales en Telegram que buscan una interacción más inmersiva y humana.

Componentes Principales

  1. Configuración de Variables de Entorno

  2. Se usa dotenv/config para gestionar variables de entorno.

  3. Variables Necesarias:
    • ELEVENLABS_MODEL_ID: ID del modelo de voz de Eleven Labs.
    • ELEVENLABS_API_KEY: Clave de la API de Eleven Labs.
  4. La autenticación de OpenAI también debe estar configurada previamente para generar audios a través de su servicio.
  5. Funciones de Texto a Voz

  6. Eleven Labs (Función elevenlabs_tts):

    • Envía una solicitud POST a la API de Eleven Labs para generar un archivo de audio MP3 a partir del texto.
    • La respuesta se guarda en la ruta definida (eleven_audio), y el archivo se envía al usuario en Telegram.
    • Maneja errores registrándolos y devolviendo null si la generación falla.
  7. OpenAI (Función openai_tts):
    • Usa el modelo tts-1 de OpenAI para generar un archivo de audio a partir del texto ingresado.
    • El archivo se almacena en la ruta openai_audio y se envía al usuario.
    • Los audios se personalizan con una voz definida (por ejemplo, “alloy”) y se graban en formato MP3.
  8. Configuración del Proveedor de Telegram

  9. Se configura TelegramProvider, que administra la recepción y envío de mensajes en Telegram.

  10. Definición de Flujos de Activación (Workflows)

  11. Flujo de Eleven Labs (elevenlabs_flow):

    • Activado con la palabra clave "eleven", genera una respuesta en voz usando Eleven Labs.
    • Envía un audio que dice: “Hola, ¿en qué puedo ayudarte? Soy ElevenLabs”.
  12. Flujo de OpenAI (openai_flow):
    • Activado con la palabra clave "openai", genera una respuesta en voz usando OpenAI.
    • Envía un audio que dice: “Hola, ¿en qué puedo ayudarte? Soy OpenAI”.
  13. Enrutador Global de Mensajes (GlobalRouter)

  14. Configura el GlobalRouter para escuchar mensajes entrantes y activar los flujos según la palabra clave recibida.

  15. El enrutador asigna al flujo elevenlabs_flow o openai_flow en función de la palabra clave, permitiendo la generación de respuestas en voz con el servicio correspondiente.

Código Completo

import "dotenv/config"
import { TelegramProvider as Provider } from "@elimeleth/telegram"
import { Workflow, GlobalRouter } from "@elimeleth/vaincentflow"
import axios from "axios"
import fs from "fs";
import path from "path";
import OpenAI from "openai";

const openai = new OpenAI();

const openai_audio = path.resolve("tmp/openai.mp3");
const eleven_audio = path.resolve("tmp/eleven.mp3")

async function elevenlabs_tts(text: string, path: string = eleven_audio) {
  try {
    const response = await axios.post(
      `https://api.elevenlabs.io/v1/text-to-speech/${process.env.ELEVENLABS_MODEL_ID}`,
      {
        text,
      },
      {
        headers: {
          "xi-api-key": process.env.ELEVENLABS_API_KEY,
          "Content-Type": "application/json",
        },
        responseType: "arraybuffer",
      }
    );

    await fs.promises.writeFile(path, response.data)
    return path
  } catch (error) {
    console.error("Error generating voice:", error);
    return null;
  }
};

async function openai_tts(input: string, path: string = openai_audio) {
  const mp3 = await openai.audio.speech.create({
    model: "tts-1",
    voice: "alloy",
    input,
  });

  const buffer = Buffer.from(await mp3.arrayBuffer());
  await fs.promises.writeFile(path, buffer);
  return path
}

// Proveedor: Gestiona el envío y recepción de mensajes en Telegram
let provider = new Provider({})

// Flujos de activación
const elevenlabs_flow = new Workflow("eleven", {
  metadata: {
    name: "eleven"
  }
})
  .addAction(async (ctx,) => {
    const audio = await elevenlabs_tts("Hola en que puedo ayudarte, Soy ElevenLabs")
    if (audio) {
      provider.sendAudio(ctx.from, audio, "")
    }
  })

const openai_flow = new Workflow("openai", {
  metadata: {
    name: "openai"
  }
})
  .addAction(async (ctx,) => {
    const audio = await openai_tts("Hola en que puedo ayudarte, Soy Openai")
    if (audio) {
      provider.sendAudio(ctx.from, audio, "")
    }
  })

// Enrutador de mensajes
new GlobalRouter({
  provider
})
  .addFlows([elevenlabs_flow, openai_flow])
  .listen();

Este ejemplo configura y escucha tanto los flujos de Eleven Labs como de OpenAI , ofreciendo una experiencia personalizada en función del proveedor de voz seleccionado.