1. 程式人生 > >word2vec, LSTM Speech Recognition實戰, 圖資料庫

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內嵌高效能記憶體圖資料庫