如何统一用于说话人二分类的.wav音频数据集的shape
音频shape统一的解决方案
一、长度统一实现方法
- 第一步:统一所有音频的采样率
你当前代码没有校验采样率一致性,如果不同wav的采样率不同(比如有的是44100Hz、有的是48000Hz),相同时长的音频采样点数量自然不一样。建议先固定统一采样率(比如16000Hz),用scipy.signal.resample对采样率不符的音频做重采样。 - 第二步:固定音频采样点长度
提前定好目标音频时长,比如统一取2秒,对应的采样点数量就是目标采样率*2,再对所有音频做对齐处理:- 采样点超过目标长度:直接截取前N个采样点,也可以随机截取某一段做数据增强
- 采样点不足目标长度:在末尾补0(零填充)到目标长度
- 统一处理的参考代码:
import scipy.signal # 定义全局统一配置 TARGET_SR = 16000 TARGET_SAMPLES = TARGET_SR * 2 # 固定2秒时长对应采样点数量 def load_and_align_wav(file_path): sr, raw_data = wavfile.read(file_path) # 重采样到统一采样率 if sr != TARGET_SR: raw_data = scipy.signal.resample(raw_data, int(len(raw_data) * TARGET_SR / sr)) raw_data = raw_data.flatten() # 对齐长度 if len(raw_data) > TARGET_SAMPLES: raw_data = raw_data[:TARGET_SAMPLES] else: raw_data = np.pad(raw_data, (0, TARGET_SAMPLES - len(raw_data)), mode='constant') return raw_data
二、你当前代码的其他逻辑错误
你现在的代码完全不符合二分类任务的要求,需要同步调整:
- 数据集读取逻辑错误:循环里每次都覆盖
data和data2变量,最终你拿到的X和y只是最后一个本人音频、最后一个他人音频的采样点,完全没用到18个文件的完整数据集 - 标签逻辑错误:二分类任务的y是类别标签,本人对应标签1、他人对应标签0,不是把他人的音频采样点当y
- 输出层配置错误:二分类任务输出层应该是
units=1,而不是6
- 修正后的数据集构造参考代码:
X = [] labels = [] # 读取本人音频,标签设为1 for path in Path(os.path.abspath('Voiceclassification/Data/me/')).rglob('*.wav'): audio = load_and_align_wav(str(path)) X.append(audio) labels.append(1) # 读取他人音频,标签设为0 for path in Path(os.path.abspath('Voiceclassification/Data/other/')).rglob('*.wav'): audio = load_and_align_wav(str(path)) X.append(audio) labels.append(0) # 转为numpy数组后再做划分 X = np.array(X) y = np.array(labels) x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)
三、效果优化建议
直接用原始音频采样点做ANN输入维度太高、冗余信息多,模型效果会很差。建议先提取MFCC、梅尔频谱等音频特征,再送入模型训练,收敛速度和准确率都会有明显提升。
内容的提问来源于stack exchange,提问作者Bernardo Olisan
相关产品推荐
相关产品推荐

