2016年2月4日 星期四

use raspberry for voice control

  建議先看一下  http://makezine.com/projects/use-raspberry-pi-for-voice-control/
 
   我的平台是  RPI 2

   OS :     2015-05-05-raspbian-wheezy

   插入買的usb audio device.....

    我是買這一款的

   


      然後check 一下你的usb audio裝置有沒有抓到...


                      cat /proc/asound/cards



    可以看到

        或是輸入  aplay -l  也可以得到一樣的資訊



   可以看到  card 1 :   usb PnP Sound Device....


    安裝一下  alsa 的套件  (Advanced Linux Sound Architecture)

    sudo apt-get install alsa-base alsa-utils

     輸入     alsamixer  可以調整音量

    sudo vi /usr/share/alsa/alsa.conf

       sudo vi   .asoundrc
       
    加入這一行

     pcm.!default sysdefault:Device


       
 
 
          測試一下你的設定有沒有成功.....錄製一下聲音試試

         arecord -vv --duration=7 -fdat ~/test.wav

    或是 播放已經有的wave file

    aplay /usr/share/sounds/alsa/Front_Center.wav


        沒問題之後.....

       安裝其他的套件

        sudo apt-get install libasound2-dev autoconf libtool bison \
swig python-dev python-pyaudio
   
      install    python-pip  tool
   
      curl -O https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo pip install gevent grequests

     安裝  screen  (could save yourself  some heartache)

      sudo apt-get install screen
screen -DR sphinx
      接下來是重頭戲了

      install  SPHINX  

       git clone git://github.com/cmusphinx/sphinxbase.git
cd sphinxbase
git checkout 3b34d87
./autogen.sh
sudo make -j4
    sudo make install

   cd ..

   install  PocketSphinx  

    git clone git://github.com/cmusphinx/pocketsphinx.git
cd pocketsphinx
git checkout 4e4e607
./autogen.sh
sudo make -j4

  sudo make install

cd ..

   update your new library on your system

    sudo ldconfig

    run test

    pocketsphinx_continuous -inmic yes
 
   如果有看到下面的訊息...就代表成功
INFO: ngram_search.c(874): bestpath 0.10 CPU 0.071 xRT
INFO: ngram_search.c(877): bestpath 0.11 wall 0.078 xRT
what
READY....
   INFO: ngram_search.c(874): bestpath 0.10 CPU 0.071 xRT
INFO: ngram_search.c(877): bestpath 0.11 wall 0.078 xRT
what
READY....

 

接下來就是   control all the thing



  先來run 一個已經寫好的範例

    git clone https://github.com/bynds/makevoicedemo
cd makevoicedemo
python main.py

    他的程式會停在 need more input:

   這時候我就說  Turn on the kitchen Light....

   他就秀出來了  

 

   這樣其實代表是辨識成功....

    接下來要動手打造自己的例子....

     要使用  PocketSphix  ..需要三個元素

    1.   dictionary
    2.   grammar file
    3.   init decoder

    step  1 :  dictionry...
                先用編輯器編輯  corpus.txt
                  以他的例子是下面的內容...你也可以改成你自己的...
        
turn on the kitchen light
turn off the kitchen light
turn on the bedroom light
turn off the bedroom light
turn on the roomba
turn off the roomba
roomba clean
roomba go home

接下來要把他上傳到網站...  

  用  web browser ....輸入   http://www.speech.cs.cmu.edu/tools/lmtool-new.html

  網站的畫面如下:


點選左下角的  選擇檔案....  upload your  corpus.txt 

接著按下   Compile Knowledge Base

 然後就會跳轉到下面這個頁面


選擇down    *.tgz.....  以我的例子為言是  TAR0304.tgz

wget http://www.speech.cs.cmu.edu/tools/product/1454753396_20565/TAR0304.tgz

tar -xvf TAR0304.tgz

step  2 :  grammar file...

以他的例子......  grammar.jsgf

#JSGF V1.0;
grammar commands;

<action> = TURN ON      |
        TURN OFF        ;

<object> = KITCHEN LIGHT|
        BEDROOM LIGHT   |
        ROOMBA          ;

public <command> = <action> THE <object> |
                ROOMBA CLEAN             |
                ROOMBA GO HOME           ;

  其實你可以改在 最後....  例如

public <command> = <action> THE <object> |
                ROOMBA CLEAN             |
                LEFT                                    |
                 RIGHT                                |
                ROOMBA GO HOME           ;

step 3 : init decoder
修改  pocket_sphinx_listener.py

self.hmm = 'cmusphinx-5prealpha-en-us-ptm-2.0/'
self.dic = 'dictionary.dic' self.lm = 'language_model.lm' self.grammar = 'grammar.jsgf'
  
改成你剛剛解壓縮完的檔案....副檔名一樣....主檔名不一樣


接下來就是修改他的例子....  main.py

裡面的  hue 和 roomba 和 configuration和 insteon 都不需要....只留 gevent....這個是為了 停留 1秒


然後把裡面的 roomba和  configuration 和 insteon 相關的code 都delete.....

直接看到  run_main 這個函式

def runMain():
 
    # Now we set up the voice recognition using Pocketsphinx from CMU Sphinx.
    pocketSphinxListener = PocketSphinxListener()

    
    while True:
        
  try:
            command = pocketSphinxListener.getCommand().lower()
             if command.startswith('turn'):
                       do_turn_action().....

看到這邊就知道....  command其實就是辨識出來的字串....

 接下來你就是拿它來做判斷...去執行相對應的動作就可以了....






Reference : http://makezine.com/projects/use-rasp
berry-pi-for-voice-control/

1 則留言:

  1. 您好,我在測試程式中發現一個問題:
    在main.py中,我將
    from hue import Hue
    from insteon import Insteon
    刪除之後,會出現錯誤在"gevent.monkey.patch_all()"
    顯示出 'module' object has no attribute 'monkey'。
    如果沒有將這兩項刪除,就不會出現這個問題
    from hue import Hue
    from insteon import Insteon
    想請求詢問這個問題的原因。
    麻煩您了,謝謝

    回覆刪除