Создайте список амплитуд из файлов WAV, используя Python - PullRequest
1 голос
/ 13 февраля 2020

У меня есть куча аудиоклипов автомобилей, проезжающих мимо, которые я записал для эксперимента по ML.

Эти 300 или около того клипов различаются по длине (4-10 секунд), и я хотел бы обрезать их до фиксированной длины в 3 секунды, но делать это вручную - боль в заднице , Я хочу момент, когда машина проезжает мимо микрофона (самая громкая точка), а затем обрезать его за 1,5 секунды до и после этого момента.

Я понял, как это сделать:

  1. Получить список амплитуд для файла
  2. Исправить окно продолжительностью 3 секунды, чтобы перебирать список амплитуды и начинаются в начале списка, также инициализируйте переменные maxAmp и maxIndex, чтобы отслеживать максимальную среднюю зарегистрированную амплитуду и индекс, где начинается этот сегмент
  3. Среднее значение всех амплитуд в окне, проверьте, больше ли максимальное максимальное значение, записанное до сих пор и если это так, замените максимальное среднее записанное
  4. Переместите окно вперед на 1 секунду
  5. Повторяйте 3 и 4, пока мы не пройдем файл
  6. Сохранить аудиосегмент из от maxIndex до maxIndex + 3 секунды после создания нового файла
  7. Сделайте это для всех файлов

Это действительно общая идея, и я знаю, что она не точна. Я подумал, что взять среднее значение для окна было бы лучше, чем просто найти место, где находится максимум, и перейти на 1,5 до и после, поскольку максимальная амплитуда может быть некоторой силой ветра в mi c в некоторой точке клипа и на самом деле это не звук проезжающей машины.

Имеет ли это смысл? Есть ли способ сделать это лучше? Какие инструменты / библиотеки могут помочь мне получить список амплитуд?

Спасибо!

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете использовать wavefile из scipy.io для чтения файла 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)
...