audio-normalizer
Scannednpx machina-cli add skill dkyazzentwatwa/chatgpt-skills/audio-normalizer --openclawAudio Normalizer
Normalize audio volume levels using peak or RMS normalization to ensure consistent loudness across files.
Purpose
Volume normalization for:
- Podcast episode consistency
- Music playlist leveling
- Speech recording standardization
- Broadcast loudness compliance
Features
- Peak Normalization: Normalize to maximum peak level (dBFS)
- RMS Normalization: Normalize to average loudness level
- Loudness Matching: Match LUFS target for broadcast compliance
- Batch Processing: Normalize multiple files to same level
- Format Preservation: Maintain original audio format
- Headroom Control: Prevent clipping with configurable headroom
Quick Start
from audio_normalizer import AudioNormalizer
# Peak normalization to -1 dBFS
normalizer = AudioNormalizer()
normalizer.load('input.mp3')
normalizer.normalize_peak(target_dbfs=-1.0)
normalizer.save('normalized.mp3')
# RMS normalization for consistent average loudness
normalizer.normalize_rms(target_dbfs=-20.0)
normalizer.save('normalized_rms.mp3')
# Batch normalize all files to same level
normalizer.batch_normalize(
input_files=['audio1.mp3', 'audio2.mp3'],
output_dir='normalized/',
method='rms',
target_dbfs=-20.0
)
CLI Usage
# Peak normalization
python audio_normalizer.py input.mp3 --output normalized.mp3 --method peak --target -1.0
# RMS normalization
python audio_normalizer.py input.mp3 --output normalized.mp3 --method rms --target -20.0
# Batch normalize directory
python audio_normalizer.py *.mp3 --output-dir normalized/ --method rms --target -20.0
# Show current levels without normalizing
python audio_normalizer.py input.mp3 --analyze-only
API Reference
AudioNormalizer
class AudioNormalizer:
def load(self, filepath: str) -> 'AudioNormalizer'
def normalize_peak(self, target_dbfs: float = -1.0, headroom: float = 0.1) -> 'AudioNormalizer'
def normalize_rms(self, target_dbfs: float = -20.0) -> 'AudioNormalizer'
def analyze_levels(self) -> Dict[str, float]
def save(self, output: str, format: str = None, bitrate: str = '192k') -> str
def batch_normalize(self, input_files: List[str], output_dir: str,
method: str = 'rms', target_dbfs: float = -20.0) -> List[str]
Normalization Methods
Peak Normalization
- Scales audio so highest peak reaches target level
- Preserves dynamic range
- Good for preventing clipping
- Target: typically -1.0 to -3.0 dBFS
RMS Normalization
- Scales audio so average level reaches target
- Better for perceived loudness matching
- Good for podcasts and speech
- Target: typically -20.0 to -23.0 dBFS
LUFS Matching
- Integrated Loudness Units relative to Full Scale
- Broadcast standard (EBU R128, ITU BS.1770)
- Target: -23 LUFS (broadcast), -16 LUFS (streaming)
Best Practices
For Podcasts:
normalizer.normalize_rms(target_dbfs=-19.0) # Speech clarity
For Music:
normalizer.normalize_peak(target_dbfs=-1.0) # Preserve dynamics
For Broadcast:
normalizer.normalize_rms(target_dbfs=-23.0) # EBU R128 compliance
Use Cases
- Podcast Production: Consistent volume across episodes
- Music Playlists: Even loudness for continuous playback
- Audiobooks: Standardized narration levels
- Conference Recordings: Normalize different speakers
- Video Production: Match audio levels before mixing
Limitations
- Does not apply dynamic compression (use separate compressor)
- Does not remove DC offset (pre-processing recommended)
- Peak normalization won't match perceived loudness
- Doesn't fix clipped audio (distortion is permanent)
Source
git clone https://github.com/dkyazzentwatwa/chatgpt-skills/blob/main/audio-normalizer/SKILL.mdView on GitHub Overview
Audio normalizer standardizes loudness across files by applying peak, RMS, or LUFS-based matching. It supports batch processing, format preservation, and headroom control to prevent clipping, making podcasts, music playlists, speeches, and broadcasts consistently loud.
How This Skill Works
It scales audio using a target peak or average level, and can perform LUFS-based loudness matching for broadcast compliance. The API exposes load, normalize_peak, normalize_rms, analyze_levels, save, and batch_normalize to process single files or groups while preserving the original format.
When to Use It
- When you need consistent podcast episode loudness
- For even loudness in music playlists
- To standardize speech recordings or audiobooks
- To meet broadcast loudness standards with LUFS matching
- To batch normalize multiple files to a common level
Quick Start
- Step 1: Load the file: normalizer = AudioNormalizer(); normalizer.load('input.mp3')
- Step 2: Apply normalization: normalizer.normalize_peak(target_dbfs=-1.0) or normalizer.normalize_rms(target_dbfs=-20.0)
- Step 3: Save: normalizer.save('normalized.mp3') or batch_normalize for multiple files
Best Practices
- Podcasts: use normalize_rms(target_dbfs=-19.0) for speech clarity
- Music: use normalize_peak(target_dbfs=-1.0) to preserve dynamics
- Broadcast: use normalize_rms(target_dbfs=-23.0) for EBU R128 compliance
- Batch normalize to a single level across many files for consistency
- Always set headroom to prevent clipping when using peak normalization
Example Use Cases
- Podcast Production
- Music Playlists
- Audiobooks
- Conference Recordings
- Video Production