2017年3月8日

在Raspberry Pi 3上安裝Pocketsphinx以及Node-Pocketsphinx

語音辨識是近來非常熱門的議題,透過語音助理在某些場景下可以提供相當的便利性,特別是當我們能夠在一些小型設備上實現語音辨識。語音辨識因為牽涉到大數據以及機器學習,對於軟硬體的需求較高,一般人並不是那麼容易實現,因此各廠商也紛紛端出了雲端的語音辨識方案,例如Microsoft Cognitive Service中的Bing Speech API

雲端的方案因為有比較好的硬體支持,比較完整且大量的資料庫以及專門的研究人員不斷的研發改進,因此辨識效果上一般會比較好。但是,某些情況下我們還是需要離線的解決方案作為備援;這時有許多的開源的選擇,例如Pocketsphinx

Sphinx是美國卡內基美隆大學所開發的英語語音識別系統,PocketSphinx則是基於Sphinx-2所開發的適用於嵌入式系統上的語音識別方案。網路上有許多基於PocketSphinx開發的Framework可以協助開發人員快速的在各種嵌入式設備上開發出簡單的語音控制應用;我們今天會將Pocketsphinx以及他的Node.Js binding安裝到Raspberry Pi 3上,作為離線的語音辨識備援方案。

Node-PocketsphinxGithub Repro在此:https://github.com/cmusphinx/node-pocketsphinx。這個方案是透過SWIG這個工具,將PocketSphinxC Library包出一層NodeJS可使用的介面。

為了要可以使用node-pocketsphinx,我們必須要先安裝以下這些相關套件:

  • Node (4.2+)
  • Cmake (3.1+)
  • cmake-js https://github.com/cmake-js/cmake-js (install with npm install -g cmake-js)
  • sphinxbase latest from github
  • pocketsphinx latest from github
  • swig (3.07+)
  • pkg-config

1.           Raspbian內建的NodeJS應該是v0.10;我們需要先將NodeJS升級到v6.0以上的版本

             I.                要特別注意的是,雖然目前NodeJS的版本已經來到的v7,但是SWIG目前並不支援NodeJS v7以上的版本。

           II.                這裡,我透過nvm這個工具升級NodeJS版本

                             i.                透過以下命令下載nvm

curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.32.0/install.sh -o install_nvm.sh

                           ii.                執行install.sh

bash install_nvm.sh

                         iii.                列出所有可用NodeJS版本

nvm ls-remote

                         iv.                安裝指定版本的NodeJS

nvm install 6.9.2

2.           安裝CMake,我是依照這一篇文章的步驟安裝:http://osdevlab.blogspot.tw/2015/12/how-to-install-latest-cmake-for.html

pi@raspberrypi ~ $ mkdir Download
pi@raspberrypi ~ $ cd Download
pi@raspberrypi ~/Download $ wget https://cmake.org/files/v3.4/cmake-3.4.1.tar.gz
pi@raspberrypi ~/Download $ tar -xvzf cmake-3.4.1.tar.gz
pi@raspberrypi ~/Download $ cd cmake-3.4.1/
pi@raspberrypi ~/Download/cmake-3.4.1 $ sudo ./bootstrap
pi@raspberrypi ~/Download/cmake-3.4.1 $ sudo make
pi@raspberrypi ~/Download/cmake-3.4.1 $ sudo make install

 

3.           安裝CMake.JS,可以直接執行npm install -g cmake-js或是到CMakeGithub Repro去下載後透過npm install -g cmake-js安裝。

4.           安裝SWIG,必須要是v3.0.7或以上的版本。

             I.                Clone GitHub repro到本地端

        git clone https://github.com/swig/swig.git

           II.                依序執行以下指令

cd swig
./autogen.sh
./configure --prefix=/some/directory
make
make install

         III.                執行swig -version確認版本

如果先前透過apt-get install取得的SWIG版本,多半是v2.0.X;可以透過sudo apt-get  --purge remove swig2.0將他移除;然後執行sudo ldocnfig並重開機。

5.           安裝Sphinx;依序執行以下指令。Sphinxbase必須要使用最新版本。

git clone https://github.com/cmusphinx/sphinxbase.git

cd sphinxbase

./autogen.sh

./configure

make

dudo make install

6.           安裝Pocketsphinx;依序執行以下指令,Pocketsphinx必須要使用最新版本。

git clone https://github.com/cmusphinx/pocketsphinx.git

cd pocketsphinx

./autogen.sh

./configure

Make

sudo make install

        安裝完成後,預設會把pocketsphinx以及sphinxbase安裝到/usr/local/bin下;可以執行export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig後重開機確認路徑。

7.           接著可以透過以下指令測試一下

pocketsphinx_continuous -infile ./pocketsphinx/test/data/goforward.raw

8.           大部分在上面安裝時會遇到的問題,多是與版本有關;除了NodeJS需要是v6之外,其他的Package請都安裝到最新的版本。

9.           接著,可以開始安裝Node-PocketSphinx了。

             I.                依序執行以下命令

git clone https://github.com/cmusphinx/node-pocketsphinx.git

cd node-pocketsphinx

npm install

           II.                寫隻簡單的Node.Js程式測試看看;其中

                             i.                這個部分要指向node-pocketsphinx的安裝目錄;是SWIG產生的NodeJS街口的路徑。

                           ii.                這個部分要指向pocketsphinx的安裝目錄;是語言模型的位置。

var fs = require('fs');

var ps = require('./stt/node/node-pocketsphinx/').ps;

var events = require('events');

var util = require('util');

var uuid = require('node-uuid');

modeldir = "stt/pocketsphinx/model/en-us/"

 

var config = new ps.Decoder.defaultConfig();

config.setString("-hmm", modeldir + "en-us");

config.setString("-dict", modeldir + "cmudict-en-us.dict");

config.setString("-lm", modeldir + "en-us.lm.bin");

var decoder = new ps.Decoder(config);

 

fs.readFile("../../pocketsphinx/test/data/goforward.raw", function(err, data) {

//fs.readFile("../../test.wav",function(err,data){

    if (err) throw err;

    decoder.startUtt();

    decoder.processRaw(data, false, false);

//decoder.startStream();

    decoder.endUtt();

    console.log(decoder.hyp())

});

 

實際上測試的結果,使用系統自帶的聲音模型時,對台灣人的英文腔調的辨識率並不是太好;如果透過CMUCLMTK工具來訓練自己的模型,效果應該會有改善。而同樣的語音檔,如果讓Bing Speech API辨識,則幾乎都可以準確的辨識出來。在建立這類服務時,噢咻離線方案還是應該做為是不得不時的備援方案。

 

 

沒有留言:

About Me