Skip to content

Professional podcast audio pre-processor. Raw voice β†’ broadcast-ready at -18 LUFS πŸ•Ί

License

Notifications You must be signed in to change notification settings

linuxmatters/jivetalking

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Jivetalking πŸ•Ί

Professional podcast audio preprocessing - broadcast-quality results with zero audio engineering knowledge required


What It Does

Raw microphone recordings are messy: room rumble, background hiss, awkward silences, inconsistent volume, harsh sibilance. Jivetalking fixes all of this automatically, transforming raw voice recordings into broadcast-ready audio at -18 LUFS (the broadcast/podcast standard).

jivetalking presenter1.flac presenter2.flac presenter3.flac

That's it. No configuration, no knobs to tweak, no audio knowledge required.


Design Philosophy

Principle Implementation
Best outcome by default Professional results with zero configuration
Quality over speed Four-pass processing for measurement-driven accuracy
Transparency over depth Every filter prioritises natural sound
Adaptive everything Parameters tune automatically to your specific recording

The Filter Chain

Jivetalking's processing pipeline draws inspiration from legendary studio hardware: the Drawmer DS201 noise gate, noise suppressor, Teletronix LA-2A optical compressor, and UREI 1176 limiter. Each filter in the chain prepares the audio for the next.

Pass 1: Analysis

Measures your audio's characteristics to drive adaptive processing:

  • Integrated loudness, true peak, loudness range (EBU R128)
  • Noise floor and silence profile
  • Spectral characteristics (centroid, rolloff, kurtosis, skewness)
  • Dynamic range and transient sharpness

Pass 2: Adaptive Processing

Filter Inspiration What It Does
High-pass DS201 side-chain Removes subsonic rumble (50–60 Hz, adaptive to voice)
Low-pass DS201 side-chain Removes ultrasonic content that triggers false processing
Noise reduction Non-Local Means Adaptive Non-Local Means (anlmdn) denoiser with compand residual suppression
Gate DS201 expander Soft expansion for natural inter-phrase cleanup
Declicker DC-1 Autoregressive (AR) interpolation click/pop remover
Compressor LA-2A Programme-dependent optical compression with ~10ms attack
De-esser - Tames sibilance (adaptive intensity based on spectral rolloff)

Pass 3 & 4: Loudness Normalisation

Two-stage EBU R128 loudness normalisation using FFmpeg's loudnorm filter:

Pass What It Does
Pass 3: Measure Analyses processed audio to get integrated loudness, true peak, LRA, and threshold
Pass 4: Normalise Applies loudnorm with linear mode using Pass 3 measurements; UREI 1176-inspired peak limiter creates headroom for full linear gain

Why This Order Matters

Each filter prepares audio for the next:

  1. Rumble removal before spectral analysis - prevents low-frequency artifacts from confusing noise profiling
  2. Denoising before gating - lowers the noise floor so the gate threshold can be set optimally
  3. Gating before compression - removes silence before dynamics processing amplifies room tone
  4. Compression before de-essing - compression emphasises sibilance; de-essing corrects it
  5. Normalisation last - sees the fully processed signal for accurate loudness targeting
  6. Limiter before loudnorm - creates headroom so loudnorm can apply full linear gain without clipping or falling back to dynamic mode

Why Adaptive Matters

A dark-voiced narrator doesn't need aggressive de-essing. Pre-compressed audio doesn't need heavy compression. Clean studio recordings need different gating than noisy home offices.

Jivetalking measures your specific audio and adapts every filter automatically. The DS201-inspired gate tunes its threshold to your measured noise floor. The noise reducer adapts its compand expansion based on your measured noise profile. The LA-2A-inspired compressor adjusts ratio and release based on your dynamic range.


Workflow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. Record                                                  β”‚
β”‚     Each presenter records individually β†’ export as FLAC    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  2. Process                                                 β”‚
β”‚     $ jivetalking *.flac                                    β”‚
β”‚     Output: *-processed.flac (level-matched at -18 LUFS)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  3. Edit in Audacity                                        β”‚
β”‚     β€’ Import all processed files                            β”‚
β”‚     β€’ Top/tail and remove flubs                             β”‚
β”‚     β€’ Select all tracks β†’ Tracks menu β†’ Mix β†’ Mix to Mono   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  4. Finalize                                                β”‚
β”‚     β€’ Analyze β†’ Loudness Normalization (preview to check)   β”‚
β”‚     β€’ Normalize to -16 LUFS (dual-mono required)            β”‚
β”‚     β€’ Export as final podcast file                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Installation

Pre-built Binaries

Single binary with embedded FFmpegβ€”no external dependencies.

Download the latest release for your platform from the releases page:

# Linux (amd64)
chmod +x jivetalking-linux-amd64
sudo mv jivetalking-linux-amd64 /usr/local/bin/jivetalking

# Linux (arm64)
chmod +x jivetalking-linux-arm64
sudo mv jivetalking-linux-arm64 /usr/local/bin/jivetalking

# macOS (Intel)
chmod +x jivetalking-darwin-amd64
sudo mv jivetalking-darwin-amd64 /usr/local/bin/jivetalking

# macOS (Apple Silicon)
chmod +x jivetalking-darwin-arm64
sudo mv jivetalking-darwin-arm64 /usr/local/bin/jivetalking

Build from Source

See Development section below.


CLI Usage

jivetalking [flags] <files>

Flags

Flag Description
-v, --version Show version information
-d, --debug Enable debug logging to jivetalking-debug.log
--logs Save detailed analysis reports

Examples

# Process multiple files
jivetalking presenter1.flac presenter2.flac

# Process with debug logging and analysis reports
jivetalking -d --logs recording.flac

# Process all FLAC files in directory
jivetalking *.flac

Output

Processed files are saved in the same directory with -processed suffix:

  • recording.flac β†’ recording-processed.flac

Development

# Clone with submodules (ffmpeg-statigo provides embedded FFmpeg)
git clone --recursive https://github.com/linuxmatters/jivetalking
cd jivetalking

# Or initialise submodules after cloning
just setup

# Build
just build

# Run tests
just test

Project Structure

cmd/jivetalking/main.go     # CLI entry point (Kong + Bubbletea)
internal/
β”œβ”€β”€ audio/                  # FFmpeg demuxer/decoder wrapper
β”œβ”€β”€ processor/
β”‚   β”œβ”€β”€ analyzer.go         # Pass 1: ebur128 + astats + spectral analysis
β”‚   β”œβ”€β”€ processor.go        # Pass 2: adaptive filter chain execution
β”‚   β”œβ”€β”€ filters.go          # Filter chain configuration and building
β”‚   └── adaptive.go         # Measurement-driven parameter tuning
└── ui/                     # Bubbletea TUI model and views

Design Documentation


Contributing

# Run tests before committing
just test

# Create a release (validates format, creates annotated tag)
just release X.Y.Z

# Preview changelog
just changelog
  • Follow Conventional Commits format
  • Use just build for releases (CGO + version injection required)
  • See AGENTS.md for full development guidelines