确定音频文件中声音的长度

时间:2019-06-27 13:49:32

标签: python plot wav

我有一个.wav文件,其中包含2种声音:长音和短音。我需要做的是将它们编码为位并将其写入二进制文件。

我从这样的答案中得到了代码:https://stackoverflow.com/a/53309191/2588339,并使用它为我的输入wav文件获得了该图:

frequencies

如您所见,在第一张图中,我的文件中声音越来越短,声音部分越来越短。

我的问题是如何对每种声音进行一点编码?就像文件中的每个长音代表1,而短音代表0

编辑:两种声音的播放时间和频率也不同。声音越长,频率越低,声音越短,频率也越高。您可以在这里找到该文件的示例:https://vocaroo.com/i/s0A1weOF3I3f

1 个答案:

答案 0 :(得分:1)

通过对信号进行FFT来测量每个频率的响度是更“科学”的方法,但是原始信号的图像表明,应该比这容易得多。

如果您使用滑动窗口(至少与声音的主频率的1个周期一样宽(约300Hz))并在该窗口内找到最大值,则应很容易地应用阈值来确定声音是否在给定的时间间隔播放。 Here's关于滚动窗口功能的快速文章。

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

window_size = sample_rate / primary_freq #minimum size window. could be larger.
rolling_max = np.max(rolling_window(wav_data, window_size),-1)
threshold_max = rolling_max > threshold # maybe about 1000ish based on your graph

然后只需确定Truethreshold_max的游程长度。再次,我将从this答案中提取一个社区,该社区展示了一种获取数组(或其他可迭代)游程长度的简洁方法。

def runs_of_ones(bits):
  for bit, group in itertools.groupby(bits):
    if bit: yield sum(group)

run_lengths = list(runs_of_ones(threshold_max))

run_lengths中的值现在应该是#个样本中每个“打开”声音脉冲的长度。现在,您可以相对简单地测试每个值(长或短)并写入文件。