5

我正在尝试测量 wav 文件的导入和导出。最好是第一个和最后一个5秒左右。我基本上是在尝试分配一个数值,表示“这首歌的引导速度很慢”或“这首歌的结尾很突然”。

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

在此处输入图像描述

基本上我正在寻找一种方法来收集数据点来复制这个图,这样我就可以得到斜率。

编辑 - 在java中工作

4

3 回答 3

9

我不知道有任何命令行工具可以做到这一点,但是使用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)

于 2012-11-06T03:38:50.897 回答
1

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

  1. 您需要 python 3+ 才能使用统计包(请参阅这篇适用于 Mac 的优秀文章 - https://opensource.com/article/19/5/python-3-default-mac
  2. 你需要 scipy - 在 Mac 上是: pip install 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)
于 2020-12-20T02:34:21.430 回答
0

这里只是关于 SO 的几个问题,关于在 Java 中读取音频文件和绘制波形和波形概览。

如何在 Java 中创建声音文件

如何从我的 wav 文件中提取声音数据?

为音频文件创建 PNG 波形的 Java 程序

于 2012-11-06T19:58:29.917 回答