2017-02-19 5 views
1

В настоящее время я разрабатываю аудио классификатор с Python API TensorFlow, используя набор данных UrbanSound8K и пытаясь различать 10 взаимоисключающих классов.Каким образом аудио должно быть предварительно обработано для классификации?

Аудиофайлы имеют длину 4 секунды и содержат 176400 точек данных, что приводит к серьезным проблемам с памятью. Каким образом аудио должно быть предварительно обработано для уменьшения использования памяти?

И как можно извлечь из аудио звука более полезные функции (используя свертку и объединение)?

ответ

1

Я лично предпочитаю спектрограммы в качестве входных данных для нейронных сетей, когда речь идет о классификации звука. Таким образом, исходные аудиоданные преобразуются в представление изображения, и вы можете рассматривать его как базовую задачу классификации изображений.

Есть несколько способов, чтобы выбрать из, вот что я обычно используя SciPy, python_speech_features и pydub:

import numpy as np 
import scipy.io.wavfile as wave 
import python_speech_features as psf 
from pydub import AudioSegment 

#your sound file 
filepath = 'my-sound.wav' 

def convert(path): 

    #open file (supports all ffmpeg supported filetypes) 
    audio = AudioSegment.from_file(path, path.split('.')[-1].lower()) 

    #set to mono 
    audio = audio.set_channels(1) 

    #set to 44.1 KHz 
    audio = audio.set_frame_rate(44100) 

    #save as wav 
    audio.export(path, format="wav") 

def getSpectrogram(path, winlen=0.025, winstep=0.01, NFFT=512): 

    #open wav file 
    (rate,sig) = wave.read(path) 

    #get frames 
    winfunc=lambda x:np.ones((x,)) 
    frames = psf.sigproc.framesig(sig, winlen*rate, winstep*rate, winfunc) 

    #Magnitude Spectrogram 
    magspec = np.rot90(psf.sigproc.magspec(frames, NFFT)) 

    #noise reduction (mean substract) 
    magspec -= magspec.mean(axis=0) 

    #normalize values between 0 and 1 
    magspec -= magspec.min(axis=0) 
    magspec /= magspec.max(axis=0) 

    #show spec dimensions 
    print magspec.shape  

    return magspec 

#convert file if you need to 
convert(filepath) 

#get spectrogram 
spec = getSpectrogram(filepath) 

Во-первых, необходимо стандартизировать свои аудио файлы с точки зрения частоты дискретизации и каналов , Вы можете сделать это (и многое другое) с отличным пакетом pydub.

После этого вам необходимо преобразовать аудиосигнал в изображение с помощью FFT. Вы можете сделать это с помощью scipy.io.wavefile и модуля sigproc python_speech_features. Мне нравится спектрограмма величины, поворачивайте ее на 90 градусов, нормализуйте ее и используйте полученный массив NumPy в качестве входных данных для моих коннектов. Вы можете изменить пространственные размеры спектрограммы путем корректировки значений WinStep и NFFT, чтобы соответствовать размеру входного сигнала.

Могут быть более простые способы сделать все это; Я получил хорошие результаты общей классификации, используя приведенный выше код.

+0

Почему спектрограмма должна вращаться на 90 градусов? – Androbin

+0

Это не имеет значения для входа в конвете, только для просмотра и понимания того, что он изображает (спектрограммы обычно имеют время как ось x). Вы можете просто игнорировать поворот на 90 градусов, если вы не собираетесь визуализировать спектрограмму. –

+1

Следует также отметить, что среднее значение (ось = 0) является средним значением только для столбцов. Среднему значению для всей спектрограммы требуется ось = Нет (что является значением по умолчанию). –

Смежные вопросы