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
-
Configuración de Variables de Entorno
-
Se usa
dotenv/configpara gestionar variables de entorno. - Variables Necesarias:
ELEVENLABS_MODEL_ID: ID del modelo de voz de Eleven Labs.ELEVENLABS_API_KEY: Clave de la API de Eleven Labs.
- La autenticación de OpenAI también debe estar configurada previamente para generar audios a través de su servicio.
-
Funciones de Texto a Voz
-
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
nullsi la generación falla.
- OpenAI (Función
openai_tts):- Usa el modelo
tts-1de OpenAI para generar un archivo de audio a partir del texto ingresado. - El archivo se almacena en la ruta
openai_audioy se envía al usuario. - Los audios se personalizan con una voz definida (por ejemplo, “alloy”) y se graban en formato MP3.
- Usa el modelo
-
Configuración del Proveedor de Telegram
-
Se configura
TelegramProvider, que administra la recepción y envío de mensajes en Telegram. -
Definición de Flujos de Activación (Workflows)
-
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”.
- Activado con la palabra clave
- 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”.
- Activado con la palabra clave
-
Enrutador Global de Mensajes (
GlobalRouter) -
Configura el
GlobalRouterpara escuchar mensajes entrantes y activar los flujos según la palabra clave recibida. - El enrutador asigna al flujo
elevenlabs_flowoopenai_flowen 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.