Sprache
Sprach-Bots — einschließlich Lavalink und @discordjs/voice — funktionieren ohne Codeänderungen. GameVox spricht Discords Sprach-Gateway-Protokoll wortgetreu und überführt den AEAD-RTP-Strom dann als synthetischen Peer in die native WebRTC-SFU.
Kompatible Bibliotheken
- Lavalink v3 + v4 (Java, JVM-Bots, die es über JDA / discord4j usw. ansprechen)
- @discordjs/voice (Node)
- discord.py mit Sprach-Extras (
PyNaCl) - JDA mit dem Audio-Modul
- discord4j
- Eris mit den optionalen Sprach-Abhängigkeiten
Endpunkte
Pro Region — der Bot verbindet sich mit der Region, die ihm der VOICE_SERVER_UPDATE-Dispatch nennt.
compatible-voice-gateway-us.gamevox.comcompatible-voice-gateway-eu.gamevox.comcompatible-voice-gateway-ap.gamevox.com
Das Haupt-Gateway liefert anhand des SFU-Standorts des Kanals die richtige Region aus. Deine Bot-Bibliothek liest endpoint aus dem Dispatch und verbindet sich dorthin — kein manuelles Routing nötig.
Verbindungsablauf
- Der Bot sendet
op:4 Update Voice Stateauf dem Haupt-Gateway (gateway.gamevox.com) mitchannel_id. - Das Haupt-Gateway liefert
VOICE_STATE_UPDATE+VOICE_SERVER_UPDATEmit einem Endpunkt und einem Token pro Sitzung aus. - Der Bot öffnet WSS zu
wss://{endpoint}/?v=8und sendetop:0 Identifymit{server_id, user_id, session_id, token}. - Das Sprach-Gateway antwortet mit
op:2 Readyund liefertssrc,ip,portsowie die unterstützten Verschlüsselungsmodi. - Der Bot führt die UDP-IP-Erkennung durch (74-Byte-Paket vom Typ
0x0001→ Rückantwort vom Typ0x0002). - Der Bot sendet
op:1 Select Protocolmit dem gewählten Verschlüsselungsmodus. - Das Sprach-Gateway antwortet mit
op:4 Session Descriptionund dem 32-Byte-secret_key. - Der Bot streamt Opus über RTP, AEAD-verschlüsselt mit dem ausgehandelten Modus.
Verschlüsselungsmodi
Zwei AEAD-RTPSize-Modi werden unterstützt, passend zu Discord:
aead_aes256_gcm_rtpsize— bevorzugt. AES-256-GCM, wobei die Nonce aus einem 4-Byte-Zähler abgeleitet wird, der an die verschlüsselte Nutzlast angehängt ist.aead_xchacha20_poly1305_rtpsize— Rückfall für Bibliotheken ohne AES-NI.
Ältere Modi (xsalsa20_poly1305, _lite, _suffix) werden nicht angeboten — Discord hat sie 2024 abgeschaltet und die großen Bibliotheken sind umgestiegen. Falls deine Bot-Bibliothek auf einen alten Modus festgelegt ist, aktualisiere sie.
Hinweise zu Lavalink
Lavalink liest den endpoint direkt aus VOICE_SERVER_UPDATE und baut die UDP-Verbindung selbst auf. Solange der Endpunkt erreichbar ist (das ist er), merkt Lavalink nicht, dass es nicht mit Discord spricht.
Getestete Versionen: Lavalink v3.7.x und v4.0.x. Wenn dir ein versionsspezifisches Problem begegnet, melde es im Entwicklerportal, damit wir in CI gegen deine Version testen können.
Latenzbudget
Ziel für die zusätzliche Bridge-Latenz: unter 5 ms, gemessen vom eingehenden UDP bis zum SFU-Ausgang. Über 5 ms klingt Musik falsch (Timing-Drift bei Notenanschlägen, Hi-Hat-Jitter). Die Bridge reicht Opus unverändert durch — kein Transcoding — der Kernwert ist also Entschlüsseln + Repaketieren.
Speaking-Ereignisse
op:5 Speaking ist bidirektional und identisch zu Discord. Das Sprach-Gateway ordnet die SSRCs eingehender menschlicher Sprecherinnen und Sprecher ihren Benutzer-IDs zu und liefert op:5 mit {ssrc, user_id} aus, damit der Bot sie zuordnen kann.
Sauber beenden
Das Senden von op:4 Update Voice State mit channel_id: null auf dem Haupt-Gateway beendet die Sitzung. Das Sprach-Gateway schließt den UDP-Socket und entfernt den synthetischen SFU-Peer; menschliche Zuhörende erhalten sofort kein Audio mehr.
Noch nicht unterstützt
- DAVE / E2EE — Discords Ende-zu-Ende-verschlüsselter Sprachmodus pro Kanal. Noch kein Zeitplan.
- Soundboard — Bots können keine Soundboard-Sounds abspielen.
- Stage-Kanäle — werden auf dem Wire akzeptiert, aber ohne getrennte Behandlung von Publikum und Sprechenden.