Voz
Bots de voz — incluindo Lavalink e @discordjs/voice — funcionam sem mudanças de código. O GameVox fala o protocolo do gateway de voz do Discord ao pé da letra e depois leva o fluxo AEAD-RTP para o SFU WebRTC nativo como um peer sintético.
Bibliotecas compatíveis
- Lavalink v3 + v4 (Java; bots JVM que o usam à frente via JDA / discord4j etc.)
- @discordjs/voice (Node)
- discord.py com os extras de voz (
PyNaCl) - JDA com o módulo de áudio
- discord4j
- Eris com as dependências opcionais de voz
Endpoints
Por região — o bot se conecta à região que o despacho VOICE_SERVER_UPDATE indicar.
compatible-voice-gateway-us.gamevox.comcompatible-voice-gateway-eu.gamevox.comcompatible-voice-gateway-ap.gamevox.com
O gateway principal envia a região certa conforme a localização do SFU do canal. Sua biblioteca lê o endpoint do despacho e se conecta lá — sem roteamento manual.
Fluxo de conexão
- O bot envia
op:4 Update Voice Stateno gateway principal (gateway.gamevox.com) comchannel_id. - O gateway principal envia
VOICE_STATE_UPDATE+VOICE_SERVER_UPDATEcom um endpoint e um token por sessão. - O bot abre WSS para
wss://{endpoint}/?v=8e enviaop:0 Identifycom{server_id, user_id, session_id, token}. - O gateway de voz responde
op:2 Readycomssrc,ip,porte os modos de criptografia suportados. - O bot faz a descoberta de IP por UDP (pacote de 74 bytes do tipo
0x0001→ resposta do tipo0x0002). - O bot envia
op:1 Select Protocolcom o modo de criptografia escolhido. - O gateway de voz responde
op:4 Session Descriptioncom asecret_keyde 32 bytes. - O bot transmite Opus por RTP, criptografado com AEAD no modo negociado.
Modos de criptografia
Dois modos AEAD-RTPSize são suportados, igual ao Discord:
aead_aes256_gcm_rtpsize— preferido. AES-256-GCM com o nonce derivado de um contador de 4 bytes anexado ao payload criptografado.aead_xchacha20_poly1305_rtpsize— alternativa para bibliotecas sem AES-NI.
Modos antigos (xsalsa20_poly1305, _lite, _suffix) não são oferecidos — o Discord os aposentou em 2024 e as principais bibliotecas migraram. Se a sua biblioteca está presa a um modo antigo, atualize-a.
Notas sobre o Lavalink
O Lavalink lê o endpoint direto do VOICE_SERVER_UPDATE e abre o UDP sozinho. Enquanto o endpoint estiver acessível (e está), o Lavalink não percebe que não está falando com o Discord.
Versões testadas: Lavalink v3.7.x e v4.0.x. Se encontrar um problema específico de versão, relate no portal para que possamos fixá-la na CI.
Orçamento de latência
Meta de latência adicionada pela ponte: abaixo de 5 ms, medida do UDP de entrada até a saída do SFU. Acima de 5 ms a música soa errada (desvio de tempo nos ataques de nota, jitter nos chimbais). A ponte faz repasse direto de Opus — sem transcodificação — então o número principal é descriptografar + reempacotar.
Eventos de fala
O op:5 Speaking é bidirecional e idêntico ao do Discord. O gateway de voz associa os SSRCs de quem está falando aos IDs de usuário e envia op:5 com {ssrc, user_id} para o bot poder correlacionar.
Encerrando corretamente
Enviar op:4 Update Voice State com channel_id: null no gateway principal encerra a sessão. O gateway de voz fecha o socket UDP e remove o peer sintético do SFU; quem está ouvindo para de receber áudio na hora.
Ainda não suportado
- DAVE / E2EE — o modo de voz com criptografia ponta a ponta por canal do Discord. Ainda sem prazo.
- Soundboard — bots não conseguem tocar sons do soundboard.
- Canais de palco — aceitos no transporte, mas sem tratamento separado de plateia e quem fala.