baseline由开源学习组织Datawhale提供
https://github.com/datawhalechina/team-learning
环境介绍
环境要求:librosa
tensorflow 2.x
librosa
是一个功能强大的语音处理库,后面会用这个库对语音数据特征进行提取。tensorflow 2.x
是本次实现语音识别的深度学习库。语音数据为kaggle开源可商用的语音数据集。
https://pan.baidu.com/s/1K2vgn_Wf8Foy3oYHPH22LA 提取码:4vdz
将数据集下载到clips_rd_sox
文件夹中解压,即可运行代码。
本次打卡主要说一下对于特征提取的理解。
特征提取方法的理解
def extract_features(parent_dir, sub_dirs, max_file=10, file_ext="*.wav"):
c = 0
label, feature = [], []
for sub_dir in sub_dirs:
for fn in tqdm(glob.glob(os.path.join(parent_dir, sub_dir, file_ext))[:max_file]): # 遍历数据集的所有文件
# segment_log_specgrams, segment_labels = [], []
#sound_clip,sr = librosa.load(fn)
#print(fn)
label_name = fn.split('/')[-2]
label.extend([label_dict[label_name]])
X, sample_rate = librosa.load(fn,res_type='kaiser_fast')
mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 计算梅尔频谱(mel spectrogram),并把它作为特征
feature.extend([mels])
return [feature, label]
以上代码块中是baseline用于提取声音特征的函数。个人认为最重要的是mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0)
这一段。这一段的意思是对librosa
提取的声音信号X
提取梅尔频谱特征。提取后特征是[128, frames]
。其中frames
代表提取的特征的帧数。意义在于对每一帧提取128维度的向量表示。每个声音特征的时长不等,故提取的帧数frames
肯定是不相等的。因此baseline
中将其转职后对frames
所在维度取均值表示。
baseline
中选择CNN
作为语音识别的模型,因此又将输入数据reshape
。
X_train = X_train.reshape(-1, 16, 8, 1)
X_test = X_test.reshape(-1, 16, 8, 1)