有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

wav文件中特定点的java分贝值

我正在尝试测量wav文件的引入和引出。最好是第一次和最后5秒左右。我基本上是试图分配一个数值,这意味着“这首歌有一个缓慢的领先”或“这首歌有一个突然的结束”

我的想法是获得dB值的斜率,但我似乎找不到一个linux命令行工具来为我提供dB值。我知道它们是可以测量的,因为Audacity有一个波形(db)视图

enter image description here

基本上,我正在寻找一种方法来收集数据点,以复制此图,从而获得斜率

java中的编辑工作


共 (3) 个答案

  1. # 1 楼答案

    我不知道有什么命令行工具可以做到这一点,但是使用scipy库编写具有此功能的python脚本相当简单

    我们可以使用scipy.io.wavfile执行文件IO,然后自己计算dB值(请注意,这些值不一定是标准的dB值,因为它们取决于您的扬声器和音量设置)

    首先我们得到文件:

    from scipy.io.wavfile import read
    samprate, wavdata = read('file.wav')
    

    然后,我们将文件分割为块,块的数量取决于您想要测量体积的精细程度:

    import numpy as np
    chunks = np.array_split(wavdata, numchunks)
    

    最后,我们计算每个区块的体积:

    dbs = [20*log10( sqrt(mean(chunk**2)) ) for chunk in chunks]
    

    其中dbs现在是文件每个块的dB值列表(同样,不一定是真正的SPL声级)

    您还可以使用重叠块等,以不同的方式轻松拆分数据

    参考资料: -scipy.io.wavfile -dB (SPL)

  2. # 3 楼答案

    对于那些试图在@Isaac的答案中使用Python脚本的人,我将其清理干净(我也不知道Python,但我已经让它工作了)。一些注意事项:

    1. 您需要Python3+来使用统计数据包(请参阅这篇关于Mac-https://opensource.com/article/19/5/python-3-default-mac的优秀文章)
    2. 你需要scipy-在mac上是:pip安装scipy
    from scipy.io.wavfile import read
    samprate, wavdata = read('intro.wav')
    import numpy as np
    import math
    import statistics 
    # basically taking a reading every half a second - the size of the data 
    # divided by the sample rate gives us 1 second chunks so I chop 
    # sample rate in half for half second chunks
    chunks = np.array_split(wavdata, wavdata.size/(samprate/2))
    dbs = [20*math.log10( math.sqrt(statistics.mean(chunk**2)) ) for chunk in chunks]
    print(dbs)