Skip to content

Add de-esser effect to the equalizer - #358

Open
NimbleAINinja wants to merge 1 commit into
pounat:mainfrom
NimbleAINinja:feature/de-esser
Open

Add de-esser effect to the equalizer#358
NimbleAINinja wants to merge 1 commit into
pounat:mainfrom
NimbleAINinja:feature/de-esser

Conversation

@NimbleAINinja

Copy link
Copy Markdown

Summary

Adds sibilance reduction for harsh "s"/"sh" sounds in narration, exposed as a 0–100% strength slider in the equalizer sheet's Effects section. It behaves like bass boost/loudness: independent of the band-EQ master switch, with per-book EQ, backup, and settings-sync support.

Both platforms share the same DSP: an RBJ bandpass sidechain centered at 6 kHz (Q 1.1, ~4–9 kHz) feeds a 1 ms attack / 60 ms release envelope follower; above a strength-dependent threshold (−30 to −42 dBFS), up to 12 dB of the bandpassed signal is subtracted, so only the sibilance band is attenuated. Bypassed below 14 kHz sample rates (same Nyquist guard as the band EQ).

  • iOS: new stage in the AbsorbAudioEQProcessor tap, folded into the anyProcessingActive gate so the tap attaches when the de-esser is the only active effect.
  • Android: DeEsserAudioProcessor in the vendored just_audio sink chain (after Sonic and the channel mixer), toggled live via a DeEsserController static bridge like MonoController.

Testing

  • iOS: device tested — release build installed and verified on a physical iPhone (iOS 27).
  • Android: compile tested only; the de-esser audio path has not been exercised on an Android device.

🤖 Generated with Claude Code

Sibilance reduction for harsh "s"/"sh" sounds in narration, exposed as
a 0-100% strength slider in the equalizer sheet's Effects section.
Works like bass boost/loudness: independent of the band-EQ master
switch, with per-book EQ, backup, and settings-sync support.

Both platforms share the same DSP: an RBJ bandpass sidechain centered
at 6 kHz (Q 1.1, ~4-9 kHz) feeds a 1 ms attack / 60 ms release
envelope follower; above a strength-dependent threshold (-30 to
-42 dBFS) up to 12 dB of the bandpassed signal is subtracted, so only
the sibilance band is attenuated. Bypassed below 14 kHz sample rates
(same Nyquist guard as the band EQ).

iOS: new stage in the AbsorbAudioEQProcessor tap, folded into the
anyProcessingActive gate so the tap attaches when the de-esser is the
only active effect. Android: DeEsserAudioProcessor in the vendored
just_audio sink chain (after Sonic and the channel mixer), toggled
live via a DeEsserController static bridge like MonoController.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant