When you can’t place your speakers equally far from your ears, you need to adjust the audio balance in order to compensate for the perceived difference in volume.
Windows allows you to compensate the audio volume natively using the system settings – however it has one critical issue: If you ever set your audio volume to zero, your balance settings get lost and you need to click through plenty of dialogs in order to re-configure it.
In our previous post How to set Windows audio balance using Python we showed how tp use the pycaw library to (see that post for installation instructions etc).
The following Python script can be run to set the audio balance to. It has been designed to keep the mean (i.e. L+R) audio level in dB when adjusting the volume (i.e. it will not change the overall volume and hence avoid blowing out your eardrums) and will not do any adjustment if the balance is already within 0.1 dB
.
Set desiredDelta
to your desired left-right difference in dB
(positive values mean that the left speaker will be louder than the right speaker)!
from ctypes import cast, POINTER from comtypes import CLSCTX_ALL from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume import math # Get default audio device using PyCAW devices = AudioUtilities.GetSpeakers() interface = devices.Activate( IAudioEndpointVolume._iid_, CLSCTX_ALL, None) volume = cast(interface, POINTER(IAudioEndpointVolume)) # Get current volume of the left channel currentVolumeLeft = volume.GetChannelVolumeLevel(0) # Set the volume of the right channel to half of the volume of the left channel volumeL = volume.GetChannelVolumeLevel(0) volumeR = volume.GetChannelVolumeLevel(1) print(f"Before adjustment: L={volumeL:.2f} dB, R={volumeR:.2f} dB") desiredDelta = 6.0 # Desired delta between L and R. Positive means L is louder! delta = abs(volumeR - volumeL) mean = (volumeL + volumeR) / 2. # Re-configure balance if delta is not if abs(delta - desiredDelta) > 0.1: # Adjust volume volume.SetChannelVolumeLevel(0, mean + desiredDelta/2., None) # Left volume.SetChannelVolumeLevel(1, mean - desiredDelta/2., None) # Right # Get & print new volume volumeL = volume.GetChannelVolumeLevel(0) volumeR = volume.GetChannelVolumeLevel(1) print(f"After adjustment: L={volumeL:.2f} dB, R={volumeR:.2f} dB") else: print("No adjustment neccessary")