Portail développeurs
Expérimental La plateforme de bots et d'apps est en développement actif. La prise en charge des serveurs auto-hébergés est arrivée le 13/08/2026, avec moins de fonctionnalités que le cloud. Voir ce qui est pris en charge.
← Docs

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.com
  • compatible-voice-gateway-eu.gamevox.com
  • compatible-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

  1. Le bot envoie op:4 Update Voice State sur le gateway principal (gateway.gamevox.com) avec channel_id.
  2. Le gateway principal envoie VOICE_STATE_UPDATE + VOICE_SERVER_UPDATE avec un endpoint et un jeton de session.
  3. Le bot ouvre une connexion WSS vers wss://{endpoint}/?v=8 et envoie op:0 Identify avec {server_id, user_id, session_id, token}.
  4. Le gateway vocal répond op:2 Ready avec ssrc, ip, port et les modes de chiffrement pris en charge.
  5. Le bot effectue la découverte d’IP en UDP (paquet de 74 octets de type 0x0001 → réponse de type 0x0002).
  6. Le bot envoie op:1 Select Protocol avec le mode de chiffrement retenu.
  7. Le gateway vocal répond op:4 Session Description avec la secret_key de 32 octets.
  8. 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.

← Retour à la documentation