[TJBOT紙板機器人] 第一次製作機器人就上手-程式進階篇_語音控制LED

本文將介紹如何在 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

程式大致上分成以下步驟:

  1. 設定Bluemix
    在此須正確輸入您的 Bluemix 帳號密碼
  2. 設定麥克風
    設定麥克風來取得您說話時的語音輸入檔。更多資訊請參考https://www.npmjs.com/package/mic
  3. 把語音指令轉成文字
    本步驟會把麥克風所錄製的聲音檔送到 “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紙板機器人] 第一次製作機器人就上手-組裝篇

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *