Vocal
Les bots vocaux — dont Lavalink et @discordjs/voice — fonctionnent sans changement de code. GameVox parle mot pour mot le protocole du gateway vocal de Discord, puis relie le flux AEAD-RTP à son SFU WebRTC natif sous la forme d’un pair synthétique.
Bibliothèques compatibles
- Lavalink v3 + v4 (Java ; bots JVM qui l’utilisent en frontal via JDA / discord4j / etc.)
- @discordjs/voice (Node)
- discord.py avec les extras vocaux (
PyNaCl) - JDA avec le module audio
- discord4j
- Eris avec les dépendances vocales optionnelles
Endpoints
Par région — le bot se connecte à la région indiquée par la dépêche VOICE_SERVER_UPDATE.
compatible-voice-gateway-us.gamevox.comcompatible-voice-gateway-eu.gamevox.comcompatible-voice-gateway-ap.gamevox.com
Le gateway principal envoie la bonne région selon l’emplacement du SFU du salon. Votre bibliothèque lit endpoint dans la dépêche et s’y connecte — aucun routage manuel nécessaire.
Déroulé de la connexion
- Le bot envoie
op:4 Update Voice Statesur le gateway principal (gateway.gamevox.com) avecchannel_id. - Le gateway principal envoie
VOICE_STATE_UPDATE+VOICE_SERVER_UPDATEavec un endpoint et un jeton de session. - Le bot ouvre une connexion WSS vers
wss://{endpoint}/?v=8et envoieop:0 Identifyavec{server_id, user_id, session_id, token}. - Le gateway vocal répond
op:2 Readyavecssrc,ip,portet les modes de chiffrement pris en charge. - Le bot effectue la découverte d’IP en UDP (paquet de 74 octets de type
0x0001→ réponse de type0x0002). - Le bot envoie
op:1 Select Protocolavec le mode de chiffrement retenu. - Le gateway vocal répond
op:4 Session Descriptionavec lasecret_keyde 32 octets. - Le bot diffuse de l’Opus en RTP, chiffré en AEAD selon le mode négocié.
Modes de chiffrement
Deux modes AEAD-RTPSize sont pris en charge, comme sur Discord :
aead_aes256_gcm_rtpsize— privilégié. AES-256-GCM avec un nonce dérivé d’un compteur de 4 octets ajouté à la charge chiffrée.aead_xchacha20_poly1305_rtpsize— solution de repli pour les bibliothèques sans AES-NI.
Les anciens modes (xsalsa20_poly1305, _lite, _suffix) ne sont pas proposés — Discord les a retirés en 2024 et les grandes bibliothèques ont migré. Si votre bibliothèque est figée sur un ancien mode, mettez-la à jour.
Remarques sur Lavalink
Lavalink lit l’endpoint directement dans VOICE_SERVER_UPDATE et ouvre l’UDP lui-même. Tant que l’endpoint est joignable (il l’est), Lavalink ignore qu’il ne parle pas à Discord.
Versions testées : Lavalink v3.7.x et v4.0.x. Si vous rencontrez un problème propre à une version, signalez-le dans le portail pour que nous puissions la figer en CI.
Budget de latence
Objectif de latence ajoutée par le pont : moins de 5 ms, mesurée de l’UDP entrant à la sortie du SFU. Au-delà de 5 ms, la musique sonne faux (dérive sur les attaques de notes, gigue sur les charlestons). Le pont fait passer l’Opus tel quel — sans transcodage — donc le chiffre clé est déchiffrement + repaquetage.
Événements de parole
op:5 Speaking est bidirectionnel et identique à Discord. Le gateway vocal associe les SSRC des personnes qui parlent à leurs ID utilisateur et envoie op:5 avec {ssrc, user_id} pour que le bot puisse faire le lien.
Arrêter proprement
Envoyer op:4 Update Voice State avec channel_id: null sur le gateway principal met fin à la session. Le gateway vocal ferme le socket UDP et retire le pair synthétique du SFU ; les personnes qui écoutent cessent immédiatement de recevoir l’audio.
Pas encore pris en charge
- DAVE / E2EE — le mode vocal chiffré de bout en bout par salon de Discord. Aucune échéance pour l’instant.
- Soundboard — les bots ne peuvent pas jouer de sons du soundboard.
- Salons de conférence — acceptés sur le canal, mais sans gestion distincte du public et des intervenants.