I'm looking to find the current decibel level in a room using a microphone and setting it as a variable. I haven't been able to find any python code on this so I'm very stuck.
It would be good if the variable could refresh every 0.3 of a second but it doesn't have to.
Thanks for your help!!
Here is some python code using the pyaudio library
that can calculate the dB level using Root Mean Square (RMS) and print it every 0.3 seconds. Both the rms
and db
are available as variables.
import pyaudio
import time
from math import log10
import audioop
p = pyaudio.PyAudio()
WIDTH = 2
RATE = int(p.get_default_input_device_info()['defaultSampleRate'])
DEVICE = p.get_default_input_device_info()['index']
rms = 1
print(p.get_default_input_device_info())
def callback(in_data, frame_count, time_info, status):
global rms
rms = audioop.rms(in_data, WIDTH) / 32767
return in_data, pyaudio.paContinue
stream = p.open(format=p.get_format_from_width(WIDTH),
input_device_index=DEVICE,
channels=1,
rate=RATE,
input=True,
output=False,
stream_callback=callback)
stream.start_stream()
while stream.is_active():
db = 20 * log10(rms)
print(f"RMS: {rms} DB: {db}")
# refresh every 0.3 seconds
time.sleep(0.3)
stream.stop_stream()
stream.close()
p.terminate()
As mentioned in the comment above - measuring dB can be a deeper topic than perhaps you require here. Without some info about the usecase, just note that although the method here is the most common you'll likely see - it only compares peaks to itself. This question has a great discussion about this.
If you need a real world measurement of decibels, you'll need reference measurements, calibrated equipment and a little more research!