1、DataSet

数据集来自Eating Sound Collection,数据集中包含20种不同食物的咀嚼声音,赛题任务是给这些声音数据建模,准确分类。

https://tianchi.aliyun.com/competition/entrance/531887/information

2、查看音频

使用librosa模块加载音频文件,librosa.load()加载的音频文件,默认采样率(sr)为22050HZ mono。我们可以通过librosa.load(path,sr=44100)来更改采样频率

data1, sampling_rate1 = librosa.load('./train_sample/aloe/24EJ22XBZ5.wav')

plt.figure(figsize=(14, 5))
librosa.display.waveplot(data1,sr=sampling_rate1)

查看声谱图

  • 声谱图(spectrogram)是声音或其他信号的频率随时间变化时的频谱(spectrum)的一种直观表示。
  • 声谱图有时也称sonographs,voiceprints,或者voicegrams。当数据以三维图形表示时,可称其为瀑布图(waterfalls)。
  • 在二维数组中,第一个轴是频率,第二个轴是时间。使用librosa.display.specshow来显示声谱图。
plt.figure(figsize=(20, 10))
D = librosa.amplitude_to_db(np.abs(librosa.stft(data1)), ref=np.max)
plt.subplot(4, 2, 1)
librosa.display.specshow(D, y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('Linear-frequency power spectrogram of aloe')

https://github.com/datawhalechina/team-learning-nlp/blob/master/FoodVoiceRecognition/Task2%20%E9%A3%9F%E7%89%A9%E5%A3%B0%E9%9F%B3%E8%AF%86%E5%88%AB-%E8%B5%9B%E9%A2%98%E6%95%B0%E6%8D%AE%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%88%86%E6%9E%90.ipynb

3、音频数据特征提取

人耳接收信号时,不同的频率会引起耳蜗不同部位的震动。耳蜗就像一个频谱仪,自动在做特征提取并进行语音信号的处理。

MFCC

https://www.cnblogs.com/LXP-Never/p/10918590.html

MFCC(Mel Frequency Cepstral Coefficents)是本次音频分类任务中涉及到的特征提取方法。

 

 具体来说,MFCC特征提取的步骤如下:

  • 对语音信号进行分帧处理
  • 用周期图(periodogram)法来进行功率谱(power spectrum)估计
  • 对功率谱用Mel滤波器组进行滤波,计算每个滤波器里的能量
  • 对每个滤波器的能量取log
  • 进行离散余弦变换(DCT)变换
  • 保留DCT的第2-13个系数,去掉其它

其中,前面两步是短时傅里叶变换,后面几步主要涉及梅尔频谱。

3.1 短时傅里叶分析

声音信号本是一维时域信号(声音信号随时间变化),可以通过傅里叶变换将其转换到频域上,但这样又失去了时域信息,无法看出频率分布随时间的变化。短时傅里叶(STFT)就是为了解决这个问题而发明的常用手段。

所谓的短时傅里叶变换,

  • 即把一段长信号分帧、加窗,再对每一帧做快速傅里叶变换(FFT)
  • 最后把每一帧的结果沿另一个维度堆叠起来,得到类似于一幅图的二维信号形式,也就是在第2部分中得到的声谱图。

3.2 梅尔频谱和梅尔倒谱

声谱图往往是很大的一张图,且依旧包含了大量无用的信息,所以我们需要通过梅尔标度滤波器组(mel-scale filter banks)将其变为梅尔频谱

在梅尔频谱上做倒谱分析(取对数log,做离散余弦变换(DCT)变换)就得到了梅尔倒谱

各类音频特征在100 papers in INTERSPEECH’19,ICASSP’19, ASRU’19上的使用统计。

 

4、CNN

提取音频特征

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]

CNN网络结构

model = Sequential()

# 输入的大小
input_dim = (16, 8, 1)

model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷积层
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷积层
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化层
model.add(Dropout(0.1))
model.add(Flatten()) # 展开
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 输出层:20个units输出20个类的概率

# 编译模型,设置损失函数,优化方法以及评价标准
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

https://github.com/datawhalechina/team-learning-nlp/tree/master/FoodVoiceRecognition

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐