import osimport librosaimport numpy as npfrom tqdm import tqdmclean_train_folder = dataclean_trainset_56spk_wavclean_trainset_56spk_wavnoisy_train_folder = datanoisy_trainset_56spk_wavnoisy_trainset_5
该代码用于将音频文件切片、序列化并保存在文件夹中,以便用于训练和测试。以下是逐行的解释:
import os:导入Python内置模块,用于处理操作系统相关的任务。import librosa:导入音频处理库,用于处理音频文件。import numpy as np:导入数学计算库,用于处理序列化数据。from tqdm import tqdm:导入进度条库,用于在处理大量文件时显示进度条。clean_train_folder = 'data/clean_trainset_56spk_wav/clean_trainset_56spk_wav':定义干净训练集音频文件夹路径。noisy_train_folder = 'data/noisy_trainset_56spk_wav/noisy_trainset_56spk_wav':定义嘈杂训练集音频文件夹路径。clean_test_folder = 'data/clean_testset_wav/clean_testset_wav':定义干净测试集音频文件夹路径。noisy_test_folder = 'data/noisy_testset_wav/noisy_testset_wav':定义嘈杂测试集音频文件夹路径。serialized_train_folder = 'data/serialized_train_data':定义序列化后的训练集音频数据存放文件夹路径。serialized_test_folder = 'data/serialized_test_data':定义序列化后的测试集音频数据存放文件夹路径。window_size = 2 ** 14:定义每个切片的长度。sample_rate = 16000:定义采样率。def slice_signal(file, window_size, stride, sample_rate)::定义切片音频文件的函数。wav, sr = librosa.load(file, sr=sample_rate):加载音频文件并指定采样率。hop = int(window_size * stride):定义切片的跳跃长度。slices = []:定义一个空列表。for end_idx in range(window_size, len(wav), hop)::循环遍历音频文件,以hop为步长进行切片。start_idx = end_idx - window_size:定义切片的起始索引位置。slice_sig = wav[start_idx:end_idx]:切片音频文件。slices.append(slice_sig):将切片后的音频文件添加到列表中。return slices:返回切片后的音频文件列表。def process_and_serialize(data_type)::定义序列化处理函数。stride = 0.5:定义重叠比例。if data_type == 'train'::如果是训练集数据,就分别定义干净训练集音频文件夹、嘈杂训练集音频文件夹和序列化后的训练集音频数据存放文件夹路径。else::否则,就分别定义干净测试集音频文件夹、嘈杂测试集音频文件夹和序列化后的测试集音频数据存放文件夹路径。if not os.path.exists(serialized_folder)::如果序列化后的音频数据存放文件夹不存在,则创建该文件夹。for root, dirs, files in os.walk(clean_folder)::遍历干净音频文件夹中的所有文件。if len(files) == 0::如果没有文件,则跳过。for filename in tqdm(files, desc='Serialize and down-sample {} audios'.format(data_type))::在处理大量文件时显示进度条。clean_file = os.path.join(clean_folder, filename):获取干净音频文件路径。noisy_file = os.path.join(noisy_folder, filename):获取嘈杂音频文件路径。clean_sliced = slice_signal(clean_file, window_size, stride, sample_rate):切片干净音频文件。noisy_sliced = slice_signal(noisy_file, window_size, stride, sample_rate):切片嘈杂音频文件。for idx, slice_tuple in enumerate(zip(clean_sliced, noisy_sliced))::循环遍历干净音频文件和嘈杂音频文件。pair = np.array([slice_tuple[0], slice_tuple[1]]):将干净音频文件和嘈杂音频文件组合成一个数组。np.save(os.path.join(serialized_folder, '{}_{}'.format(filename, idx)), arr=pair):将组合好的数据保存为.npy格式文件。def data_verify(data_type)::定义验证序列化数据长度的函数。if data_type == 'train'::如果是训练集数据,则定义序列化后的训练集音频数据存放文件夹路径。else::否则,就定义序列化后的测试集音频数据存放文件夹路径。for root, dirs, files in os.walk(serialized_folder)::遍历序列化后的音频数据存放文件夹中的所有文件。for filename in tqdm(files, desc='Verify serialized {} audios'.format(data_type))::在处理大量文件时显示进度条。data_pair = np.load(os.path.join(root, filename)):加载序列化后的数据文件。if data_pair.shape[1] != window_size::如果序列化后的数据长度不等于设定的切片长度,则打印错误信息。print('Snippet length not {} : {} instead'.format(window_size, data_pair.shape[1])):打印错误信息。break:跳出循环。if __name__ == '__main__'::如果该代码运行在主程序中,则执行以下代码。process_and_serialize('train'):对训练集数据进行序列化处理。data_verify('train'):验证序列化后的训练集音频数据长度是否正确。process_and_serialize('test'):对测试集数据进行序列化处理。data_verify('test'):验证序列化后的测试集音频数据长度是否正确。
原文地址: https://www.cveoy.top/t/topic/b8Gc 著作权归作者所有。请勿转载和采集!