首先安装依赖:
sudo apt install -y portaudio19-dev
pip install pyaudio
接着运行程序,记得插入麦克风
import numpy as np
import scipy.signal as signal
import pyaudio
# 创建PyAudio对象
pa = pyaudio.PyAudio()
# 打开音频输入流
stream = pa.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024)
# 生成A加权滤波器
b, a = signal.A_weighting(44100)
while True:
# 从音频输入流中读取数据
data = np.frombuffer(stream.read(1024), dtype=np.int16)
# 将音频信号转换为频域信号
freq, spec = signal.welch(data, fs=44100, nperseg=1024, scaling='spectrum')
# 计算每个频率的功率谱密度
psd = spec / (freq[1] - freq[0])
# 将功率谱密度转换为分贝值
db = 10 * np.log10(signal.lfilter(b, a, psd))
# 对所有频率的分贝值取平均值,得到整个音频的实时分贝大小
db_avg = np.mean(db)
# 打印实时分贝大小
print('Real-time dB level: {:.2f} dB'.format(db_avg))
方法2:
# 导入所需的库
import pyaudio
import numpy as np
# 定义一些参数
CHUNK = 1024 # 每次读取的音频数据的大小
FORMAT = pyaudio.paInt16 # 音频数据的格式
CHANNELS = 1 # 音频数据的通道数
RATE = 44100 # 音频数据的采样率
REF_LEVEL = 20 # 参考分贝值,用于计算相对分贝值
# 创建一个pyaudio对象
pa = pyaudio.PyAudio()
# 打开一个音频流,用于获取音频输入
stream = pa.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# 定义一个函数,用于计算分贝值
def calculate_decibel(data):
# 将音频数据转换为numpy数组
data = np.frombuffer(data, dtype=np.int16)
# 计算音频数据的均方根值(RMS)
rms = np.sqrt(np.mean(data**2))
# 计算相对分贝值,使用20微帕斯卡作为参考声压级
db = 20 * np.log10(rms / REF_LEVEL)
# 返回分贝值
return db
# 定义一个循环,用于不断地读取音频数据并计算分贝值
while True:
# 读取一段音频数据
data = stream.read(CHUNK)
# 计算分贝值
db = calculate_decibel(data)
# 打印分贝值
print(f"Decibel level: {db:.2f} dB")
标签:音频,db,分贝,实时,计算,np,data,pyaudio
From: https://www.cnblogs.com/tiansz/p/17362840.html