我有一堆车辆行驶的音频剪辑,是我为机器学习实验录制的。
这 300 个左右的剪辑长度各不相同(4-10 秒长),我想将它们全部剪辑为 3 秒的固定长度,但手动执行此操作非常痛苦。我想要汽车经过麦克风的那一刻(最响亮的点),然后在该时刻前后剪辑 1.5 秒。
我想出的一种方法是:
- 获取文件的幅度列表
- 修复一个 3 秒长的窗口,以迭代幅度列表并从列表开头开始,同时初始化变量 maxAmp 和 maxIndex 以跟踪记录的最大平均幅度以及该段开始的索引
- 对窗口中的所有幅度进行平均,检查是否大于迄今为止记录的最大平均值,如果是,则替换记录的最大平均值
- 将窗口向前移动 1 秒
- 重复 3 和 4,直到我们浏览完该文件
- 将 maxIndex 到 maxIndex+3 秒后的音频片段保存为新文件
- 对所有文件执行此操作
这是一个非常笼统的想法,我知道它并不准确。我认为取窗口的平均值比仅仅找到最大值的位置并在前后各增加 1.5 更好,因为最大幅度可能是剪辑中某个时刻麦克风中吹来的风,而不是实际的风。汽车行驶的声音。
这有道理吗?有什么办法可以做得更好吗?哪些工具/库可以帮助我获取振幅列表?
谢谢!
最佳答案
您可以使用 scipy.io
中的 wavefile
将 WAV 文件作为数组读取。然后您可以将其放入 pandas
数据框中来计算滚动平均值。使用 idxmax 函数查找滚动平均值最大值的索引。然后可以围绕该索引剪切数据并将其写入新的 WAV 文件。
from scipy.io import wavfile
import pandas as pd
import numpy as np
clip_time=3
#fs is the sample rate, so time=samples/fs
[fs,data]=wavfile.read('myRecording.wav','r')
cut_length=fs*3
df=pd.DataFrame(data)
df['rolling']=df[0].apply(abs).rolling(cut_length).sum()/cut_length
maxIdx=df['rolling'].idxmax()
cut_data=np.array(df[0][maxIdx-cut_length:maxIdx])
wavfile.write('clippedRecording.wav',fs,cut_data)
关于python - 使用 Python 从 wav 文件创建振幅列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60215051/