python - 使用 Python 从 wav 文件创建振幅列表

标签 python audio wav sliding-window amplitude

我有一堆车辆行驶的音频剪辑,是我为机器学习实验录制的。

这 300 个左右的剪辑长度各不相同(4-10 秒长),我想将它们全部剪辑为 3 秒的固定长度,但手动执行此操作非常痛苦。我想要汽车经过麦克风的那一刻(最响亮的点),然后在该时刻前后剪辑 1.5 秒。

我想出的一种方法是:

  1. 获取文件的幅度列表
  2. 修复一个 3 秒长的窗口,以迭代幅度列表并从列表开头开始,同时初始化变量 maxAmp 和 maxIndex 以跟踪记录的最大平均幅度以及该段开始的索引
  3. 对窗口中的所有幅度进行平均,检查是否大于迄今为止记录的最大平均值,如果是,则替换记录的最大平均值
  4. 将窗口向前移动 1 秒
  5. 重复 3 和 4,直到我们浏览完该文件
  6. 将 maxIndex 到 maxIndex+3 秒后的音频片段保存为新文件
  7. 对所有文件执行此操作

这是一个非常笼统的想法,我知道它并不准确。我认为取窗口的平均值比仅仅找到最大值的位置并在前后各增加 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/

相关文章:

python-3.x - 音乐无法从文件中播放,但在IDLE中可以正常播放

Java - 组合 2 个以上 .wav 文件时出现问题

c - 用C处理音频wav文件

python - 通过fft查找wav文件的频率幅度和相位

python - Tkinter GUI 中的多线程,不同类中的线程

python - 在 python selenium 中单击正则表达式的链接

c# - 使用 Naudio 将每个 WAV channel 保存为单 channel WAV 文件

python - Lame MP3 Converter 的 Python 等价物是什么?

python - 如何在没有root权限的情况下部署nginx?

java - RobotFramework无法导入Java关键字库