Voz
Los bots de voz —incluidos Lavalink y @discordjs/voice— funcionan sin cambios de código. GameVox habla literalmente el protocolo del gateway de voz de Discord y después lleva el flujo AEAD-RTP a su SFU WebRTC nativa como un peer sintético.
Bibliotecas compatibles
- Lavalink v3 + v4 (Java; bots JVM que lo usan por delante mediante JDA / discord4j / etc.)
- @discordjs/voice (Node)
- discord.py con los extras de voz (
PyNaCl) - JDA con el módulo de audio
- discord4j
- Eris con las dependencias de voz opcionales
Endpoints
Por región — el bot se conecta a la región que le indique el despacho VOICE_SERVER_UPDATE.
compatible-voice-gateway-us.gamevox.comcompatible-voice-gateway-eu.gamevox.comcompatible-voice-gateway-ap.gamevox.com
El gateway principal envía la región correcta según la ubicación de la SFU del canal. Tu biblioteca lee endpoint del despacho y se conecta allí, sin enrutamiento manual.
Flujo de conexión
- El bot envía
op:4 Update Voice Stateen el gateway principal (gateway.gamevox.com) conchannel_id. - El gateway principal envía
VOICE_STATE_UPDATE+VOICE_SERVER_UPDATEcon un endpoint y un token por sesión. - El bot abre WSS a
wss://{endpoint}/?v=8y envíaop:0 Identifycon{server_id, user_id, session_id, token}. - El gateway de voz responde
op:2 Readyconssrc,ip,porty los modos de cifrado admitidos. - El bot realiza el descubrimiento de IP por UDP (paquete de 74 bytes de tipo
0x0001→ respuesta de tipo0x0002). - El bot envía
op:1 Select Protocolcon el modo de cifrado elegido. - El gateway de voz responde
op:4 Session Descriptioncon lasecret_keyde 32 bytes. - El bot transmite Opus por RTP, cifrado con AEAD en el modo negociado.
Modos de cifrado
Se admiten dos modos AEAD-RTPSize, igual que en Discord:
aead_aes256_gcm_rtpsize— preferido. AES-256-GCM con el nonce derivado de un contador de 4 bytes añadido a la carga cifrada.aead_xchacha20_poly1305_rtpsize— alternativa para bibliotecas sin AES-NI.
Los modos antiguos (xsalsa20_poly1305, _lite, _suffix) no se ofrecen: Discord los retiró en 2024 y las bibliotecas principales han migrado. Si tu biblioteca está fijada a un modo antiguo, actualízala.
Notas sobre Lavalink
Lavalink lee el endpoint directamente de VOICE_SERVER_UPDATE y abre el UDP por su cuenta. Mientras el endpoint sea accesible (lo es), Lavalink no sabe que no está hablando con Discord.
Versiones probadas: Lavalink v3.7.x y v4.0.x. Si te encuentras un problema propio de una versión, repórtalo en el portal para que podamos fijar tu versión en CI.
Presupuesto de latencia
Objetivo de latencia añadida por el puente: menos de 5 ms, medida desde el UDP entrante hasta la salida de la SFU. Por encima de 5 ms la música suena mal (desfase en los ataques de nota, jitter en los charles). El puente hace paso directo de Opus —sin transcodificar—, así que la cifra principal es descifrar + reempaquetar.
Eventos de habla
op:5 Speaking es bidireccional e idéntico al de Discord. El gateway de voz asocia los SSRC de las personas que hablan con sus IDs de usuario y envía op:5 con {ssrc, user_id} para que el bot pueda correlacionarlos.
Terminar limpiamente
Enviar op:4 Update Voice State con channel_id: null en el gateway principal cierra la sesión. El gateway de voz cierra el socket UDP y elimina el peer sintético de la SFU; quienes escuchan dejan de recibir audio de inmediato.
Todavía no admitido
- DAVE / E2EE — el modo de voz cifrada de extremo a extremo por canal de Discord. Sin fecha por ahora.
- Soundboard — los bots no pueden reproducir sonidos del soundboard.
- Canales de escenario — se aceptan en el cable, pero sin gestión separada de público y ponentes.