【问题标题】:Create list of amplitudes from wav files using Python使用 Python 从 wav 文件创建振幅列表
【发布时间】:2020-05-29 14:06:08
【问题描述】:
我为机器学习实验录制了一堆车辆行驶的音频片段。
这 300 个左右的剪辑长度各不相同(4 到 10 秒长),我想将它们都剪辑为 3 秒的固定长度,但是手动执行此操作很麻烦。我想要汽车经过麦克风的那一刻(最响亮的点),然后在那一刻之前和之后剪辑它 1.5 秒。
我想出的方法是:
- 获取文件的振幅列表
- 修复了一个 3 秒长的窗口以迭代幅度列表并从列表的开头开始,同时初始化变量 maxAmp 和 maxIndex 以跟踪记录的最大平均幅度和该段开始的索引
- 平均窗口中的所有幅度,检查是否大于迄今为止记录的最大平均值,如果是,则替换记录的最大平均值
- 将窗口向前移动 1 秒
- 重复 3 和 4 直到我们浏览完文件
- 将音频片段从 maxIndex 保存到 maxIndex+3 秒后作为新文件
- 对所有文件执行此操作
这是一个非常笼统的想法,我知道它并不准确。我认为取一个窗口的平均值比仅仅找到最大值所在的位置并在之前和之后去 1.5 更好,因为最大幅度可能是在剪辑中的某个点从麦克风中吹来的风,而不是实际上汽车开过的声音。
这有意义吗?有什么办法可以做得更好吗?哪些工具/库可以帮助我获得振幅列表?
谢谢!
【问题讨论】:
标签:
python
audio
wav
sliding-window
amplitude
【解决方案1】:
您可以使用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)