接續上篇,這下篇要來紀錄如何實現語音命令來操控智能小車
先完成上篇才有辨法接下篇哦
先上一個完成測試的視頻
step1:在樹莓派中端機裡建立一個.txt檔並打入要讓小車接受的語音比對
這個動作的目的是讓poketsphnix縮小範圍的辨識語音,讓辨識率更精準
$ sodo nano voice.txt
(檔名看個人喜好命名,後面加.txt文字檔)
在文件編輯器裡鍵入想讓它辨識的單詞,加好後將它存檔
step2:在pi裡打開瀏覽器並聯上Sphinx Knowledge Base Tool這個網站
它可以把你剛剛建的文件檔轉換成sphnix能辨識的語言
http://www.speech.cs.cmu.edu/tools/lmtool-new.html
按下生成檔案的鈕之後會到檔案下載頁面
上圖最下方有一個TAR8681.tgz檔,按右鍵可以下載(檔妹編號會隨機配號所以會和我網頁上的不同
在/home/pi/裡建一個資料匣,把剛下載的.tgz檔解壓在資料匣裡
step3:編輯C 文件讓辨識到關鍵詞聯繫到C 文件的py檔
$ cd ~/sphnix-0.8/src/programs
$ sudo nano continuous.c
找到下圖裡的/* Exit if the first word spoken was GOODBYE */
然後把想要連結的程式碼打入
請參考下圖
上圖裡的if是聲音給它去做比對,然後用兩個中挎號{ }包起來,裡面有兩個system第一個espeak是
它比對到你給它的命令時它會回應你,例如我說"back",它會回應"now is back"
第二個system它就會去指定的py檔裡找到對應的關鍵字。
現在說一下py檔裡要新增什麼才能讓它去對應
- #!/usr/bin/python #這行很重要,如果沒有這行,它很難去找到這個py檔
- import RPi.GPIO as GPIO
- import time
- import sys
- GPIO.setwarnings(False)
- GPIO.setmode(GPIO.BCM)
- #GPIO.setup(2,GPIO.OUT)
- #GPIO.setup(3,GPIO.OUT)
- GPIO.setup(20,GPIO.OUT)
- GPIO.setup(21,GPIO.OUT)
- GPIO.setup(12,GPIO.OUT)
- GPIO.setup(13,GPIO.OUT)
- def forward():
- #GPIO.output(2,True)
- #GPIO.output(3,True)
- GPIO.output(21,False)
- GPIO.output(20,True)
- GPIO.output(12,False)
- GPIO.output(13,True)
- def backward():
- #GPIO.output(2,True)
- #GPIO.output(3,False)
- GPIO.output(21,True)
- GPIO.output(20,False)
- GPIO.output(12,True)
- GPIO.output(13,False)
- def turn_right():
- GPIO.output(21,False)
- GPIO.output(20,True)
- GPIO.output(12,True)
- GPIO.output(13,False)
- def turn_left():
- GPIO.output(21,True)
- GPIO.output(20,False)
- GPIO.output(12,False)
- GPIO.output(13,True)
- def stop():
- GPIO.output(21,False)
- GPIO.output(20,False)
- GPIO.output(12,False)
- GPIO.output(13,False)
- if (sys.argv[1])=="f":
- forward()
- print("forward")
- time.sleep(2)
- stop()
- if (sys.argv[1])=="b":
- backward()
- print("backward")
- time.sleep(2)
- stop()
- if (sys.argv[1])=="r":
- turn_right()
- print("turn_right")
- time.sleep(2)
- stop()
- if (sys.argv[1])=="l":
- turn_left()
- print("turn_left")
- time.sleep(2)
- stop()
- if (sys.argv[1])=="s":
- stop()
- print("stop")