摘要:RAPIRO - Raspberry Pi機器小女僕(5)-聲控Rapiro
安迪兒的小機器人目前有試過了wii 藍芽控制、手機控制、也裝上了攝影機
預計中的功能看起來剩下聲控這個大功能
其實安迪兒一直有在試聲控的方案
聲控初步的想法是
大約是Raspberry pi加上語音解譯再加上程式去判斷然後去呼叫Rapiro執行動作
雖然也有試了一些東西,但還是有問題
安迪兒試過的方案:
1.整合IPhone去聲控透過Siri proxy解析
->後來發現只能用在IOS6上,IOS7己經改變加密無法使用
2.還有新發表ios7 Siri破解方式,用GoogolPlex去轉接
->但很像和區域有關係,安迪兒使用它的代理伺服器,寫的語音指令也沒反應
後來google 查了一下,有些人也有反應這個問題,好像和區域有關係,所以放棄這個方案
3.試了網路上流傳前人解析出google語音識別的Speech To Text API
它其實是模擬送一些偽造的post給google speech api來達到語音翻譯的功能
大約是下面這樣
"Mozilla/5.0" --post-file daveconroy.flac --header "Content-Type: audio/x-flac;
rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=en-us&client=chromium"
參考文件
但~很不巧的,安迪兒試都是一直回傳500 Error = =|
(意思是太晚使用~~~google不給用了~~~XD)
查了一下有不少人有這個問題,
然後發現原來google有新的Speech To Text API v2版本
看了一下相關的原碼,這版有加上api和api key這個東西
範例站:
綜合以上的實驗
最後安迪兒是用Google Speech To Text API v2來搞定這個聲控的方案~XD
先來看一下完成圖^^
這邊記錄一下執行的方式
1.申請Google Chromium API key
嗯--有點長,參考官方的how-to 文件吧~XD
大約是
a.打開https://cloud.google.com/console
b.加入chromium-dev@chromium.org 這個專案,才可以開啟Speech To Text
c.Create New Client ID
d.Create New Key
以上完成後,初步的準備動作就完成了
2.再來就是整合語音API和Rapiro的控制
安迪兒這次試寫了linux的shell script來達到這個語音控制的功能
程式的動作邏輯是
a.執行後輸入c開始錄音(Ctrl+C停止錄音)成flac檔
b.POST資料呼叫API傳回jason內容
c.解析jason語音解譯內容
d.對Rapiro做相關的控制
實際影片(透過google的API有點慢XD~~~)
終於~~~收工嘍~~收工嘍~~~
程式碼(stt.sh):
echo "Recording your Speech:--help "
while read -p "input key:" keyinStr; do
echo $keyinStr
if [ "$keyinStr" = "exit" ]; then
exit 5
fi
if [ "$keyinStr" = "c" ]; then
echo "Recording...(Ctrl+C to Transcribe)"
sudo arecord -D plughw:0,0 -q -f cd -t wav -d 0 -r 16000 | flac - -f --best --sample-rate 16000 -s -o andyrecord.flac;
echo "Converting Speech to Text..."
sudo wget -q -U "Mozilla/5.0" --post-file andyrecord.flac --header "Content-Type: audio/x-flac; rate=16000" -O - "https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=bababababababababababa....&client=chromium&maxresults=6&pfilter=2" > stt.txt
sudo cut ./stt.txt -d\" -f8 | grep -v ^$ > stt1.txt
fi
if [ "$keyinStr" = "--help " ]; then
echo ":c-start record flac file "
echo ":exit-exit"
fi
value=`sudo cat stt1.txt`
echo "$value"
case $value in
hello )
echo "#M5" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
right )
echo "#M3" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
left )
echo "#M4" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
forward )
echo "#M1" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
back )
echo "#M2" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
#exec ./pirom2
;;
bye )
echo "#M8" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
stop )
echo "#M0" | sudo minicom -b 57600 -o -D /dev/ttyAMA0
;;
esac