機(jī)器學(xué)習(xí)可以實(shí)現(xiàn)語音的分類嗎?
在物聯(lián)網(wǎng)平臺上使用這個(gè)解決方案可以讓你在很多領(lǐng)域中開發(fā)出智能解決方案
簡介有很多不同的項(xiàng)目和服務(wù)能夠識別人類的語音,例如 Pocketsphinx,Google』s Speech API,還有很多其他的。這些應(yīng)用和服務(wù)能夠以相當(dāng)好的性能將人類的語音識別成文本,但是它們中間卻沒有一個(gè)能夠分得清麥克風(fēng)捕捉到的是哪一種聲音:人聲,動物聲音或者音樂演奏聲?
我們面臨這個(gè)任務(wù)的時(shí)候,就決定去調(diào)研一下,并開發(fā)一個(gè)能夠使用機(jī)器學(xué)習(xí)算法來區(qū)分聲音的示例項(xiàng)目。這篇文章具體描述了我們選擇哪款工具、我們面臨的挑戰(zhàn)是什么、我們?nèi)绾螢?TensorFlow 訓(xùn)練模型,以及如何運(yùn)行我們的開源項(xiàng)目。為了把它們用在給第三方應(yīng)用提供的云服務(wù)上,我們還在 DeviceHive 和 IoT 平臺上提供了識別結(jié)果。
選擇工具和分類模型首先我們需要選擇一些能夠運(yùn)行神經(jīng)網(wǎng)絡(luò)的軟件。我們發(fā)現(xiàn)的第一個(gè)合適的解決方案是 Python Audio Analysis。
機(jī)器學(xué)習(xí)中的主要問題是要有一個(gè)好的訓(xùn)練數(shù)據(jù)集。對于音樂分類和語音識別而言,有很多數(shù)據(jù)集,但是并沒有多少數(shù)據(jù)集是用來做隨機(jī)聲音分類的。經(jīng)過研究之,我們發(fā)現(xiàn)了 urban sound dataset(https://serv.cusp.nyu.edu/projects/urbansounddataset/)這個(gè)數(shù)據(jù)集。
經(jīng)過一些測試之后,我們面臨著以下問題:
pyAudioAnalysis 不夠靈活。它不能得到多種參數(shù),并且一些參數(shù)的計(jì)算是不受控制的,例如,訓(xùn)練實(shí)驗(yàn)的數(shù)量是基于樣本數(shù)量的,你不能通過 pyAudioAnalysis 改變它。
這個(gè)數(shù)據(jù)集只有 10 個(gè)種類,而且它們都是「urban」種類。
我們發(fā)現(xiàn)的另一個(gè)解決方案是 Google AudioSet(https://research.google.com/audioset/index.html)。它是基于有標(biāo)簽的 YouTube 視頻片段,可以以兩種格式下載:
每一個(gè)視頻片段都有 CSV 文件描述,包括 YouTube 視頻 ID,起始時(shí)間和結(jié)束時(shí)間,以及一個(gè)或多個(gè)標(biāo)簽。
提取出的音頻特征以 TF Record 文件的形式被存儲。
這些特征和 YouTube-8M 模型是兼容的。這個(gè)解決方案也提供了 TensorFlow VGGish 模型作為特征提取器。它滿足了我們的額大部分需求,因此也就成為了我們的最佳選擇。
訓(xùn)練模型下一個(gè)任務(wù)就是了解 YouTube-8M 接口是如何運(yùn)行的。它是被設(shè)計(jì)來處理視頻的,但是幸運(yùn)的是它也能夠處理音頻。這個(gè)庫是相當(dāng)方便的,但是它有固定的樣本類別數(shù)。所以我們對它進(jìn)行了小小的修改,便于將類別數(shù)作為參數(shù)傳入。
YouTube-8M 能夠處理兩種類型的數(shù)據(jù):總體特征和幀特征。Google AudioSet 能夠?qū)⑽覀冎疤岬降臄?shù)據(jù)作為特征。通過研究自后我們發(fā)現(xiàn)那些特征是以幀的格式給出的。接下來,我們需要選擇要被訓(xùn)練的模型。
資源、時(shí)間和精度GPU 比 CPU 更適合做機(jī)器學(xué)習(xí)。你可以在這里看到更多的相關(guān)信息(https://docs.devicehive.com/blog/using-gpus-for-training-tensorflow-models)。所以我們跳過這個(gè)過程直接開始實(shí)驗(yàn)設(shè)置。我們在實(shí)驗(yàn)中使用的是一臺裝有 4GB 顯存的 NVIDIA GTX 970。
在我們的這種情形下,訓(xùn)練時(shí)間并不十分重要。應(yīng)該提一下,用 1 到 2 小時(shí)足以做出關(guān)于所選模型和精度的判斷。
當(dāng)然,我們想盡可能得到較好的精度。但是,為了訓(xùn)練出一個(gè)更復(fù)雜的模型(有潛力得到更好的準(zhǔn)確率),你需要更大的 RAM(當(dāng)然對于 GPU 而言就是顯存了)。
選擇模型這里是具有細(xì)節(jié)描述的可以使用的 YouTube-8M 模型完全列表(https://github.com/google/youtube-8m#overview-of-models)。因?yàn)槲覀兊挠?xùn)練數(shù)據(jù)是以幀為格式的,所以必須使用幀級別的模型。Google AudioSet 數(shù)據(jù)集為我們提供的數(shù)據(jù)被分成了三部分:均衡的訓(xùn)練集,不均衡的訓(xùn)練集以及評估集。你可以在這里獲得更多信息(https://research.google.com/audioset/download.html)。
還有一個(gè)修正版的用于訓(xùn)練和評估的 YouTube-8M 模型。在這里可以獲得:(https://github.com/igor-panteleev/youtube-8m)
均衡的訓(xùn)練集
訓(xùn)練命令如下:
python train.py –train_data_pattern=/path_to_data/audioset_v1_embeddings/bal_train/*.tfrecord –num_epochs=100 –learning_rate_decay_examples=400000 –feature_names=audio_embedding –feature_sizes=128 –frame_features –batch_size=512 –num_classes=527 –train_dir=/path_to_logs –model=ModelName*
按照文檔的建議,我們將 LSTM 模型的基礎(chǔ)學(xué)習(xí)率改為 0.001. 此外,我們還將 LSTM 單元的大小改為 256,因?yàn)槲覀儧]有足夠大的 RAM。
現(xiàn)在我們看一下訓(xùn)練結(jié)果:
模型名 訓(xùn)練時(shí)間 最后一次迭代的準(zhǔn)確率 平均準(zhǔn)確率
Logistic 14m 3s 0.58590 0.5560
Dbof 31m46s 1.000 0.5220
LSTM 45m53s 0.9883 0.4581
如上所示,我們在訓(xùn)練的時(shí)候得到了較好的結(jié)果--但是這并不意味著我們會在測試的時(shí)候也得到同樣好的結(jié)果。
不均衡訓(xùn)練
讓我們來試一下一個(gè)不均衡的數(shù)據(jù)集吧。它有更多的樣本,所以我們將 epochs 的數(shù)目改為 10(最小應(yīng)該改成 5,因?yàn)橛?xùn)練起來會耗費(fèi)很多的時(shí)間)。
模型名 訓(xùn)練時(shí)間 最后一次迭代的準(zhǔn)確率 平均準(zhǔn)確率
Logistic 2h4m14s 0.875500.5560 0.5125
Dbof 4h39m29s 0.8848 0.5605
LSTM 9h42m52s 0.8691 0.5396
訓(xùn)練日志如果你想核查我們的訓(xùn)練日志,你可以在這里下載到 (https://s3.amazonaws.com/audioanalysis/train_logs.tar.gz)。然后運(yùn)行
tensorboard *–logdir /path_to_train_logs/
然后在瀏覽器中打開主機(jī) 6006 端口就可以看到了。
關(guān)于訓(xùn)練的更多內(nèi)容YouTube-8M 采用了很多參數(shù),大部分都會影響訓(xùn)練過程。
例如:你可以調(diào)節(jié)學(xué)習(xí)率或者 epochs 的數(shù)量,這兩個(gè)參數(shù)能夠很明顯的改變訓(xùn)練過程。也有 3 個(gè)用來計(jì)算損失的函數(shù),以及很多其他有用的變量,你可以改變它們來提升結(jié)果。
在音頻采集設(shè)備上使用訓(xùn)練好的模型現(xiàn)在我們已經(jīng)有了一些訓(xùn)練好的模型了,是時(shí)候添加一些代碼與它們交互了。
采集音頻的麥克風(fēng)我們需要從麥克風(fēng)采集音頻。這里我們使用 PyAudio。它提供了可以在很多平臺上都能很好運(yùn)行的簡單接口。
聲音準(zhǔn)備正如我們之前所提及的,我們要使用 TensorFlow 的 VGGish 模型作為特征提取器。這里是轉(zhuǎn)換過程的一個(gè)簡短解釋:
用 UrbanSound 數(shù)據(jù)集中「犬吠」樣例來作為可視化的例子。
使用 25ms 的幀長,10ms 的幀移,以及周期為 25ms 的漢明窗對語音進(jìn)行分幀,對每一幀做短時(shí)傅里葉變換,然后利用信號幅值計(jì)算省譜圖。
映射到 64 階 mel 濾波器組中計(jì)算 mel 聲譜。
計(jì)算 log(mel-spectrum + 0.01),得到穩(wěn)定的 mel 聲譜,所加的 0.01 的偏置是為了避免對 0 取對數(shù)。
這些 然后被以 0.96s(這段「犬吠」聲的總時(shí)長)的時(shí)長被組幀,并且沒有幀的重疊,每一幀都包含 64 個(gè) mel 頻帶,96 幀都是每幀時(shí)長 10ms。
這些樣本然后就被輸入到 VGGish 模型中去提取特征向量。
分類最后我們需要一個(gè)能夠把數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡(luò)的接口,以得到分類結(jié)果。
我們會使用 YouTube-8M 作為一個(gè)例子,但是會做一些修改,去掉 serialization/deserialization 步驟。
在這里你可以看到我們的結(jié)果(https://github.com/devicehive/devicehive-audio-analysis),我們仔細(xì)看看吧。
安裝PyAudio 使用 libportaudio2 和 portaudio19-dev,所以在安裝 PyAudio 之前需要先安裝這兩個(gè)工具。
還需要一些 python 庫,你可以使用 pip 來安裝它們。
pip install -r requirements.txt
你還需要下載并提取具有保存好的模型的項(xiàng)目主目錄。你可以在這里找到(https://s3.amazonaws.com/audioanalysis/models.tar.gz)。
運(yùn)行
我們的項(xiàng)目提供了 3 個(gè)可供使用的接口。
1. 處理錄制好的音頻文件
僅僅需要運(yùn)行下面的命令就好
python parse_file.py path_to_your_file.wav
然后你就會在終端中看到以下信息:語音:0.75;音樂:0.12;在大廳里面:0.03
這個(gè)結(jié)果由輸入的文件決定。這些值是神經(jīng)網(wǎng)絡(luò)做出的預(yù)測。數(shù)值越大,則說明輸入文件中的音頻屬于該類別的概率比較大。
2. 從麥克風(fēng)中捕捉并處理數(shù)據(jù)
運(yùn)行python capture.py開始從麥克風(fēng)中無限地采集數(shù)據(jù)。默認(rèn)配置下,它會沒 5-7s 將數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡(luò)。你可以在之前的例子中看到結(jié)果。
在這個(gè)情況下,你可以使用參數(shù)–save_path=/path_to_samples_dir/運(yùn)行上面的命令,然后所有采集到的數(shù)據(jù)都會以 wav 文件的格式存儲在你提供的路徑中。你想用同樣的樣本嘗試不同的模型時(shí),這個(gè)函數(shù)是很有用的。你可以使用-help 來獲取更多的信息。
3.web 接口
python daemon.py實(shí)現(xiàn)了一個(gè)簡單的 web 接口,默認(rèn)配置下在本地的 8000 端口(http://127.0.0.1:8000/)。然后我們使用之前例子中提到的同樣的代碼。你可以看到對聲音時(shí)間的最 10 次預(yù)測(http://127.0.0.1:8000/events):
IOT 服務(wù)集成最后一個(gè),但是也是比較重要的一個(gè):集成在 IOT 設(shè)施中。如果你運(yùn)行了我們前面提到的 web 接口,你可以在頁面上看到 DeviceHive 客戶狀態(tài)和配置。只要客戶端已經(jīng)連接成功了,預(yù)測結(jié)果會以通知的形式發(fā)送到特定的設(shè)備上。
結(jié)論正如你所看到的,tensorflow 是一款非常靈活的工具,在很多機(jī)器學(xué)習(xí)應(yīng)用中都很有用,例如圖像處理和語音識別。將這個(gè)方法個(gè)物聯(lián)網(wǎng)平臺結(jié)合起來可以讓你在很多領(lǐng)域去建立智能解決方案。
智慧城市可以將這個(gè)解決方案用于安全目的,可以持續(xù)地監(jiān)聽玻璃破碎聲、槍聲以及其他與犯罪相關(guān)的聲音。甚至在雨林中,可以用這個(gè)方法通過分析它們的聲音來跟蹤動物和鳥類。
物聯(lián)網(wǎng)設(shè)備可以收到所有的這種通知。這個(gè)解決方案可以暗轉(zhuǎn)在本地設(shè)備上以最小化通信和云成本(盡管也可以部署在云端作為一種云服務(wù)),并且可被定制成只接收除包含原始音頻之外的信息。別忘了,這是一個(gè)開源的項(xiàng)目,隨意使用吧。