Normalising podcast volumes on macOS

A very quick write-up of a solution I've found to a quite specific problem. I hope it's of use to somebody (or even just me in the future).

Problem: some podcasts that I like to listen to vary considerably in volume throughout, which means I have to keep adjusting the volume in loud environments, such as when cooking. I wanted to avoid having having to do this when listening to podcasts on my laptop.

Requirements:

  • No change to music player required (I want to keep using Spotify)
  • No work required ahead of time to prepare each podcast episode
  • Simple to enable/disable

General solution technique: Employ dynamic range compression to reduce the volume of the loud parts of the podcast, so that they're closer to the quiet parts, meaning no manual volume adjustment is necessary. This seemed easier to do than trying to control my laptop volume in sync with the podcast.

Specific solution: run all of my laptop audio output through a software dynamic range compression filter before it goes to the speakers. This means all application audio output is covered which makes it easy to use with Spotify.

This is how I did it on macOS Monterey.

Side note: This will make music sound awful and remove any punchiness from it (which is already slowly happening across the music industry anyway - see Loudness war), but for spoken word, it does what I wanted it to do. The end result will make podcasts sound more like radio programmes in terms of having consistent volume.

  1. Install Blackhole, a free audio loopback driver. This presents an extra input and output device to the system. I used to use Soundflower for this but it hasn't been maintained for a while and has some issues.
  2. Install Apple AU Lab (link at bottom of page), a free audio mixer allowing you to route audio through various effects processing units, a number of which are included with macOS.
  3. On recent versions of macOS, you need to grant microphone permissions to AU Lab so it can receive audio from BlackHole. Most applications prompt you, but AU Lab doesn't for some reason. Run this command to grant the permission (source):
    sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access VALUES('kTCCServiceMicrophone','com.apple.audio.aulab',0,2,2,1,NULL,NULL,NULL,'UNUSED',NULL,0, CAST(strftime('%s','now') AS INTEGER)) ;"
  4. Set your system output audio device to BlackHole. This captures audio from all applications (excepting those which are configured to output to a specific other device) - including Spotify, in my case. Note: you will no longer hear any sound until the next step, as it's no longer being routed to your speakers.
  5. Create a new document in AU Lab, using the "Stereo In/Stereo Out" template. Specify BlackHole as the input source, and your chosen speaker as your output device (for me, a Bluetooth speaker). You should now be able to hear application audio again, as the audio from the BlackHole input is now being routed to your output speaker.
  6. In the "Audio 1" column, under the "Effects" section, choose "AUDynamicsProcessor" from the drop-down menu to add a dynamic compressor.
  7. In the popup window for the AUDynamicsProcessor, set the parameters like so:
    • Compression threshold (centre dot): -50 dB
    • Headroom (right-hand side dot): only just above the compression threshold dot. ~9 dB
  8. Expand the "Details" section and set the following parameters:
    • Attack time: 0.002
    • Master Gain: ~11 dB (to amplify the output signal, as the compression makes it significantly quieter)
  9. Done