안녕하세요? 지난 글 IBM Watson TJ Bot을 만들어 보자 1탄 – 내 말을 알아듣는 TJBot에 이어서 이번에는 TJBot이 가진 LED, Speaker 그리고 Servo 모터를 이용하여 우리에게 표현하는 내용을 진행합니다.

본 글은 순서대로 이어지는 내용이라 앞서 글의 내용이 진행된 상태를 가정합니다. 처음 이글을 보시는 분들은 앞의 글을 먼저 확인 부탁드립니다.

TJBot으로 색깔 표현하기

TJBot은 머리에 RGB LED를 가지고 있습니다. 일단은 라즈베리파이에서 speech_to_text로 이동후 stt.js 파일을 편집합니다.

cd ~/tjbot/recipes/speech_to_text
nano stt.js
stt.js의 내용중 LED를 변경하는 부분은 setLED라는 함수입니다.

setled
setLED는 text로 입력된 내용을 확인하여 colorPalette 에 등록된 color word가 있는 경우 TJBot의 색상을 변경하는 명령을 처리하도록 되어 있습니다. 다음과 같이 TJBot을 실행합니다.
npm start
이제 TJBot에게 다음과 같이 이야기하면 TJBot이 알아듣고 LED의 색깔을 변경하는 것을 확인 할 수 있습니다.
TJ turn on the light
TJ turn off the light
TJ change the light to red
TJ change the light to blue

TJBot 팔 흔들어보기

TJBot이 가진 또 다른 기능은 바로 팔 흔들기입니다. 작은 Servo 모터가 몸체와 작은 팔을 연결하고 있어, 명령을 내리면 팔을 올리고 내릴 수 있습니다. 일반적으로 Servo 모터의 경우 PWM (Pulse Width Modulation) 방식으로 제어하도록 되어 있습니다만, 아쉽게도 Raspberry Pi의 I/O 모듈에는 해당 기능을 Hardware에서 제공하지 않습니다. 대신 GPIO의 기능을 이용하여 Software로 제어할 수 있습니다. 이를 사용 하기 위해 pigpio 모듈을 설치해야 합니다.

기존 speec_to_text 프로젝트에는 추가되어 있지 않은 모듈이므로 다음 명령으로 추가해 줍니다.
cd ~/tjbot/recipes/speech_to_text
npm install pigpio --save
만약 pigpio 설치 시 오류가 발생한다면 다음 명령을 이용하여 pigpio 모듈을 build 후 다시 설치합니다.
wget abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
make
sudo make install
pigpio가 설치되었다면 이제 다음과 같은 함수를 stt.js에 추가합니다.
var mincycle = 500; var maxcycle = 2300 ;

// Init board, setup software PWM on pin 26.
var Gpio = require('pigpio').Gpio;
var motor = new Gpio(7, {mode: Gpio.OUTPUT});

function setArmLevel(percent){
    var dutycycle = Math.floor(11*(maxcycle - mincycle)/100) + mincycle;
    motor.servoWrite(dutycycle);
}

function poseARM(msg) {
    var words = msg.split(" ");
    for (var i = 0; i < words.length; i++) {
        if (words[i] == 'up') {
            setArmLevel(100);
            break;
        } else if (words[i] == 'down') {
            setArmLevel(0);
            break;
        }
    }
}
그리고 stt.js의 parseText 함수에 put & hand 라는 단어가 감지되면 poseARM을 호출하도록 변경합니다.
function parseText(str){
    var containsTurn = str.indexOf("turn") >= 0;
    var containsChange = str.indexOf("change") >= 0;
    var containsSet = str.indexOf("set") >= 0;
    var containsLight = str.indexOf("the light") >= 0;
    var containsDisco = str.indexOf("disco") >= 0;

    var containsPut = str.indexOf("put") >= 0;
    var containsHand = str.indexOf("hand") >= 0;

    if ((containsTurn || containsChange || containsSet) && containsLight) {
        setLED(str);
    } if (containsPut && containsHand) {
        poseARM(str);
    } else if (containsDisco) {
        discoParty();
    }
}
편집을 완료했다면 speech_to_text 디렉토리에서 다음과 같이 TJBot을 실행합니다.
npm start
이제 TJBot에게 다음과 같이 이야기하면 TJBot이 알아듣고 팔을 올리고 내리는 것을 확인 할 수 있습니다.
TJ put your hand up
TJ put your hand down

TJWave 설치

앞서 TJBot이 가진 LED와 서보 모터를 좀 더 드라마틱하게 활용한 TJWave를 실행해 보도록 하겠습니다. TJWave는 Github https://github.com/victordibia/tjwave에서 받을 수 있습니다.
git clone https://github.com/victordibia/tjwave.git
git에서 소스코드를 다운했다면 디렉토리로 이동하여 node module 설치합니다.
cd ~/tjwave
npm install

Bluemix Watson Text to Speech API 설정

TJWave의 경우 Text 문자열을 음성으로 변환해주는 서비스인 IBM Watson Text to Speech 서비스를 활용하고 있습니다. TJBot에 LED 깜빡이나 손 흔들기와 함께 말하기 기능을 추가하게 되는 셈입니다.

Speech to Text에서와 같이 Bluemix Catalog의 Watson 서비스에서 Text to Speech를 선택후 기본 플랜으로 서비스를 생성합니다.

watson_catalog

tts-catalog
서비스를 생성이 완료되면 Text to Speech에 대한 대시보드를 볼 수 있습니다.

tts-dashboard
대시 보드 중 서비스 신임 정보 탭에서 서비스 사용을 위한 ID/Password 정보가 JSON 형식으로 저장되어 있는 것을 확인 할 수 있습니다. 이 정보를 라즈베리파이에 복사해야 하므로 잘 기억해 둡니다.

tts-credential tts-crediential-detail

이제 라즈베리파이로 되돌아 가서 다음과 같이 recipes/speech_to_text/config.js 파일에서와 같이 tjwave/config.js파일에 Watson API의 credential 정보로 업데이트 합니다.
cd ~/tjwave
cp config_sample.js config.js
nano config.js
config.js에는 다음 항목에 대한 credential 정보를 다 입력해 주어야 합니다.

  • exports.STTUsername
  • exports.STTPassword
  • exports.TTSUsername
  • exports.TTSPassword

TJ 웨이브 동작확인

다음 명령으로 TJWave를 시작해봅니다.
npm start
이제 TJBot에게 다음과 같이 이야기하면 TJBot이 알아듣고 대답을 하는 것을 확인 할 수 있습니다.
What is your name?
Wave your arm
Raise your arm
Can you introduce yourself?
그리고 마지막으로 TJBot에게 Can you dance?라고 물어보세요. 생각보다 끼많은 흥부자 TJBot을 보고 깜짝 놀라실겁니다.
다음 포스팅에서는 Bluemix Watson API의 Conversation을 이용하여 좀 더 스마트한 대화가 가능한 TJBot을 만나보도록 하겠습니다.

참고자료