Форум сайта python.su
Имеется набор аудиофайлов длительностью до 10 сек. с соревнований по информационной безопасности. Требуется обработать файлы в Python (Anaconda):
Выделить признаки говорящего соответствующими методами (mfcc, plp, lpc, cqcc, mgd и т.п). Признаки выделяются для категорий (обучающий, тестовый, рабочий), разложенным по соответствующим папкам. Необходимо признаки выделяются для каждого аудиофайла и сохраняются в один файл формата HDF5 для соответствующей категории.
После чего с использованием библиотеки MSR Identity Toolkit v1.0 на Matlab необходимо сделать модели обработки признаков по системам GMM-UBM и i-Vector.
Я сделал для одного из методов (MGD) обработки, но столкнулся с проблемой - не могу собрать все признаки в одну таблицу. Кто сможет подсказать косяк в цикле?
## Подгружаем все нужные либы import os import sys import fnmatch import scipy.io.wavfile as wav import numpy as np import numpy import matplotlib.pyplot as plt import numpy.fft as yfft import numpy.fft as nfft import h5py import numpy as np ##Загружаем аудиофайлы root = 'H:\\...' pattern = '*.wav' mgd_list = [] print(mgd_list) for folder, subdirs, files in os.walk(root): # print (folder) for filename in fnmatch.filter(files, pattern): fullname = os.path.join(folder, filename) name, pat = os.path.splitext(os.path.basename(fullname)) #print(name, pat) ##Формируем признаки #Формируем окна #загружаем ряд для анализа и выыбираем первые 3 секунды rate, sig = wav.read(fullname) signal = sig[0:int(3.5 * rate)] #print(signal) #усиливаем высокие частоты pre_emphasis = 0.97 emphasized_signal = numpy.append(signal[0], signal[1:] - pre_emphasis * signal[:-1]) #задаем шаг и размер окна frame_size = 0.025 frame_stride = 0.01 frame_length, frame_step = frame_size * rate, frame_stride * rate signal_length = len(emphasized_signal) frame_length = int(round(frame_length)) frame_step = int(round(frame_step)) num_frames = int(numpy.ceil(float(numpy.abs(signal_length - frame_length)) / frame_step)) pad_signal_length = num_frames * frame_step + frame_length z = numpy.zeros((pad_signal_length - signal_length)) pad_signal = numpy.append(emphasized_signal, z) indices = numpy.tile(numpy.arange(0, frame_length), (num_frames, 1)) + numpy.tile(numpy.arange(0, num_frames * frame_step, frame_step), (frame_length, 1)).T frames = pad_signal[indices.astype(numpy.int32, copy=False)] #делаем окно хэмминга frames *= numpy.hamming(frame_length) #расчитываем преоброзование фурье сигнала x(n) xspec = nfft.fft(frames) #мнимая часть ixspec = np.imag(nfft.fft(frames)) #реальная часть rxspec = np.real(nfft.fft(frames)) #получаем сигнал nx(n) nn, nm = frames.shape dep = np.arange(1, nn+1).reshape((nn,1)) yframes = dep*frames #расчитываем преоброзование фурье сигнала nx(n) yspec = nfft.fft(yframes) #мнимая часть iyspec = np.imag(nfft.fft(yframes)) #реальная часть ryspec = np.real(nfft.fft(yframes)) #перемножаем и суммируем поэлементно мнимую и реальную части chs=(ryspec * rxspec) + (ixspec * iyspec) #расчет модуля zn= np.abs(nfft.fft(frames)) #Считаем модифицированную групповую задержку (MGD) y = 0.9 st = 2*y znam = zn**st alpha = 0.4 x = (chs/znam)**alpha for mgd in x: mgd = np.vstack(x) print(mgd.shape) np.savetxt('H:\\...', mgd, delimiter = ",")
Офлайн
У Вас некая математика, для понимания которой нужно изучать обозначенные модули… но если в подробности не вдаваться, то, на 5й сконца строке ( x = (chs/znam)**alpha ) заканчиваются обработки всех найденных файлов, которые никуда не сохраняются.
При этом, Вы завели некий пустой массив “mgd_list”, который никак не используете. Может быть в него и нужно класть Ваши обработки?
Дальше, после обработки всех файлов, вы разбираете содержимое “x”, полученное от последнего файла. Не знаю, какой тип данных там хранится, но по-началу кажется, что его содержимое выводится на экран и последнее значение отправляется в файл, на самом деле, последним циклом, идет перебор внутри “x”, но каждое полученное значение тут же заменяется на “np.vstack(x)”, что скорее всего всегла дает одно и тоже значение (в любом случае цикл “mgd” выглядит лишним), вот оно у Вас в файл и отправляется.
Офлайн