上一篇我們舉了一個很簡單的範例,判斷聲音是bed、cat 或是 happy,實務上它可以應用在一些場域,例如,PowerPoint簡報時,我們可以用聲音下指令,例如『上、下、Play、Stop』代表『上一頁、下一頁、撥放影片、停止播放』,又譬如操作機器人,也可以用聲音使它前後左右移動,這種指令式的應用是否需要以 Neural Network 技術實踐,是否殺雞用牛刀,就見仁見智了。
上一篇我們使用 CNN 演算法作語音辨識,其實,也可以用RNN(LSTM)作辨識,因為 LSTM 會考慮前面的訊號,程式節錄如下:
# 導入函式庫
from __future__ import division, print_function, absolute_import
import tflearn
import speech_data
# 設定參數(Hyperparameters)
learning_rate = 0.0001
training_iters = 300000 # steps
batch_size = 64
width = 20 # mfcc features
height = 80 # (max) length of utterance
classes = 10 # digits
# 取樣
batch = word_batch = speech_data.mfcc_batch_generator(batch_size)
X, Y = next(batch)
# train, test, _ = ,X
trainX, trainY = X, Y
testX, testY = X, Y #overfit for now
# 建立模型
net = tflearn.input_data([None, width, height])
# 建立LSTM層
# net = tflearn.embedding(net, input_dim=10000, output_dim=128)
net = tflearn.lstm(net, 128, dropout=0.8)
# 全連接層: 10個output
net = tflearn.fully_connected(net, classes, activation='softmax')
net = tflearn.regression(net, optimizer='adam', learning_rate=learning_rate, loss='categorical_crossentropy')
# 進行訓練
model = tflearn.DNN(net, tensorboard_verbose=0)
#model.load("tflearn.lstm.model")
while 1: #training_iters
model.fit(trainX, trainY, n_epoch=100, validation_set=(testX, testY), show_metric=True,
batch_size=batch_size)
_y=model.predict(X)
# 顯示預測結果
print (_y)
print (y)
從這個簡單的範例出發,大家應該都會想到一些應用擴展上的問題:
一個簡單的作法就是請講者說話速度慢一點,中間自然會產生靜音,我們就可以將 input 切成數段,之後辨識每一段為哪一個單字,組合起來即為整句內容,這種作法中文會比外語容易,因為中文都是單音節,要切割比較簡單。另外,為了提高準確,可以有兩種作法:
import spacy
from spacy import displacy
nlp = spacy.load('en')
doc = nlp(u'I like the movie very much.')
displacy.serve(doc, style='dep')
執行以上程式後,在瀏覽器輸入下列網址,結果如下圖,它可以利用詞向量及語料庫分析,我們可以進一步根據語意分析判斷,那些候選句是較合理的。
http://localhost:5000/
圖. spaCy Visualizer
以上方法在短句辨識上,實踐上應該很容易,但是,較長的字句就會力有未逮了。
如果針對整段演講進行辨識,勢必要有一個較完整的架構,除了靠『語音信號處理』外,尚須借重『自然語音處理』去矯正辨識出來的結果,才能畢其功於一役,以下就是一個較完整的架構。
圖. 自動語音識別(Automatic Speech Recognition)架構,圖片來源:現階段大詞彙連續語音辨識研究之簡介
從另一個角度,以各模組功能來看:
圖. 分三個層次,信號處理(Signal)、聲學處理(Acoustic)、語言處理(Language),圖片來源:Kaldi now offers TensorFlow integration
『現階段大詞彙連續語音辨識研究之簡介』一文有相當詳盡的說明,筆者還是秉持初衷,用圖說故事,整理如下:
語音特徵擷取(Feature Extraction)
聲學比對 -- 聲學模型(Acoustic model):傳統上使用『隱藏馬可夫模型』(Hidden Markov Model,HMM) 技術,依照音素(Phoneme)、音節的特徵向量比對,找出機率最大(最有可能)的單字,後來,又結合『高斯混合模型』(Gaussian mixture model,GMM),成為經典的 GMM-HMM 模型。最近 Neural Network 崛起,各種演算法及模型紛紛出籠,例如 RNN-HMM、Connectionist Temporal Classification (CTC)、Attention-based models 等。
語言解碼(Decode) -- 語言模型(Language model):經過聲學分析出來的字句,可能會有多種候選字句,例如下圖,再透過語料庫比對及語言模型,進行解碼找出機率最大(最有可能)的文句。
以上圖形來自
自動語音識別(Automatic Speech Recognition)與自然語言處理的關係是密不可分的,辨識出來的結果還是要依據語意、文法及大量標註的語料庫,才能正確的辨識,進而了解其意,最後才能有人機對話的可能,讀到這裡,範圍有點大,已經有點痛苦,下次再加油吧。
請問如何解決urllib.error.HTTPError: HTTP Error 404: Not Found的問題
當時程式使用 Tensorflow 1.x 版,安裝2.x版,會無法執行。
請參閱:
https://ithelp.ithome.com.tw/articles/10233272
請問一下,我想用您前面撰寫模型的方式套用在這個資料集上,但是訓練的結果一開始Loss值就很低,有點怪怪的,我不知道問題在哪裡,可以請您幫我解答嗎?
input_shape 與輸入格式符合嗎?
是維度嗎?x_train是符合的,y_train有要改嗎?
y_train 要用 one-hot encoding 轉成 (筆數, classes)。
y_train也有調到