word2vec, LSTM Speech Recognition实战, 图数据库
word2vec
word2vec是Google于2013年開源推出的一個用于獲取word vector的工具包。作者是Tomas Mikolov。
Github:
https://github.com/tmikolov/word2vec
注: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工具,參見:
https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/ml/nlp/hello_gensim.py
參考:
http://wei-li.cnblogs.com/p/word2vec.html
文本深度表示模型Word2Vec
http://www.cnblogs.com/wowarsenal/p/3293586.html
用中文把玩Google開源的Deep-Learning項目word2vec
http://www.jianshu.com/p/05800a28c5e4
使用word2vec訓練wiki中英文語料庫
LSTM Speech Recognition實戰
數據集
首先,在Github上搜尋了一番,發現了以下項目:
https://github.com/zzw922cn/Automatic_Speech_Recognition
https://github.com/pandeydivesh15/AVSR-Deep-Speech
但是無奈他們使用的TIMIT數據集是收費的,只好放棄了。
最終,找到了如下項目:
https://github.com/sdhayalk/TensorFlow_Speech_Recognition_Challenge
復現結果
這里只實驗了最簡單的那個模型,遺憾的是該代碼并不能直接使用,需要相應的預處理:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/python/ml/tensorflow/TensorFlow_Speech_Recognition_Challenge
這里還有一個坑,該項目只使用了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表,該表可以看做是國際音標的另一種表示法:
https://en.wikipedia.org/wiki/ARPABET
還有如下工具可以將英文單詞轉換為ARPABET表示:
http://www.speech.cs.cmu.edu/tools/lextool.html
這個工具所使用的詞典在:
http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/
精度大為提高到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變換。
官網:
http://fftw.org/
代碼:
https://github.com/FFTW/fftw3
然而,由于fftw的代碼是自動生成的,因此這個代碼庫實際上只供專業人士使用。普通用戶直接在官網下載源代碼包即可。
參考:
https://blog.csdn.net/congwulong/article/details/7576012
FFTW中文參考
aubio
aubio是一個C語言的音頻分析庫,提供了提取fbank、MFCC等特征的能力。
找到aubio的過程,堪稱曲折。最近要移植MFCC提取功能,到一嵌入式平臺。因此要求代碼必須是C語言。
1.Kaldi是C++寫的,不合要求。
2.scipy.fftpack的核心是用C和Fortran寫的,其實最主要的部分是Fortran寫的。
3.使用Java語言的話,jMIR是個不錯的選擇。
代碼:
https://github.com/aubio/aubio
安裝:
sudo apt-get install python3-aubio python-aubio aubio-tools libaubio-dev
aubio的fft結果是以極坐標的格式保存的,而LibROSA則是以平面坐標的格式保存的。
示例1:測試環境是否安裝好了,包括C和python環境。
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/1
示例2:python:獲取wav文件的頻譜。C:log重定向+讀取wav文件內容。
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/2
參考:
http://www.cnblogs.com/daleloogn/p/4510137.html
音樂檢索研究中使用的工具
Ooura
Takuya Ooura是東京大學的教授,他寫了一套數值計算的軟件叫做Ooura,其中包含了FFT的實現。這也是aubio默認的FFT實現。
代碼:
http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
這是作者收集的FFT庫的列表:
http://www.kurims.kyoto-u.ac.jp/~ooura/fftlinks.html
LibROSA
LibROSA是一個分析音樂和語音的Python庫。
官網:
http://librosa.github.io/
代碼:
https://github.com/librosa/librosa
文檔:
http://librosa.github.io/librosa/
參考:
http://www.cnblogs.com/xingshansi/p/6816308.html
音頻特征提取——librosa工具包使用
python_speech_features
python_speech_features是另一個分析音樂和語音的Python庫。
代碼:
https://github.com/jameslyons/python_speech_features
文檔:
https://python-speech-features.readthedocs.io/en/latest/
參考
論文:
《Small-footprint Keyword Spotting Using Deep Neural Network and Connectionist Temporal Classifier》
這篇文章是螞蟻金服提出的Keyword Spotting(KWS)的論文,它和本次實戰所用的Speech Commands Datasets契合度很高,值得參考。
http://mp.weixin.qq.com/s/-QQjz61VAOVcWE7j-EJPhg
談談螞蟻金服的語音喚醒系統
這里還有兩篇煉丹文:
https://zhuanlan.zhihu.com/p/28133530
一次CTC-RNN調參經歷
http://www.tbluche.com/ctc_and_blank.html
The intriguing blank label in CTC
http://spandh.dcs.shef.ac.uk/chime_challenge/chime2016/
CHiMe – Computational Hearing in Multisource Environments-國際多通道語音分離和識別大賽
圖數據庫
Neo4j
Neo4j大概算是最著名的圖數據庫了,它具有成熟和健壯的數據庫的所有特性。相對于關系數據庫來說,圖數據庫(Graph Database)善于處理大量復雜、互連接、低結構化的數據,這些數據變化迅速,需要頻繁的查詢——在關系數據庫中,這些查詢會導致大量的表連接,因此會產生性能上的問題。
官網:
https://neo4j.com/
參考:
http://blog.csdn.net/xingxiupaioxue/article/details/71747284
如何將大規模數據導入Neo4j
https://mp.weixin.qq.com/s/_Zm88TyBcXAZ4LeQOuJCHA
管理neo4j的用戶
https://mp.weixin.qq.com/s/dzPZTqUhWKIiKj2o7OkMbA
Neo4j的python操作庫Neo4j-Driver
https://mp.weixin.qq.com/s/mupuyM7m_41eOzQc7LGRRw
Neo4j的python操作庫Neomodel
https://mp.weixin.qq.com/s/YVo6KduIvckYKH53fjDogw
neo4j擴展包APOC的圖算法
neo4j-graph-algorithms
Neo4j Graph Algorithms擴展包,是一個關于圖算法的jar包,集成了一些常見的圖算法,比如社區發現,路徑擴展,中心點計算,PageRank等。
代碼:
https://github.com/neo4j-contrib/neo4j-graph-algorithms
openCypher
openCypher是基于Neo4j的查詢語言Cypher開發的,Cypher用于在圖數據庫中存儲和檢索數據。在圖數據庫領域,目前還沒有像關系數據庫中訪問數據的SQL這樣的通用查詢語言標準。
openCypher的目標是通過簡化存儲、分析,以及用于訪問圖數據模型的工具平臺,促進圖處理和分析的使用。技術廠商可以在他們的工具和平臺內實現Cypher。
官網:
http://www.opencypher.org/
RedisGraph
RedisGraph是Redis推出的基于Redis的圖數據庫。
官網:
http://redisgraph.io/
參考:
https://mp.weixin.qq.com/s/BzQBy6AoMXXpjsdGyXh1zA
揭秘RedisGraph: Redis內嵌高性能內存圖數據庫
總結
以上是生活随笔為你收集整理的word2vec, LSTM Speech Recognition实战, 图数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenVX, 运算加速库, NVIDI
- 下一篇: 深度学习(三十)——Deep Speec