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 (17/02/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.
New patches: DCReject, HighpasscutoffFilter, BWE_Thr2, BWE_Thr3, CwndPushback
Bitrate cap removed and forced at 512 despite bitrate loss
This file will no longer be required
For extra enhancements, use index.js optionally
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 | Feb 17, 2026 |
| Offset Coverage | 37% (7/19) | 100% (21/21) |
| Stereo Support | ❌ Partial | ✅ Full |
| Bitrate Control | ❌ Limited | ✅ 384/512 kbps Lock |
| 48kHz Emulation | ❌ Not Found | ✅ Implemented |
| Audio Filters | ❌ 2/5 | ✅ 5/5 |
| Network Stability | ❌ None | ✅ BWE + CwndPushback |
| Platform Support | Windows Only | Win/Linux/Mac |
| Maintenance Status | ❌ Abandoned | ✅ Active |
All critical voice module offsets discovered and patched with 100% success rate vs Lightcord's 37%
BWE_Thr2/3 and CwndPushback prevent audio degradation during network fluctuations
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: You may also try experimental.node to test cutting-edge audio enhancements.
⚠️ Note: Discord may completely ignore this file. It is not officially supported and could be bypassed by future updates.
Press ⊞ Win + R, paste the path below, and press Enter:
%LocalAppData%\Discord
This 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.node
Reopen 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 for Opus (must be 120–11520, multiples allowed)").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 (e.g., 225 = (14+1)^2)").ThrowAsJavaScriptException();
return;
}
int streams = 0;
int coupled_streams = 0;
int 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;
}
// Configure high-quality settings
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::Encode24(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsTypedArray()) {
Napi::TypeError::New(env, "Int32Array required for 24-bit PCM").ThrowAsJavaScriptException();
return env.Null();
}
auto pcm = info[0].As<Napi::Int32Array>();
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_encode24(
proj_enc_,
reinterpret_cast<const opus_int32*>(pcm.Data()),
frame_size_,
out.data(),
static_cast<opus_int32>(out.size())
);
if (ret < 0) {
Napi::Error::New(env, std::string("Encode24 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 (string) and value (number) 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("encode24", &OpusHDEncoder::Encode24),
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_APPLICATION_RESTRICTED_LOWDELAY", Napi::Number::New(env, OPUS_APPLICATION_RESTRICTED_LOWDELAY));
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 - preserving studio-grade dynamic range, ultrasonic detail, and spatial nuance without clipping or compression artifacts.
DRED V2 greatly improves robustness to packet loss by embedding very low-bitrate redundancy into the Opus stream, letting lost audio be better recovered with minimal extra data.
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. Focused on signal integrity, channel behavior, and real-time media experimentation
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. Your voice, metadata, and network activity are never transmitted, logged, or stored by this project.
This website uses two privacy-respecting services for operational insights:
Neither service collects personally identifiable information. You remain anonymous.
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.
index.js, build scripts, docs) is licensed under MIT.