计算实时分贝值

tiansz / 2023-04-29 / 原文

首先安装依赖:

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")