用Tensorflow進(jìn)行簡(jiǎn)單音頻分類的高效方法
Tensorflow因支持功能的全面性,序列化的突出優(yōu)點(diǎn),以及高性能的部署優(yōu)點(diǎn)等等俘獲了一大批的鐵桿粉絲。但是對(duì)于小白來(lái)說(shuō)要上手還是需要啃一些實(shí)戰(zhàn)案例,積累一些實(shí)現(xiàn)方法的。
在視覺、語(yǔ)言領(lǐng)域相關(guān)的深度學(xué)習(xí)發(fā)展很好,例如:CNN 在圖像上表現(xiàn)非常好,具有像素的局部相關(guān)性;RNN或transformers這樣的序列模型在語(yǔ)言上也表現(xiàn)得非常好,具有順序性。
音頻看起來(lái)用的很少,以至于一些同學(xué)也不知道處理音頻數(shù)據(jù)時(shí)使用了哪些類型的模型和過(guò)程。來(lái)啃下面的Tensorflow 代碼吧!你會(huì)收獲到音頻分類問(wèn)題的高效方法!

聲明:本案例出于演示目的,使用了“語(yǔ)音命令”數(shù)據(jù)集。
Waveforms(波形)
通?!?.wav?”格式的音頻文件,通常被稱為波形,波形是每個(gè)特定時(shí)間信號(hào)幅度的時(shí)間序列,當(dāng)將這些波形樣本中一部分進(jìn)行可視化,會(huì)這樣顯示:

直覺上,大部分人都可能會(huì)考慮使用某種RNN模型對(duì)這些數(shù)據(jù)進(jìn)行建模,就像常規(guī)時(shí)間序列(例如股票價(jià)格預(yù)測(cè))一樣,用這種方法這是可以做到的。
但是,由于我們使用的是音頻信號(hào),因此更合適的選擇是將波形樣本轉(zhuǎn)換為頻譜圖。
Spectrograms(頻譜圖)
頻譜圖是波形信號(hào)的圖像表示,它顯示了隨時(shí)間變化的頻率強(qiáng)度范圍,當(dāng)要評(píng)估信號(hào)隨時(shí)間變化的頻率分布時(shí),頻譜圖非常有用。
下圖是上面波形圖像的頻譜圖表示:

語(yǔ)音命令用例
為了讓大家能夠更容易理解整個(gè)操作過(guò)程,我們將使用“語(yǔ)音命令”數(shù)據(jù)集(在文章底部獲取鏈接),該數(shù)據(jù)集包含一秒鐘的音頻剪輯,其中包含以下口語(yǔ):“向下”、“前進(jìn)”、“左”、“否”、“右”、“停止”、“向上”和“是”。
使用 Tensorflow 處理音頻
上面講解了如何處理音頻數(shù)據(jù)以用于深度學(xué)習(xí)模型,接下來(lái)看如何用代碼實(shí)現(xiàn),所用管線將遵循下圖所述的簡(jiǎn)單工作流:

注意以下,在用例中,第一步是直接從“.wav”文件加載數(shù)據(jù),第三步是可選的,因?yàn)槊總€(gè)音頻文件只有一秒鐘,在某些情況下,裁剪音頻可能是個(gè)好的做法,這樣可以用于更長(zhǎng)的文件,也可以在所有樣本中保持固定長(zhǎng)度。
加載數(shù)據(jù)
load_dataset函數(shù)負(fù)責(zé)加載.wav文件并轉(zhuǎn)換為 Tensorflow 數(shù)據(jù)集
提取波形和標(biāo)簽
加載.wav文件后,然后對(duì)文件進(jìn)行解碼,使用tf.audio.decode_wav函數(shù)來(lái)完成,將.wav文件轉(zhuǎn)換為浮點(diǎn)張量。
接下來(lái),從文件中提取標(biāo)簽,在這個(gè)特定用例中,從每個(gè)樣本的文件路徑中獲取標(biāo)簽,之后只需要進(jìn)行單(獨(dú))熱編碼(one-hot encode the labels)。
看這個(gè)例子,首先,我們得到這樣一個(gè)文件路徑:
然后我們提取第二個(gè)“ / ”之后的文本,在這種情況下,標(biāo)簽是向上的,最后,我們使用commands列表對(duì)標(biāo)簽進(jìn)行單(獨(dú))熱編碼(one-hot encode the labels)。
將波形轉(zhuǎn)換為頻譜圖
接著將波形文件轉(zhuǎn)換為頻譜圖,Tensorflow 有一個(gè)功能可以直接做到,tf.signal.stft應(yīng)用short-time Fourier transform (?STFT?) 將音頻轉(zhuǎn)換為時(shí)頻域,然后我們應(yīng)用tf.abs算子去除信號(hào)相位,只保留幅度。
這里注意一下,tf.signal.stft函數(shù)有一些參數(shù),例如frame_length和frame_step,它們會(huì)影響生成的頻譜圖。
將頻譜圖轉(zhuǎn)換為 RGB 圖像
最后一步是將頻譜圖轉(zhuǎn)換為 RGB 圖像,這一步是可選的,這里使用在ImageNet數(shù)據(jù)集上預(yù)先訓(xùn)練的模型,該模型需要具有 3 個(gè)通道的輸入圖像,除此之外,還可以只保留一個(gè)通道的光譜圖。
結(jié)合在一起
總而言之,在完成所有步驟之后,將文件名輸入到get_dataset函數(shù)中,返回一個(gè)帶有 RGB 光譜圖像及其標(biāo)簽的 Tensorflow 數(shù)據(jù)集。
該模型
我們的模型將有一個(gè)EfficientNetB0主干。
在其頂部,我們添加了一個(gè)GlobalAveragePooling2D,然后是一個(gè)Dropout,最后一個(gè)Dense層將進(jìn)行實(shí)際的多類分類。
對(duì)于小數(shù)據(jù)集,EfficientNetB0可能是一個(gè)很好的基線,即使是一個(gè)快速和輕的模型,它也有相當(dāng)好的精度。
訓(xùn)練
Keras 模型的訓(xùn)練代碼非常標(biāo)準(zhǔn),你可能不會(huì)在這里找到任何新內(nèi)容。
現(xiàn)在大家應(yīng)該更清楚地了解了將深度學(xué)習(xí)應(yīng)用于音頻文件的工作流程,雖然這并不是唯一的解決辦法,但它是一種關(guān)于易用性和性能權(quán)衡的最佳選擇。
本文參考文檔:
https://pub.towardsai.net/a-gentle-introduction-to-audio-classification-with-tensorflow-c469cb0be6f5
語(yǔ)言命令數(shù)據(jù)集:
https://arxiv.org/abs/1804.03209
tensorflow官方文檔:
https://www.tensorflow.org/tutorials/audio/simple_audio
今后學(xué)姐還會(huì)更新更多
深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的干貨及示例
關(guān)注學(xué)姐變大神!

??點(diǎn)個(gè)贊吧!這樣學(xué)姐就有動(dòng)力肝更多干貨了!??