Voice
Gumagana ang voice bots, kasama ang Lavalink at @discordjs/voice, nang walang code changes. Verbatim na sinasalita ng GameVox ang voice gateway protocol ng Discord, tapos bina-bridge ang AEAD-RTP stream sa native nitong WebRTC SFU bilang synthetic peer.
Mga compatible na library
- Lavalink v3 + v4 (Java, mga JVM bot na nagfo-front dito gamit ang JDA / discord4j / atbp.)
- @discordjs/voice (Node)
- discord.py voice extras (
PyNaCl) - JDA kasama ang audio module
- discord4j
- Eris kasama ang optional na voice deps
Endpoints
Kada region: kumokonekta ang bot sa kung aling region ang sinabi ng VOICE_SERVER_UPDATE dispatch.
compatible-voice-gateway-us.gamevox.comcompatible-voice-gateway-eu.gamevox.comcompatible-voice-gateway-ap.gamevox.com
Dini-dispatch ng main gateway ang tamang region base sa SFU location ng channel. Binabasa ng bot library mo ang endpoint mula sa dispatch at doon kumokonekta, walang manual routing na kailangan.
Daloy ng connection
- Nagpapadala ang bot ng
op:4 Update Voice Statesa main gateway (gateway.gamevox.com) kasama angchannel_id. - Dini-dispatch ng main gateway ang
VOICE_STATE_UPDATE+VOICE_SERVER_UPDATEna may endpoint at per-session token. - Nagbubukas ang bot ng WSS sa
wss://{endpoint}/?v=8, nagpapadala ngop:0 Identifyna may{server_id, user_id, session_id, token}. - Sumasagot ang voice gateway ng
op:2 Readyna mayssrc,ip,port, at supported na encryption modes. - Ginagawa ng bot ang UDP IP discovery (74-byte type-
0x0001packet → echo pabalik na type-0x0002). - Nagpapadala ang bot ng
op:1 Select Protocolkasama ang encryption mode na pinili nito. - Sumasagot ang voice gateway ng
op:4 Session Descriptionna may 32-byte nasecret_key. - Nagsi-stream ang bot ng Opus sa RTP, AEAD-encrypted gamit ang na-negotiate na mode.
Encryption modes
Dalawang AEAD-RTPSize mode ang supported, tugma sa Discord:
aead_aes256_gcm_rtpsize: preferred. AES-256-GCM kung saan ang nonce ay galing sa 4-byte counter na naka-append sa encrypted payload.aead_xchacha20_poly1305_rtpsize: fallback para sa libraries na walang AES-NI.
Hindi inaalok ang mas lumang modes (xsalsa20_poly1305, _lite, _suffix): ni-retire na ito ng Discord noong 2024 at lumipat na ang mga pangunahing library. Kung naka-pin sa lumang mode ang bot library mo, i-update ito.
Mga tala sa Lavalink
Diretsong binabasa ng Lavalink ang endpoint mula sa VOICE_SERVER_UPDATE at ito mismo ang nagda-dial ng UDP. Basta reachable ang endpoint (at reachable ito), hindi malalaman ng Lavalink na hindi Discord ang kausap nito.
Mga na-test na version: Lavalink v3.7.x at v4.0.x. Kung may ma-encounter kang version-specific na issue, i-report ito sa developer portal para ma-pin namin ang version mo sa CI.
Latency budget
Target na dagdag na latency ng bridge: wala pang 5 ms, sinusukat mula sa inbound UDP hanggang SFU egress. Lampas sa 5 ms, pumapangit na ang tunog ng music (timing drift sa note onsets, hi-hat jitter). Opus passthrough ang ginagawa ng bridge, walang transcoding, kaya decrypt + repacketize ang headline number.
Speaking events
Bidirectional at kapareho ng sa Discord ang op:5 Speaking. Mina-map ng voice gateway ang SSRCs ng inbound na human speakers sa user IDs nila at dini-dispatch ang op:5 na may {ssrc, user_id} para maiugnay ito ng bot.
Maayos na paghinto
Kapag nagpadala ng op:4 Update Voice State na may channel_id: null sa main gateway, dini-drain ang session. Isinasara ng voice gateway ang UDP socket at tinatanggal ang synthetic SFU peer; agad na hihinto ang audio para sa mga taong nakikinig.
Hindi pa supported
- DAVE / E2EE: ang per-channel end-to-end-encrypted voice mode ng Discord. Wala pang timeline.
- Soundboard: hindi puwedeng mag-post ang bots ng soundboard sounds.
- Stage channels: tinatanggap sa wire, pero walang hiwalay na audience / speaker handling.