iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
11
AI & Machine Learning

以100張圖理解 Neural Network -- 觀念與實踐系列 第 26

Day 26:自動語音識別(Automatic Speech Recognition) -- 觀念與實踐(續)

前言

上一篇我們舉了一個很簡單的範例,判斷聲音是bed、cat 或是 happy,實務上它可以應用在一些場域,例如,PowerPoint簡報時,我們可以用聲音下指令,例如『上、下、Play、Stop』代表『上一頁、下一頁、撥放影片、停止播放』,又譬如操作機器人,也可以用聲音使它前後左右移動,這種指令式的應用是否需要以 Neural Network 技術實踐,是否殺雞用牛刀,就見仁見智了。

LSTM範例擴展

上一篇我們使用 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)

程式說明

  1. 這個程式 speech2text-tflearn.py 可從這裡下載,訓練資料會用到 curl、untar 等Linux指令,適合在Linux 環境下執行。
  2. 程式邏輯與上一篇幾乎相同,只是把 CNN(Conv2D/MaxPooling2D) 換成 LSTM 層而已。
  3. 同一目錄下的 speech_data.py 為公用函數庫,會被主程式 speech2text-tflearn.py 呼叫。
  4. 本程式使用 TFLearn ,與 Keras 同為 metat framework,讀者其實可以把上述程式改為 Keras based,應該也不難。

擴展

從這個簡單的範例出發,大家應該都會想到一些應用擴展上的問題:

  1. 範例只辨識單字,如果要辨識整句呢?
  2. 如果要辨識整段演講呢?

短句辨識

一個簡單的作法就是請講者說話速度慢一點,中間自然會產生靜音,我們就可以將 input 切成數段,之後辨識每一段為哪一個單字,組合起來即為整句內容,這種作法中文會比外語容易,因為中文都是單音節,要切割比較簡單。另外,為了提高準確,可以有兩種作法:

  1. CNN + LSTM:利用 CNN 萃取特徵,辨識單字,再利用『自然語言處理』提到的 LSTM 模型,它會考慮上下文,就可以較準確的辨識出整句內容了,可參考『CNN Long Short-Term Memory Networks』。
  2. 利用『自然語言處理』的前置處理及語意分析,判斷可能性較大的內容。例如,使用 spaCy 套件,簡單範例如下:
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/
https://ithelp.ithome.com.tw/upload/images/20180105/200019769h2kcZtIa9.png
圖. spaCy Visualizer

以上方法在短句辨識上,實踐上應該很容易,但是,較長的字句就會力有未逮了。

自動語音識別(Automatic Speech Recognition)架構

如果針對整段演講進行辨識,勢必要有一個較完整的架構,除了靠『語音信號處理』外,尚須借重『自然語音處理』去矯正辨識出來的結果,才能畢其功於一役,以下就是一個較完整的架構。
https://ithelp.ithome.com.tw/upload/images/20180105/20001976k7l1JZqGFg.png
圖. 自動語音識別(Automatic Speech Recognition)架構,圖片來源:現階段大詞彙連續語音辨識研究之簡介

從另一個角度,以各模組功能來看:
https://ithelp.ithome.com.tw/upload/images/20180105/200019768mZNINfb1d.png
圖. 分三個層次,信號處理(Signal)、聲學處理(Acoustic)、語言處理(Language),圖片來源:Kaldi now offers TensorFlow integration

現階段大詞彙連續語音辨識研究之簡介』一文有相當詳盡的說明,筆者還是秉持初衷,用圖說故事,整理如下:

  1. 語音特徵擷取(Feature Extraction)

    • 以示波器測得的『時域』(Time Domain)信號
      https://ithelp.ithome.com.tw/upload/images/20180105/20001976Zuuhrl0cOb.png
    • 利用『快速傅立葉轉換』(Fast Fourier Transform,FFT)轉為『頻域』(Frequency Domain)信號
      https://ithelp.ithome.com.tw/upload/images/20180105/20001976r2NrvD0ksR.png
    • 再抽樣,轉為 MFCC 特徵向量
      https://ithelp.ithome.com.tw/upload/images/20180105/20001976QwEclFcUyu.png
  2. 聲學比對 -- 聲學模型(Acoustic model):傳統上使用『隱藏馬可夫模型』(Hidden Markov Model,HMM) 技術,依照音素(Phoneme)、音節的特徵向量比對,找出機率最大(最有可能)的單字,後來,又結合『高斯混合模型』(Gaussian mixture model,GMM),成為經典的 GMM-HMM 模型。最近 Neural Network 崛起,各種演算法及模型紛紛出籠,例如 RNN-HMM、Connectionist Temporal Classification (CTC)、Attention-based models 等。

  3. 語言解碼(Decode) -- 語言模型(Language model):經過聲學分析出來的字句,可能會有多種候選字句,例如下圖,再透過語料庫比對及語言模型,進行解碼找出機率最大(最有可能)的文句。
    https://ithelp.ithome.com.tw/upload/images/20180105/20001976kn4MehN32a.png

以上圖形來自

  1. Speech Processing
  2. Python Deep Learning

結語

自動語音識別(Automatic Speech Recognition)與自然語言處理的關係是密不可分的,辨識出來的結果還是要依據語意、文法及大量標註的語料庫,才能正確的辨識,進而了解其意,最後才能有人機對話的可能,讀到這裡,範圍有點大,已經有點痛苦,下次再加油吧。


上一篇
Day 25:自動語音識別(Automatic Speech Recognition) -- 觀念與實踐
下一篇
Day 27:音樂資訊檢索(Music Information Retrieval,MIR)
系列文
以100張圖理解 Neural Network -- 觀念與實踐31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
微中子
iT邦新手 4 級 ‧ 2018-01-05 18:09:37

下學期想修一下這個方面的課。感覺未來很受用

值得啊,領域很廣,又很實用,有人可以領進門,不亦樂乎。

0
qaz91030
iT邦新手 5 級 ‧ 2021-03-15 18:17:45

請問如何解決urllib.error.HTTPError: HTTP Error 404: Not Found的問題
https://ithelp.ithome.com.tw/upload/images/20210315/20135945FAAjQV73pr.jpg

當時程式使用 Tensorflow 1.x 版,安裝2.x版,會無法執行。
請參閱:
https://ithelp.ithome.com.tw/articles/10233272

0
qaz91030
iT邦新手 5 級 ‧ 2021-05-21 22:35:27

請問一下,我想用您前面撰寫模型的方式套用在這個資料集上,但是訓練的結果一開始Loss值就很低,有點怪怪的,我不知道問題在哪裡,可以請您幫我解答嗎?https://ithelp.ithome.com.tw/upload/images/20210521/20135945Uby8fT4Vxz.jpg

看更多先前的回應...收起先前的回應...

input_shape 與輸入格式符合嗎?

qaz91030 iT邦新手 5 級 ‧ 2021-05-22 13:41:08 檢舉

是維度嗎?x_train是符合的,y_train有要改嗎?

y_train 要用 one-hot encoding 轉成 (筆數, classes)。

qaz91030 iT邦新手 5 級 ‧ 2021-05-23 14:22:05 檢舉

y_train也有調到

我要留言

立即登入留言