【问题标题】:Sidekit code freezes during UBM creation after creating features创建特性后,在创建 UBM 期间 Sidekit 代码冻结
【发布时间】:2018-10-26 02:14:54
【问题描述】:

我一直在尝试运行 UBM.EM_Split() 函数。我创建了一个功能文件 feat.h5 (3.8 MB),它存储了 24 个音频文件的功能。我尝试将此功能文件用作函数中 feature_list 参数的输入。但是,代码已经运行了超过 72 小时,没有任何输出或响应。仔细观察,代码被冻结的代码行如下:

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

这是我使用的代码(它基于 sidekit 网站上的 UBM 教程):

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 GB RAM,并且 mpi 设置为 true。

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

【问题讨论】:

    标签: python mpi speech-recognition sidekit


    【解决方案1】:

    我对您的代码进行了一些调整,并设法使用我作为任意训练数据撒谎的一些 wav 文件来训练 UBM。

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

    问题比较简单,与特征提取器生成的 HDF5 文件的内部目录结构有关。似乎 FeaturesServer 对象在解释文件列表时不是很灵活。因此,一种选择可能是编辑源代码 (features_server.py)。但是,最简单的解决方法是将功能文件列表更改为 FeaturesServer 可以按原样解释的内容。

    特征提取:

    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 文件。不是很优雅,因为你可以只用一个来管理,但它确实有效。函数 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 分钟的训练数据,采样率为 16kHz)。

    【讨论】:

    • 谢谢乔根。调整后的代码适用于 Linux 和 Mac OS。在windows环境下仍然出现同样的问题。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多