Audio Effects SDK 2.6.0 for Web
1. Self-hosted models: two files changed
If you serve the models yourself (sdk_url pointing at your own host), the SDK will
ask for files that are not in your folder yet. speed did not just get a new version
number — it moved to a different model family and file extension.
| Preset | 2.5.2 | 2.6.0 |
|---|---|---|
speed |
models/audio-model-1.0.1.tsvb |
models/audio-model-4.0.2.wasm |
balanced |
models/audio-model-3.3.2.wasm |
models/audio-model-3.3.3.wasm |
quality |
models/audio-model-2.5.0.tsvb |
unchanged |
A missing model does not raise an exception to the caller — onReady simply never
fires. Verify the folder after upgrading with the new getRequiredModels():
sdk.config({ sdk_url: 'https://cdn.example.com/audio/' });
for (const m of sdk.getRequiredModels()) {
const res = await fetch(m.url, { method: 'HEAD' });
if (!res.ok) console.error(`missing model for "${m.preset}": ${m.path}`);
}
Keeping the old model files alongside the new ones is recommended: they are versioned by name and do not collide, so clients still on 2.5.x keep working.
2. Studio Sound defaults changed
Two stages that used to be applied are now off unless you ask for them. If you call
enableStudioSound() or setStudioSoundOptions({ enabled: true }) without an options
object, the result sounds different from 2.5.2.
| Option | 2.5.2 | 2.6.0 |
|---|---|---|
| Equalizer | always on (voice preset), could not be disabled |
off, opt in via the new enableEqualizer |
enableCompressorEQ |
true |
false |
enableNoiseGate |
true |
true |
enableDeEsser |
true |
true |
enableAutoGain |
false |
false |
autoGainTargetDb |
-12 |
-12 |
To keep the 2.5.2 chain, pass it explicitly:
sdk.setStudioSoundOptions({
enabled: true,
options: { enableEqualizer: true, enableCompressorEQ: true },
});
3. AGC was redesigned
Only relevant if you set enableAutoGain: true — the AGC is off by default and
integrations that do not enable it are unaffected.
In 2.5.2 the gain was targetRMS / measured output RMS, clamped to ±20 dB, recomputed
every 64 samples and applied as a step, with no speech detection: silence was chased
the same as speech, so a quiet passage wound the gain up toward the ceiling.
2.6.0 replaces that with a speech-gated design. Expect different — generally lower and much steadier — gain, most noticeably in noisy rooms, where the new output-noise ceiling deliberately refuses to amplify the room along with the voice.
There is no configuration that restores the 2.5.2 behaviour; the level estimator itself is different. Pin 2.5.2 if you depend on the old dynamics.
New public API
Ten methods, nothing removed:
| Method | Purpose |
|---|---|
getRequiredModels() |
model files this version needs, and the URLs it will fetch |
getInputAudioTrack() |
the capture track in use — read getSettings() to see what browser processing was actually applied |
getLatencyMs() |
current end-to-end pipeline latency |
isRunning() |
whether processing is active |
getSpeedupDebugInfo() |
jitter-buffer snapshot: latency split, learned floor, speedup state, context/model sample rates |
enableDebugStats() / onDebugStats() |
input clipping, limiter hits, underruns, speedup totals, pipeline gain |
setDenoiseStages() / getDenoiseStages() |
LSNR-based stage skipping for the wasm presets |
dbg() |
test hooks: push_silence, freeze_output, set_dbg_delay |
New configuration keys
sdk.config({
context_sample_rate: 48000, // AudioContext rate; 0 (default) lets the browser choose
latency_mode: 'auto', // 'auto' | 'low' | 'stable'
denoise_stages: { enabled: true, noiseOnlyLsnrDb: -10, skipDfLsnrDb: 20, bypassLsnrDb: 30 },
});
contextSampleRate, latencyMode and denoiseStages are accepted as camelCase aliases.
Setting context_sample_rate to match your encoder (48000 for Opus) avoids a
resampling step on the output track. It must be set before the input stream is
attached — an AudioContext cannot change rate after creation.
New Studio Sound options
enableEqualizer turn the EQ back on (off by default now)
agcMaxBoostDb ceiling on AGC boost (default 30)
agcSpeechMarginDb how far above the noise floor a block counts as speech (default 12)
agcMaxGainChangeDbPerSec hard slew limit (default 6)
agcStartupGainChangeDbPerSec slew limit until the gain first reaches its target (default 60)
agcMaxOutputNoiseDb ceiling on the noise level the AGC may produce (default -45)
agcPeakTargetDb where predicted speech peaks are allowed to land (default 1.58)
Options are merged into the current state, not replaced. Send the whole object on every call: a key present in one call and absent in the next keeps its previous value, which makes the result depend on call order.
Studio Sound
AGC. Rebuilt around four independent limits, lowest wins: the configured RMS
target, a peak ceiling based on measured crest factor, an output-noise ceiling, and
agcMaxBoostDb. On top of that:
- a hard slew rate in dB/s rather than a smoothing time constant, so no estimation error can turn into an audible jump;
- the speech level is a running mean of speech blocks from the first one onward, so the opening gain decision rests on a real measurement;
- gain increases wait for speech to be sustained, so a door slam cannot start the gain climbing;
- while the gain is still converging the limiter is fed back into the decision, so the AGC backs off when it is already driving the limiter.
Noise gate. Retuned to sit after the denoiser rather than in front of it: default threshold −65 dBFS, reduction −18 dB, softer knee. The previous defaults crushed quiet microphones to inaudible.
Limiter. Rewritten as a 5 ms lookahead brickwall limiter with a monotonic-deque sliding-window maximum. Gain reduction is derived from the worst-case peak anywhere in the lookahead window, so peaks no longer escape, and the deque keeps it O(1) per sample.
Latency and jitter buffer
- Latency modes via
latency_mode:lowstarts tight,stablekeeps more slack,autostarts low and backs off after underruns. - Adaptive output floor that learns a safe buffer level from observed underruns instead of using a fixed one.
- Gentler speedup: the OLA/WSOLA time-compression used to recover from latency spikes was reworked — RMS-normalised crossfades, fade-in/out on transitions, and a transient-suppression hand-off to the enhancer so an AGC gain step does not land in the middle of a spliced frame.
- Batched worker messaging to cut per-frame postMessage overhead.
Resampling
New polyphase resampler with a windowed-sinc anti-aliasing filter, used whenever the
AudioContext rate differs from the model rate. This is what makes
context_sample_rate usable: you can run the context at 48 kHz for the encoder while
the model runs at 16 or 32 kHz.
Models
speed and balanced were updated — see the table at the top. speed in particular
is a new model family, not a revision of the old one.
Compatibility summary
| Area | Status |
|---|---|
| Public API | compatible — additive only, nothing removed or changed |
| TypeScript types | compatible — all new options are optional |
| Default model host | unchanged (https://effectssdk.ai/sdk/audio/) |
| Self-hosted models | action required — two new files |
| Studio Sound defaults | changed — EQ and compressor now off |
| AGC behaviour | changed — only if enableAutoGain: true |
| Denoise-only integrations | unaffected |