Уведомления

Группа в Telegram: @pythonsu

#1 Май 13, 2018 06:54:14

bear541
Зарегистрирован: 2018-05-13
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка аудиофайлов

Имеется набор аудиофайлов длительностью до 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 = ",")

Пробовал разные варианты с помощью np.stack и append для списка

Офлайн

#2 Июнь 9, 2018 02:25:06

NiOl
Зарегистрирован: 2018-05-07
Сообщения: 19
Репутация: +  1  -
Профиль   Отправить e-mail  

Обработка аудиофайлов

У Вас некая математика, для понимания которой нужно изучать обозначенные модули… но если в подробности не вдаваться, то, на 5й сконца строке ( x = (chs/znam)**alpha ) заканчиваются обработки всех найденных файлов, которые никуда не сохраняются.
При этом, Вы завели некий пустой массив “mgd_list”, который никак не используете. Может быть в него и нужно класть Ваши обработки?

Дальше, после обработки всех файлов, вы разбираете содержимое “x”, полученное от последнего файла. Не знаю, какой тип данных там хранится, но по-началу кажется, что его содержимое выводится на экран и последнее значение отправляется в файл, на самом деле, последним циклом, идет перебор внутри “x”, но каждое полученное значение тут же заменяется на “np.vstack(x)”, что скорее всего всегла дает одно и тоже значение (в любом случае цикл “mgd” выглядит лишним), вот оно у Вас в файл и отправляется.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version