Bot de Discord que convierte texto en voz y lo reproduce en un canal de voz. Soporta español por defecto, cola de reproducción por servidor, límites anti-abuso y configuración por servidor. Arquitectura modular y fácil de extender a otros proveedores TTS (Google Cloud, Azure, ElevenLabs, etc.).
- Comandos slash (
/say,/join,/leave, ...). - TTS en español vía gTTS, transcodificado a Ogg/Opus con
ffmpeg-static(sin dependencias nativas de Opus que compilar — ideal para VPS). - Cola de reproducción independiente por servidor: los audios no se pisan.
- Multi-servidor simultáneo.
- Límite de caracteres, cooldown por usuario y tamaño máximo de cola.
- Configuración por servidor persistida en disco (idioma, voz, velocidad).
- Auto-salida cuando el canal de voz queda vacío.
- Manejo de reconexión y limpieza de estado.
- Logs estructurados con
pino.
- Node.js >= 22.12.0 (requerido por
@discordjs/voice). - Una aplicación de bot en el Discord Developer Portal.
ffmpegse incluye víaffmpeg-static(no hace falta instalarlo aparte).
| Área | Tecnología |
|---|---|
| Gateway | discord.js v14 |
| Voz | @discordjs/voice + @snazzah/davey (DAVE) + sodium-native |
| TTS | gtts → ffmpeg-static (Ogg/Opus) |
| Logs | pino / pino-pretty |
| Config | dotenv |
src/
index.js # Arranque: carga comandos/eventos y login
deploy-commands.js # Registro de slash commands en Discord
config/
config.js # Lee y valida variables de entorno
commands/ # Un archivo por comando slash
events/ # Handlers de eventos (ready, interactionCreate, voiceStateUpdate)
services/
ttsService.js # Síntesis TTS (proveedor abstraído aquí)
managers/
voiceManager.js # Conexión de voz y reproducción
queueManager.js # Cola de reproducción por servidor
guildManager.js # Estado y settings por servidor (persistencia)
utils/ # logger, validadores, cooldown, embeds
data/
guild-settings/ # JSON de configuración por servidor (runtime)
- Crea una aplicación y un bot en el Developer Portal.
- Bot → Privileged Gateway Intents: este bot no requiere intents
privilegiados (usa
GuildsyGuildVoiceStates). - OAuth2 → URL Generator: scopes
botyapplications.commands. Permisos del bot:Connect,Speak,Send Messages,Use Application Commands. - Invita el bot con la URL generada.
git clone <url-del-repo>
cd ttsbot
npm install
cp .env.example .env
# edita .env con tu token, client id y guild idVer .env.example. Resumen:
| Variable | Descripción |
|---|---|
DISCORD_TOKEN |
Token del bot (secreto) |
CLIENT_ID |
Application ID |
GUILD_ID |
Servidor de pruebas (registro instantáneo). Vacío = global |
DEFAULT_LANGUAGE |
Idioma TTS por defecto (es) |
DEFAULT_SPEAKING_RATE |
Velocidad por defecto (gTTS la ignora) |
MAX_CHARS_PER_MESSAGE |
Límite de caracteres por /say |
COOLDOWN_SECONDS |
Cooldown por usuario |
MAX_QUEUE_SIZE |
Máximo de mensajes en cola por servidor |
LOG_LEVEL |
trace/debug/info/warn/error |
npm run deploy # registra los slash commands (una vez, o tras añadir comandos)
npm start # arranca el bot
npm run dev # arranca con recarga automática (nodemon)Con GUILD_ID definido, los comandos aparecen al instante en ese servidor.
Sin él, el registro es global y puede tardar hasta ~1 hora.
| Comando | Descripción |
|---|---|
/join |
El bot entra a tu canal de voz |
/leave |
El bot sale del canal de voz |
/say <texto> |
Reproduce el texto como voz (te une si hace falta) |
/voice [voz] |
Muestra o cambia la voz TTS |
/language [idioma] |
Muestra o cambia el idioma del servidor |
/speed [velocidad] |
Muestra o cambia la velocidad (según proveedor) |
/stop |
Detiene la reproducción y limpia la cola |
/queue |
Muestra la cola de mensajes pendientes |
/help |
Muestra la ayuda |
Nota: gTTS no soporta selección de voz ni velocidad variable.
/voicey/speedguardan el ajuste para cuando se migre a un proveedor que sí lo soporte (Google Cloud TTS, Azure, etc.). El proveedor está aislado ensrc/services/ttsService.js.
# en el servidor
git clone <url-del-repo> && cd ttsbot
npm ci
cp .env.example .env && nano .env # configura los secretos
npm run deploy
# proceso persistente con pm2
npm i -g pm2
pm2 start src/index.js --name ttsbot
pm2 save && pm2 startupMantén .env fuera del control de versiones (ya está en .gitignore).
Nunca publiques el token; si se filtra, regenéralo en el Developer Portal.
- El bot se une pero no se oye / timeout
The operation was aborted: asegúrate de usar@discordjs/voice >= 0.19y de tener@snazzah/daveyinstalado (protocolo DAVE, requerido por Discord en varias regiones) y una librería de cifrado (sodium-native). Verifica con:node -e "console.log(require('@discordjs/voice').generateDependencyReport())" - Los comandos no aparecen: ejecuta
npm run deploy. ConGUILD_IDes instantáneo; el registro global tarda. - No se oye nada pero no hay error: revisa que el bot tenga permisos
ConnectySpeaken el canal.
MIT — ver LICENSE.