首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建特性后,在创建UBM时,Sidekit代码会冻结。

创建特性后,在创建UBM时,Sidekit代码会冻结。
EN

Stack Overflow用户
提问于 2018-05-16 06:31:37
回答 1查看 387关注 0票数 1

我一直试图运行UBM.EM_Split()函数。我创建了一个功能文件feat.h5 (3.8MB),它存储来自24个音频文件的特性。我尝试使用这个特性文件作为函数中的feature_list参数的输入。但是,代码已经运行了72小时以上,没有输出或响应。仔细检查,冻结代码的代码行如下:

代码语言:javascript
复制
# Wait for all the tasks to finish
        queue_in.join()

下面是我所使用的代码(它基于侧翼工具网站上的UBM教程):

代码语言:javascript
复制
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)尝试了以下函数调用。但是,这也解决不了问题。

代码语言:javascript
复制
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 GB内存,mpi设置为真。

你知道我做错了什么吗?一个包含24个音频文件的h5文件(feat.h5是3.8MB)是否需要这么长时间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-19 22:15:23

我对您的代码做了一些调整,并设法使用一些wav文件来训练UBM --我把这些文件作为任意的训练数据。

编辑到我的数据的目录路径之后,您的代码成功地提取了这些特性。当运行EM_split部件时,它失败了,可能是因为与您的部件相同的错误。

这个问题相当简单,并且与特性提取器生成的HDF5文件的内部目录结构有关。FeaturesServer对象在解释文件列表时似乎不太灵活。因此,一个选项可以是编辑源代码(features_server.py)。然而,最简单的解决方法是将您的特性文件列表更改为FeaturesServer可以解释的内容。

特征提取:

代码语言:javascript
复制
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)

现在,在培训数据中,每个wav文件都有一个HDF5 5文件。不太优雅,因为你只能用一个,但它是有效的。函数extractor.save_list()非常有用,因为它允许运行多个进程,这将大大加快特征提取的速度。

我们现在可以训练UBM:

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
ubm_dir = os.path.join(base_dir, "ubm")
ubm.write(os.path.join(ubm_dir, "ubm_{}.h5".format(nbDistrib)))

就是这样!如果这对你有用的话请告诉我。特征提取和模型训练时间不到10分钟。(Ubuntu14.04,Python3.5.3,Sidekit诉1.2,30分钟的训练数据,样本率为16 1.2)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50363860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档