export interface DuckingOptions { /** * Sidechain threshold (linear amplitude, 0-1). When the voice exceeds * this, the compressor clamps the music. Default 0.02 — matches typical * dialogue average energy. Real-world podcast implementations cluster at * 0.012–0.03; below 0.02 even quiet voice triggers ducking, above 0.05 * quiet conversation won't duck the music at all. */ threshold?: number; /** Compression ratio. Default 8. */ ratio?: number; /** Attack time in ms. Default 5. */ attackMs?: number; /** Release time in ms. Default 250. */ releaseMs?: number; /** Voice gain in linear amplitude. Default 1 (unchanged). */ voiceGain?: number; /** Background gain (post-duck) in linear amplitude. Default 1. */ bgGain?: number; signal?: AbortSignal; } export interface DuckingResult { output: string; filterGraph: string; } /** * Render a voice + background mix with the background ducked underneath the * voice. Both inputs may be audio or video files; the output is whatever * extension you give it (PCM .wav for max quality, .m4a/.aac for size). */ export declare function duckAudio(voicePath: string, bgPath: string, outputPath: string, opts?: DuckingOptions): Promise; /** * Pure builder for the sidechain filter graph. Exposed so tests can verify * the chain without spawning ffmpeg. */ export declare function buildDuckingFilter(opts?: DuckingOptions): string; //# sourceMappingURL=ducking.d.ts.map