word2vec, LSTM Speech Recognition實戰, 圖資料庫
word2vec
word2vec是Google於2013年開源推出的一個用於獲取word vector的工具包。作者是Tomas Mikolov。
Github:
注:Tomas Mikolov,捷克布林諾科技大學博士。先後在Google、Facebook擔任研究員。
word2vec包中還有一個word2phrase的程式,這個程式可以根據統計資訊由單詞生成短語。考慮到中文的字和詞之間的關係,實際上也可以用它來進行無先驗資料的分詞。
注:NLP中的先驗資料,最出名的當屬分詞詞典。除此之外,還包括HMM的轉移矩陣表等。
其一般方法為:
1.對原始語料按字切分,以空格分隔,相當於認為一個字就是一個詞,即單字成詞
2.使用word2phrase組字成詞。
time ./word2phrase -train 1.txt -output 2.txt -threshold 100 -debug 2
3.由於word2phrase最多隻考慮到2-gram。因此,對於超過3個字以上的詞語,需要迭代執行word2phrase。
我以金庸的小說為語料進行測試。從結果來看,這種方法對於人名、地名、武功招式名等專有名詞,分詞效果較好。但對於具有語法結構的句子,分詞效果較差。比如“那人”其實是兩個單字詞,但卻被word2phrase認為是一個雙字詞。
./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
./distance vectors.bin
訓練之後的結果檔案中,儲存著每個詞的向量。可將binary選項設為0,來檢視相應結果的明文。
明文和二進位制資料之間的轉換可使用gensim工具,參見:
參考:
文字深度表示模型Word2Vec
用中文把玩Google開源的Deep-Learning專案word2vec
使用word2vec訓練wiki中英文語料庫
LSTM Speech Recognition實戰
資料集
首先,在Github上搜尋了一番,發現了以下專案:
但是無奈他們使用的TIMIT資料集是收費的,只好放棄了。
最終,找到了如下專案:
復現結果
這裡只實驗了最簡單的那個模型,遺憾的是該程式碼並不能直接使用,需要相應的預處理:
這裡還有一個坑,該專案只使用了11類聲音,而把其他19類都歸為unknown。這會導致unknown的權重過重,測試準確度虛高,(無腦分類為unknown都有60%以上的精度)但實際結果很差。需要使用一些方法處理資料的不平衡。
最終,復現結果精度大概在75%~80%之間。訓練時間大概要16小時。
煉丹一
把類別擴充套件到30類,精度略高,但也就80%上下。如此費時的訓練,只有這點結果,實在讓人喪氣。於是參考warpCTC,進行煉丹。
1.LSTM由3層減為1層。
2.使用CTC loss。(參見《深度學習(二十九)》)
在識別驗證碼的例子中,假如有兩幅圖,分別是123和4567,那麼Label就是:
[[1,2,3,0]
[4,5,6,7]]
雖然英語是表音文字,但直接分解字母作為標籤顯然是不太精確的。
這裡需要用到ARPABET表,該表可以看做是國際音標的另一種表示法:
還有如下工具可以將英文單詞轉換為ARPABET表示:
這個工具所使用的詞典在:
精度大為提高到90%。
煉丹二
1.將LSTM改為BiLSTM。
2.使用1x1的卷積處理頻譜。給feature map以不同的權重,有助於強化有效聲音,弱化噪聲。
3.使用3層FC。只對同一time step的頻點做FC,不跨time step。
原理參見《深度學習(三十)》中的Deep speech 2。
精度再次提高到96%。如果不做第1步的修改的話,精度大概是94%,但計算快了很多,大概2個小時。
fftw
fftw是一個C語言的FFT庫,由MIT的Matteo Frigo和Steven G. Johnson編寫。
fft的實現往簡單的說,也就幾十行程式碼。這裡這個3M+的龐然大物當然沒這麼簡單。它使用了彙編、並行等加速手段,還支援DCT和DST變換。
官網:
程式碼:
然而,由於fftw的程式碼是自動生成的,因此這個程式碼庫實際上只供專業人士使用。普通使用者直接在官網下載原始碼包即可。
參考:
FFTW中文參考
aubio
aubio是一個C語言的音訊分析庫,提供了提取fbank、MFCC等特徵的能力。
找到aubio的過程,堪稱曲折。最近要移植MFCC提取功能,到一嵌入式平臺。因此要求程式碼必須是C語言。
1.Kaldi是C++寫的,不合要求。
2.scipy.fftpack的核心是用C和Fortran寫的,其實最主要的部分是Fortran寫的。
3.使用Java語言的話,jMIR是個不錯的選擇。
程式碼:
安裝:
sudo apt-get install python3-aubio python-aubio aubio-tools libaubio-dev
aubio的fft結果是以極座標的格式儲存的,而LibROSA則是以平面座標的格式儲存的。
示例1:測試環境是否安裝好了,包括C和python環境。
示例2:python:獲取wav檔案的頻譜。C:log重定向+讀取wav檔案內容。
參考:
音樂檢索研究中使用的工具
Ooura
Takuya Ooura是東京大學的教授,他寫了一套數值計算的軟體叫做Ooura,其中包含了FFT的實現。這也是aubio預設的FFT實現。
程式碼:
這是作者收集的FFT庫的列表:
LibROSA
LibROSA是一個分析音樂和語音的Python庫。
官網:
程式碼:
文件:
參考:
音訊特徵提取——librosa工具包使用
python_speech_features
python_speech_features是另一個分析音樂和語音的Python庫。
程式碼:
文件:
參考
論文:
《Small-footprint Keyword Spotting Using Deep Neural Network and Connectionist Temporal Classifier》
這篇文章是螞蟻金服提出的Keyword Spotting(KWS)的論文,它和本次實戰所用的Speech Commands Datasets契合度很高,值得參考。
談談螞蟻金服的語音喚醒系統
這裡還有兩篇煉丹文:
一次CTC-RNN調參經歷
The intriguing blank label in CTC
CHiMe – Computational Hearing in Multisource Environments-國際多通道語音分離和識別大賽
圖資料庫
Neo4j
Neo4j大概算是最著名的圖資料庫了,它具有成熟和健壯的資料庫的所有特性。相對於關係資料庫來說,圖資料庫(Graph Database)善於處理大量複雜、互連線、低結構化的資料,這些資料變化迅速,需要頻繁的查詢——在關係資料庫中,這些查詢會導致大量的表連線,因此會產生效能上的問題。
官網:
參考:
如何將大規模資料匯入Neo4j
管理neo4j的使用者
Neo4j的python操作庫Neo4j-Driver
Neo4j的python操作庫Neomodel
neo4j擴充套件包APOC的圖演算法
neo4j-graph-algorithms
Neo4j Graph Algorithms擴充套件包,是一個關於圖演算法的jar包,集成了一些常見的圖演算法,比如社群發現,路徑擴充套件,中心點計算,PageRank等。
程式碼:
openCypher
openCypher是基於Neo4j的查詢語言Cypher開發的,Cypher用於在圖資料庫中儲存和檢索資料。在圖資料庫領域,目前還沒有像關係資料庫中訪問資料的SQL這樣的通用查詢語言標準。
openCypher的目標是通過簡化儲存、分析,以及用於訪問圖資料模型的工具平臺,促進圖處理和分析的使用。技術廠商可以在他們的工具和平臺內實現Cypher。
官網:
RedisGraph
RedisGraph是Redis推出的基於Redis的圖資料庫。
官網:
參考:
揭祕RedisGraph: Redis內嵌高效能記憶體圖資料庫