Skip to content

· audio-effects-sdk-web

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: low starts tight, stable keeps more slack, auto starts 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

Ready to try it in your app?

Start a free trial in the Developer Portal and run your first effect today.