音频文件的音量分析

当声源环境不同时,采取不同的声音处理策略。

总共使用了两种计算声音分贝的方法

  • 算法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()

再有其他算法的话,再继续加。

参考1

猜你喜欢

转载自blog.51cto.com/feature09/2421804