Код Sidekit зависает при создании UBM после создания функций - PullRequest
0 голосов
/ 16 мая 2018

Я пытался запустить функцию UBM.EM_Split () .Я создал файл элементов feat.h5 (3,8 МБ), в котором хранятся элементы из 24 аудиофайлов.Я попытался использовать этот файл функций в качестве входных данных для аргумента feature_list в функции.Тем не менее, код работает более 72 часов без вывода или ответа.При ближайшем рассмотрении строка кода, в которой код заморожен, выглядит следующим образом:

# Wait for all the tasks to finish
        queue_in.join()

Вот код, который я использовал (он основан на руководстве UBM на веб-сайте Sidekit):

import sidekit
import os

#Read all the files in the directory
all_files = os.listdir("D:/DatabaseFiles/Sidekit/")

extractor = sidekit.FeaturesExtractor(audio_filename_structure="D:/DatabaseFiles/Sidekit/{}",
                                      feature_filename_structure="D:/Sidekit/Trial/feat.h5",
                                      sampling_frequency=16000,
                                      lower_frequency=200,
                                      higher_frequency=3800,
                                      filter_bank="log",
                                      filter_bank_size=24,
                                      window_size=0.04,
                                      shift=0.01,
                                      ceps_number=20,
                                      vad="snr",
                                      snr=40,
                                      pre_emphasis=0.97,
                                      save_param=["vad", "energy", "cep", "fb"],
                                      keep_all_features=True)

#To iterate through a whole list
for x in all_files:
    extractor.save(x)

server = sidekit.FeaturesServer(feature_filename_structure="D:/Sidekit/Trial/feat.h5",
                                sources=None,
                                dataset_list=["vad", "energy", "cep", "fb"],
                                feat_norm="cmvn",
                                global_cmvn=None,
                                dct_pca=False,
                                dct_pca_config=None,
                                sdc=False,
                                sdc_config=None,
                                delta=True,
                                double_delta=True,
                                delta_filter=None,
                                context=None,
                                traps_dct_nb=None,
                                rasta=True,
                               keep_all_features=True)

ubm = sidekit.Mixture()

ubm.EM_split(features_server=server,
             feature_list="D:/Sidekit/Trial/feat.h5",
             distrib_nb=32,
             iterations=(1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8),
             num_thread=10,
             save_partial=True,
             ceil_cov=10,
             floor_cov=1e-2
             )

Я также попробовал следующий вызов функции на основе предложения, полученного от опытного пользователя ( feature_list = all_files ).Но это тоже не решило проблему.

ubm.EM_split(features_server=server,
             feature_list=all_files,
             distrib_nb=32,
             iterations=(1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8),
             num_thread=10,
             save_partial=True,
             ceil_cov=10,
             floor_cov=1e-2
             )

У меня была одна и та же проблема как в Windows, так и в Linux.Обе системы имеют 32 ГБ оперативной памяти, а значение mpi установлено на true.

Знаете, что я делаю неправильно?Должно ли это занять много времени для файла h5 с функциями из 24 аудиофайлов (feat.h5 составляет 3,8 МБ)?

1 Ответ

0 голосов
/ 20 мая 2018

Я немного изменил ваш код и смог обучить UBM, используя некоторые wav-файлы, которые у меня были в качестве произвольных обучающих данных.

После редактирования путей к моим данным в каталогах, ваш код успешно извлек функции,При запуске части EM_split произошел сбой, возможно, из-за той же ошибки, что и у вас.

Проблема довольно проста и связана с внутренней структурой каталогов файла HDF5, созданного экстрактором возможностей.Кажется, что объект FeaturesServer не очень гибок, когда интерпретирует списки файлов.Поэтому одним из вариантов может быть редактирование исходного кода (features_server.py).Однако самый простой обходной путь - изменить список файлов объектов на то, что FeatureServer может интерпретировать как есть.

Извлечение функции:

import sidekit
import os
import numpy as np

# Setting parameters
nbThread = 4 # change to desired number of threads
nbDistrib = 32 # change to desired final number of Gaussian distributions
base_dir = "./Database/sidekit_data"
wav_dir = os.path.join(base_dir, "wav")
feature_dir = os.path.join(base_dir, "feat")

# Prepare file lists 
all_files = os.listdir(wav_dir)
show_list = np.unique(np.hstack([all_files]))
channel_list = np.zeros_like(show_list, dtype = int)

# 1: Feature extraction
extractor = sidekit.FeaturesExtractor(audio_filename_structure=os.path.join(wav_dir, "{}"),
                                      feature_filename_structure=os.path.join(feature_dir, "{}.h5"),
                                      sampling_frequency=16000,
                                      lower_frequency=200,
                                      higher_frequency=3800,
                                      filter_bank="log",
                                      filter_bank_size=24,
                                      window_size=0.04,
                                      shift=0.01,
                                      ceps_number=20,
                                      vad="snr",
                                      snr=40,
                                      pre_emphasis=0.97,
                                      save_param=["vad", "energy", "cep", "fb"],
                                      keep_all_features=True)


extractor.save_list(show_list=show_list,
                    channel_list=channel_list,
                    num_thread=nbThread)

Теперь у вас есть один HDF5-файл для каждого wav-файла в обучающих данных.Не очень элегантно, так как вы могли бы справиться только с одним, но это работает.Функция extractor.save_list () полезна тем, что позволяет запускать несколько процессов, что значительно ускоряет извлечение функций.

Теперь мы можем обучить UBM:

# 2: UBM Training
ubm_list = os.listdir(os.path.join(base_dir, "feat")) # make sure this directory only contains the feature files extracted above
for i in range(len(ubm_list)):
    ubm_list[i] = ubm_list[i].split(".h5")[0]

server = sidekit.FeaturesServer(feature_filename_structure=os.path.join(feat_dir, "{}.h5"),
                                sources=None,
                                dataset_list=["vad", "energy", "cep", "fb"],
                                feat_norm="cmvn",
                                global_cmvn=None,
                                dct_pca=False,
                                dct_pca_config=None,
                                sdc=False,
                                sdc_config=None,
                                delta=True,
                                double_delta=True,
                                delta_filter=None,
                                context=None,
                                traps_dct_nb=None,
                                rasta=True,
                                keep_all_features=True)


ubm = sidekit.Mixture()


ubm.EM_split(features_server=server,
             feature_list=ubm_list,
             distrib_nb=nbDistrib,
             iterations=(1, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8),
             num_thread=nbThread,
             save_partial=True,
             ceil_cov=10,
             floor_cov=1e-2
             )

Я рекомендуюдобавив следующую строку в конце, чтобы сохранить ваш UBM:

ubm_dir = os.path.join(base_dir, "ubm")
ubm.write(os.path.join(ubm_dir, "ubm_{}.h5".format(nbDistrib)))

Вот оно!Дайте мне знать, если это работает для вас.Извлечение функций и обучение модели заняло не более 10 минут.(Ubuntu 14.04, Python 3.5.3, Sidekit v 1.2, 30 минут обучения данных с частотой дискретизации 16 кГц).

...