当声源环境不同时,采取不同的声音处理策略。
总共使用了两种计算声音分贝的方法
- 算法1:绝对值的平均值
- 算法2:平方和的对数
代码
import wave
import numpy as np
import matplotlib.pyplot as plt
# 分析音量、分贝的图形
def analyze_db():
# 开发wav音频文件
wf = wave.open('./record_test.wav', 'r')
# 设置每次读取块的大小
chunk = 1024
# 用来添加音量的数组
value1 = [] # 绝对值的平均值
value2 = [] # 对数
# 对每1024块的声音进行分析
while True:
# 每次读取1024
stream_data = wf.readframes(chunk)
print(stream_data)
# 当数据为空的时候,退出
if stream_data == b'':
break
# 每块对应的声音分贝
data = np.fromstring(stream_data, dtype=np.int16)
# print(data) # [ 11 8 15 ... -39 -5 12] 是这种数据
# 算法1
db1 = np.average(np.abs(data)) * 2
# 算法2
db2 = 10 * np.log10(np.sum(data * data))
# 只取整数
value1.append(int(str(db1).strip().split('.')[0]))
value2.append(int(str(db2).strip().split('.')[0]))
# 关闭
wf.close()
length1 = len(value1)
x1 = np.arange(0, length1)
y1 = np.array(value1)
# print(x, y)
length2 = len(value2)
x2 = np.arange(0, length2)
y2 = np.array(value2)
# print(x, y)
# 绘制波形图
plt.subplot(2, 1, 1)
plt.xlabel('length1')
plt.ylabel('value1')
plt.plot(x1, y1, c='r')
# 绘制波形图
plt.subplot(2, 1, 2)
plt.xlabel('length2')
plt.ylabel('value2')
plt.plot(x2, y2, c='r')
plt.subplots_adjust(hspace=0.5)
plt.show()
if __name__ == '__main__':
analyze_db()
再有其他算法的话,再继续加。