Support the project with a Monero donation. All contributions help keep development going.

P.CASH QR Code
Monero (XMR) Wallet Address:
45fFPsGoLnMHjjGQgZmqBG745iG1qpfYVbtjZMip4XapChAAG5J5UQzYnsgYCCkB1TefYivYdPpqngxNnyiwzgx4QGC7FAe
⚠️ Please verify the address before sending. Cryptocurrency transactions are irreversible.
High-fidelity Studio-Grade Quality Within Discord's 48kHz Framework. Built with accessibility in mind: simple to install, reliable, and non-corrupting. Based on discord_voice.node (15/04/2026).
Mega-Hosted Download • Windows 10/11/Linux/Mac • Open Source
Links not working? Please open live chat or join our Discord server for assistance.
Released 15th April node for those experiencing muted issues.
Choose your bitrate node.
Why Discord Voice Playground Surpasses Legacy Modifications
Lightcord project has been officially marked as [DEPRECATED; DO NOT USE] as of 2024. discord_voice.xyz represents the next generation of Discord voice optimization with active maintenance and full offset coverage.
| Feature | Lightcord | Voice Playground |
|---|---|---|
| Last Build Date | Dec 09, 2024 | Apr 15, 2026 |
| Patch Coverage | 23% (7/30) | 100% (30/30) |
| Stereo Support | ❌ Partial | ✅ Full (9 patches) |
| Bitrate Control | ❌ Limited | ✅ 512 kbps Lock + Floor + GoogCC NOP |
| 48kHz Emulation | ❌ Not Found | ✅ Implemented |
| Audio Filters | ❌ 2/6 | ✅ 6/6 |
| FEC / DTX / VBR | ❌ None | ✅ FEC forced, DTX blocked, VBR locked |
| Network Stability | ❌ None | ✅ BWE Audio + CwndPushback |
| Platform Support | Windows Only | Win/Linux/Mac |
| Maintenance Status | ❌ Abandoned | ✅ Active |
All critical voice, bitrate, network, FEC, video have been discovered and applied
BWE audio/video params, CwndPushback, FEC forced-on & MinBitrateFloor prevent degradation
Regularly updated for new Discord versions (app-1.0.9226+) with active development
MIT Licensed, transparent codebase on Codeberg with community contributions
Opus configuration has been tuned to input/output the highest quality
Enable near-lossless HD audio in Discord with custom voice modules
Download the following files from the official repository:
index.js (now, optional)discord_voice.node (required)ffmpeg.dll (legacy clients)BETA OPTION: Check the Experimental tab in the download modal for the Mar 20 node with 44 patches.
⚠️ Note: Experimental builds may produce unexpected behaviour.
Press ⊞ Win + R, paste the path below, and press Enter:
%LocalAppData%\DiscordThis opens the main Discord folder where app versions are stored.
Navigate into the latest app folder (e.g., app-1.0.x), then go to:
Fully quit Discord before proceeding:
index.jsdiscord_voice.nodeReopen Discord and join a voice channel as usual.
⚠️ Future Discord updates may overwrite these files. Reapply after each major update.
#include <napi.h>
#include <opus/opus.h>
#include <opus/opus_projection.h>
#include <vector>
#include <string>
#include <cmath>
class OpusHDEncoder : public Napi::ObjectWrap<OpusHDEncoder> {
public:
static Napi::Object Init(Napi::Env env, Napi::Object exports);
OpusHDEncoder(const Napi::CallbackInfo& info);
~OpusHDEncoder();
private:
OpusProjectionEncoder* proj_enc_ = nullptr;
int sample_rate_ = 48000;
int channels_ = 225;
int frame_size_ = 11520;
bool int24_ = false;
Napi::Value Encode(const Napi::CallbackInfo& info);
Napi::Value Encode24(const Napi::CallbackInfo& info);
Napi::Value Destroy(const Napi::CallbackInfo& info);
Napi::Value CTL(const Napi::CallbackInfo& info);
Napi::Value GetVersion(const Napi::CallbackInfo& info);
};
static bool valid_frame(int sr, int fs) {
static const int base[] = {120, 240, 480, 960, 1920, 2880, 5760, 11520};
for (int v : base) {
if (fs == v) return true;
if (sr == 48000 && fs == v * 2) return true;
}
return false;
}
static int get_application(const std::string& app) {
if (app == "voip") return OPUS_APPLICATION_VOIP;
if (app == "lowdelay") return OPUS_APPLICATION_RESTRICTED_LOWDELAY;
return OPUS_APPLICATION_AUDIO;
}
OpusHDEncoder::OpusHDEncoder(const Napi::CallbackInfo& info)
: Napi::ObjectWrap<OpusHDEncoder>(info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsObject()) {
Napi::TypeError::New(env, "Options object required").ThrowAsJavaScriptException();
return;
}
Napi::Object opts = info[0].As<Napi::Object>();
sample_rate_ = opts.Get("sampleRate").As<Napi::Number>().Int32Value();
channels_ = opts.Get("channels").As<Napi::Number>().Int32Value();
frame_size_ = opts.Get("frameSize").As<Napi::Number>().Int32Value();
int24_ = opts.Get("int24").As<Napi::Boolean>().Value();
std::string app = opts.Get("application").As<Napi::String>().Utf8Value();
int application = get_application(app);
if (channels_ < 1 || channels_ > 255) {
Napi::RangeError::New(env, "Channels must be 1-255").ThrowAsJavaScriptException();
return;
}
if (!valid_frame(48000, frame_size_)) {
Napi::RangeError::New(env, "Invalid frame size").ThrowAsJavaScriptException();
return;
}
const int opus_sample_rate = 48000;
int order = static_cast<int>(std::sqrt(channels_) - 1);
if ((order + 1) * (order + 1) != channels_) {
Napi::RangeError::New(env, "Channel count must be a perfect square").ThrowAsJavaScriptException();
return;
}
int streams = 0, coupled_streams = 0, error = OPUS_OK;
proj_enc_ = opus_projection_ambisonics_encoder_create(
opus_sample_rate, channels_, order,
&streams, &coupled_streams, application, &error);
if (!proj_enc_ || error != OPUS_OK) {
Napi::Error::New(env, std::string("Projection encoder creation failed: ") + opus_strerror(error)).ThrowAsJavaScriptException();
return;
}
opus_projection_encoder_ctl(proj_enc_, OPUS_SET_BITRATE(2000000));
opus_projection_encoder_ctl(proj_enc_, OPUS_SET_COMPLEXITY(10));
opus_projection_encoder_ctl(proj_enc_, OPUS_SET_LSB_DEPTH(int24_ ? 24 : 16));
opus_projection_encoder_ctl(proj_enc_, OPUS_SET_SIGNAL(OPUS_SIGNAL_MUSIC));
}
OpusHDEncoder::~OpusHDEncoder() {
if (proj_enc_) { opus_projection_encoder_destroy(proj_enc_); proj_enc_ = nullptr; }
}
Napi::Value OpusHDEncoder::Encode(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsTypedArray()) {
Napi::TypeError::New(env, "Float32Array required").ThrowAsJavaScriptException();
return env.Null();
}
auto pcm = info[0].As<Napi::Float32Array>();
size_t expected_length = static_cast<size_t>(frame_size_ * channels_);
if (pcm.ElementLength() != expected_length) {
Napi::RangeError::New(env, "PCM buffer length mismatch").ThrowAsJavaScriptException();
return env.Null();
}
std::vector<unsigned char> out(65536);
int ret = opus_projection_encode_float(proj_enc_, pcm.Data(), frame_size_, out.data(), static_cast<opus_int32>(out.size()));
if (ret < 0) {
Napi::Error::New(env, std::string("Encode failed: ") + opus_strerror(ret)).ThrowAsJavaScriptException();
return env.Null();
}
return Napi::Buffer<unsigned char>::Copy(env, out.data(), ret);
}
Napi::Value OpusHDEncoder::CTL(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2 || !info[0].IsString()) {
Napi::TypeError::New(env, "CTL name and value required").ThrowAsJavaScriptException();
return env.Null();
}
std::string ctl = info[0].As<Napi::String>().Utf8Value();
int val = info[1].As<Napi::Number>().Int32Value();
int ret = OPUS_OK;
if (ctl == "SET_BITRATE") ret = opus_projection_encoder_ctl(proj_enc_, OPUS_SET_BITRATE(val));
else if (ctl == "SET_COMPLEXITY") ret = opus_projection_encoder_ctl(proj_enc_, OPUS_SET_COMPLEXITY(val));
else if (ctl == "SET_LSB_DEPTH") ret = opus_projection_encoder_ctl(proj_enc_, OPUS_SET_LSB_DEPTH(val));
else if (ctl == "SET_SIGNAL") ret = opus_projection_encoder_ctl(proj_enc_, OPUS_SET_SIGNAL(val));
else { Napi::TypeError::New(env, "Unsupported CTL command").ThrowAsJavaScriptException(); return env.Null(); }
if (ret != OPUS_OK) { Napi::Error::New(env, std::string("CTL failed: ") + opus_strerror(ret)).ThrowAsJavaScriptException(); return env.Null(); }
return Napi::Boolean::New(env, true);
}
Napi::Value OpusHDEncoder::GetVersion(const Napi::CallbackInfo& info) {
return Napi::String::New(info.Env(), opus_get_version_string());
}
Napi::Value OpusHDEncoder::Destroy(const Napi::CallbackInfo& info) {
if (proj_enc_) { opus_projection_encoder_destroy(proj_enc_); proj_enc_ = nullptr; }
return info.Env().Undefined();
}
Napi::Object OpusHDEncoder::Init(Napi::Env env, Napi::Object exports) {
Napi::Function func = DefineClass(env, "OpusHDEncoder", {
InstanceMethod("encode", &OpusHDEncoder::Encode),
InstanceMethod("ctl", &OpusHDEncoder::CTL),
InstanceMethod("getVersion", &OpusHDEncoder::GetVersion),
InstanceMethod("destroy", &OpusHDEncoder::Destroy)
});
exports.Set("OpusHDEncoder", func);
exports.Set("OPUS_APPLICATION_AUDIO", Napi::Number::New(env, OPUS_APPLICATION_AUDIO));
exports.Set("OPUS_APPLICATION_VOIP", Napi::Number::New(env, OPUS_APPLICATION_VOIP));
exports.Set("OPUS_OK", Napi::Number::New(env, OPUS_OK));
return exports;
}
Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
return OpusHDEncoder::Init(env, exports);
}
NODE_API_MODULE(experimental, InitAll)
End-to-end 24-bit/96kHz float32 audio processing with near-lossless Opus HD encoding at 2.0 Mbps.
DRED V2 greatly improves robustness to packet loss by embedding very low-bitrate redundancy into the Opus stream.
225-channel Ambisonics (14th-order) with ACN/SN3D encoding.
Continuously improved with new features, optimizations, and compatibility refinements.
Neural reconstruction of high-frequency speech (8-20 kHz) from wideband input.
Legacy clients receive high-quality 48kHz/510kbps streams.
Discord enforces a hard 48kHz sample rate cap and mono/stereo channel limits.
Opus 1.6+ HD encoding (up to 2 Mbps) is supported, but end-to-end fidelity is limited by Discord's infrastructure.
This is an optimization within official boundaries.
🔬 A community dedicated to analyzing and improving multi-channel voice handling across Windows, macOS, and Linux.
Open-source research framework & cross-platform compatibility testing
macOS-specific voice module optimization & native integration
Windows voice module engineering & performance optimization
Enhancing index.js architecture & Maximising limits
The audio mod itself contains zero telemetry. All processing occurs locally.
This website uses two privacy-respecting services:
Neither service collects personally identifiable information.
[dmca@discord-voice.xyz] as its copyright agent under 17 U.S.C. §512(c).MIT License - free to use, modify, distribute.
Contributions welcome: bug reports, PRs, documentation.