gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:35 28 4
gpt4 key购买 nike

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

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

frequencies

如您所见,第一个图中有较短和较宽的部分,就像我文件中较短和较长的声音一样。

我的问题是如何将每个声音编码为位?就像让文件中的每个长音代表一个 1,一个短音代表一个 0

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

最佳答案

通过对信号进行 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

然后简单地确定 threshold_maxTrue 的运行长度。同样,我将从 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 中的值现在应该是样本数中每个“开启”声音脉冲的长度。现在,您可以相对直接地测试每个值是长是短,然后将其写入文件。

关于python - 确定音频文件中声音的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56792526/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com