本文將介紹如何在 Raspberry Pi 上設定 TJBot 所需之硬體與軟體環境,並結合 IBM Bluemix 的 Sppech to text 服務打造一台能以語音指令控制LED的機器人。
機器人外殼組裝請參考:http://wp.me/p3T9Qk-5B1
作者/攝影 |
曾吉弘 |
時間 |
6小時(組裝、環境設定與編寫程式等) |
成本 |
|
難度 |
* * * * * * * |
材料表 |
- TjBot紙板模型(未組裝) X1
- 樹莓派 Raspberry Pi 3 Model B X1
- 5V3A USB交換式電源供應器 X1
- Class 10 16G micro SD卡 X1
- 小喇叭 X1
- USB 迷你麥克風 X1
- LED 5mm 白發紅光 X1
- SG90小型伺服機 X1
- EIC 170孔麵包板 X1
- 電阻 220歐姆 X1
- 線材 X1
|
1.Raspberry Pi設定
請燒錄最新的 Raspbian 作業系統讓 Raspberry Pi 開機,本文使用 Raspberry Pi 3,但經測試,Raspberry Pi 2 也可正常使用。
2.安裝所需套件
Raspberry Pi 連上網路之後,請依序在 Raspberry Pi 的 terminal 中執行以下指令:
- sudo apt-get update (更新可用軟體)
- sudo apt-get dist-upgrade (升級軟體)
- curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash –
- sudo apt-get install -y nodejs (安裝js)
- sudo apt-get install alsa-base alsa-utils (安裝alsa聲音程式)
- git clone https://github.com/ibmtjbot/tjbot.git (取得本專案之github source)
- cd tjbot/recipes/speech_to_text (切換到指定資料夾)
- npm install (安裝所需之npm套件與檔案)
- npm install onoff
安裝完之後您的資料夾應該長這樣,有一個 /node_modules 資料夾,裡面是必要的函式庫:
3. Bluemix 設定
本段將介紹如何在 IBM Bluemix 上建立一個 Speech to text 服務。這個服務可以把我們對麥克風說的話轉成文字,讓Raspberry Pi 來辨識並執行對應動作
請註冊一個免費的 IBM bluemix 帳號
完成之後完成之後可於畫面左上角點選 [服務]/ [Watson] 即可看到我們所建立的 my-stt-service 服務。
4. 所需零件
所需硬體
5. 硬體設定
請如下圖連接硬體,GND接到 Pi 的GND,LED則分別將正極接到Raspberry Pi 3 的GPIO14腳位(下圖右排,第4隻),負極則接到Raspberry Pi 3 的GND腳位(下圖右排,第3隻)
stt.js
程式大致上分成以下步驟:
- 設定Bluemix
在此須正確輸入您的 Bluemix 帳號密碼
- 設定麥克風
設定麥克風來取得您說話時的語音輸入檔。更多資訊請參考https://www.npmjs.com/package/mic
- 把語音指令轉成文字
本步驟會把麥克風所錄製的聲音檔送到 “Watson Speech to Text”服務,並以”textStream” 回傳轉譯後的文字。可用的語系有以下,請由程式碼中的 var recognizeparams = {
content_type: ‘audio/l16; rate=44100; channels=2’,
model: ‘en-US_BroadbandModel’
};
來設定:
- zh-CN_NarrowbandModel
- zh-CN_BroadbandModel
- pt-BR_NarrowbandModel
- pt-BR_BroadbandModel
- ja-JP_NarrowbandModel
- ja-JP_BroadbandModel
- fr-FR_BroadbandModel
- es-ES_NarrowbandModel
- es-ES_BroadbandModel
- en-US_NarrowbandModel
- en-US_BroadbandModel (預設)
- en-UK_NarrowbandModel
- en-UK_BroadbandModel
- ar-AR_BroadbandModel
4.解析文字
在此會在解析後文字中找尋有沒有我們所設定的關鍵字,例如”on”、”off”與”light”。您可以說各種組合,例如”lights on”、”turn the lights on”或”turn on the lights”等等,在此我們使用的文字解析服務而非單純的字串辨識。您可由 parseText 函式中可看到定義關鍵字的方式,您可以根據這樣的架構加入更多關鍵字以及配對,一步步讓您的TJbot 更聰明。
/************************************************************************
* Copyright 2016 IBM Corp. All Rights Reserved.
*
* Watson Maker Kits
*
* This project is licensed under the Apache License 2.0, see LICENSE.*
*
************************************************************************
*
* Control a NeoPixel LED unit connected to a Raspberry Pi pin through voice commands
* Must run with root-level protection
* sudo node stt.js
Based on example NeoPixel code by Jeremy Garff (jer@jers.net)
Follow the instructions in http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/ to
get the system ready to run this code.
*/
//modified to single LED version, no NeoPixel needed, CAVEDU, Feb 2017
//STEP1
var watson = require('watson-developer-cloud');
var config = require('./config'); // gets our username and passwords from the config.js files
var speech_to_text = watson.speech_to_text({
username: config.username,
password: config.password,
version: config.version
});
//STEP2
// Initiate Microphone Instance to Get audio samples
var mic = require('mic');
var micInstance = mic({ 'rate': '44100', 'channels': '2', 'debug': false, 'exitOnSilence': 6 });
var micInputStream = micInstance.getAudioStream();
micInputStream.on('data', function(data) {
//console.log("Recieved Input Stream: " + data.length);
});
micInputStream.on('error', function(err) {
console.log("Error in Input Stream: " + err);
});
micInputStream.on('silence', function() {
// detect silence.
});
micInstance.start();
console.log("TJBot is listening, you may speak now.");
//設定GPIO來控制LED亮滅
var Gpio = require('onoff').Gpio;
var led = new Gpio(14, 'out');
//STEP3
var recognizeparams = {
content_type: 'audio/l16; rate=44100; channels=2',
model: 'en-US_BroadbandModel' //請由此設定語系
};
var textStream = micInputStream.pipe(
speech_to_text.createRecognizeStream(recognizeparams)
);
//STEP4
textStream.setEncoding('utf8');
textStream.on('data', function(str) {
console.log(' ===== Speech to Text ===== : ' + str); // print each text we receive
parseText(str);
});
textStream.on('error', function(err) {
console.log(' === Watson Speech to Text : An Error has occurred =====') ; // handle errors
console.log(err) ;
console.log("Press <ctrl>+C to exit.") ;
});
function parseText(str) {
if (containsText(str, "light") && containsText(str, "on")) {
console.log("Turn ON");
led.writeSync(1)
} else if (containsText(str, "light") && containsText(str, "off")) {
console.log("Turn OFF");
led.writeSync(0)
} else {
console.log("Please say something like turn on/off the light");
}
}
function containsText(str, keyword) {
return str.indexOf(keyword) >= 0;
}
7. 測試與執行
請回到您的Pi,把上述程式碼中的 username 與 password 改成您個人的 Bluemix 帳號密碼即可。請在 terminal 中輸入以下指令即可執行本程式:
sudo node stt.js
請對您的 TJBot 說話吧,只要一句話中包含了關鍵字”on”與”light”,就會亮燈,如果包含關鍵字”off”與”light”則會熄燈。因此您可以說 “light on” 或是 “turn on the light” 都是可以的。
如果無法辨識關鍵字會提示您相關的關鍵字。從 parseText 函式中可看到定義關鍵字的方式,您可以根據這樣的架構加入更多關鍵字以及配對,讓您的TJBot 更聰明喔!
參考資料:
http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/
相關文章:
[TJBOT紙板機器人] 第一次製作機器人就上手-組裝篇
Post Views: 368