Alexa Custom skill 참고

Posted by ho95

시작

8월 중순부터 알렉사 스킬을 만들어 보고 있습니다. (회사 업무로…)

알렉사는 아마존에서 만든 AI입니다. 삼성 빅스비나, 애플 시리 같은 것입니다.

(자세한 내용은 https://ko.wikipedia.org/wiki/%EC%95%84%EB%A7%88%EC%A1%B4_%EC%95%8C%EB%A0%89%EC%82%AC) 아마존에서 라즈베리파이나 다른 보드에도 적용 할 수있게 SDK를 배포중입니다.

아직 한글은 지원하지 않습니다. 영어, 일본어외 2-3가지를 지원 하는데, 영어를 기준으로 하겠습니다.

알렉사 스킬의 전체적인 흐름은 알렉사SDK가 설치된 단말에서 스킬을 이용해 요청을 보냅니다.

요청을 Endpoint에 지정해둔 서버로 보내서 처리후 그것을 다시 알렉사에게 보내 응답을 하게됩니다.

추가로 하드웨어 제어라던지 동작을 하려면 endpoint 단에서 작업을 해주시면 됩니다.

알렉사 스킬이란 무엇인가

알렉사 스킬은 스마트폰의 어플리케이션 같은 개념입니다.

그 중 커스텀 스킬이 있는데, 이것은 사용자와 알렉사간의 대화를 직접 만들 수 있습니다.

많은 예제들이 인터넷상에 올라와 있습니다.

스킬 제작을 위해선 developer.amazon.com에 계정을 만들고, Alexa skills kit 메뉴로 들어가면 됩니다.

우리가 신경 쓸 것은 1)Invocation Name / 2)Intent / 3)Endpoint 입니다.

Invacation name

현재 만드는 스킬을 호출할 때 사용할 이름입니다.

알렉사에게 명령을 할때 “Alexa, ask (Invocation name) to 명령어”라고 말을합니다.

ask 말고 open도 사용할 수 있습니다. Open (invocation name)

이름의 규칙은 2단어 이상, 그리고 숫자도 표현도 영어로 적어주어여 합니다. (1이 아닌 one)

그리고 프로그래밍 언어처럼 예약어가 있어서, ask, open 같은 런칭워드, 그리고 Alexa는 X.

이는 밑에 설명할 intent에도 동일하게 적용됩니다.

Intent

프로그래밍 언어로보면 하나의 함수처럼 보면 될 것 같습니다.

우리가 알렉사에게 말을 했을때, Intent속 “Sample Utterances”란 것에 대응 되는 문장이 있으면

그 인텐트를 실행하게 됩니다.(인텐트의 실제 실행 내용은 Endpoint 부분에서 다룹니다.)

Sample Utterances는 알렉사에게 물어볼 문장 혹은 단어들입니다.

예시로 speakHello라는 intent가 있고 그 인텐트 안에 Sample Utterances로

“Hi alexa How are you?”가 있으면 알렉사는 sepakHello 인텐트를 실행하게 됩니다.

기본적으로 웹 화면에서 작성이 가능하지만 직접 json을 이용하여 작성도 가능합니다.

Endpoint

Endpoint는 Sample Utterances에서 실행할 intent를 정하여 알렉사가 요청한 것을

실질적으로 수행할 내용이 적혀 있는 백엔드의 주소입니다.

아마존 AWS의 Lambda를 이용하는 방법과 직접 서버를 만들어 요청을 처리해 줄 수있습니다.

라즈베리파이의 GPIO도 제어를 하려고 하는데, AWS IOT와 Lambda 연동을 시도 했으나, 성공하지

못하여 자체 서버를 만드는 방법을 이용 하였습니다. 언어는 pyton, js, java등이 있는데, 저는 파이썬을

사용하였습니다. 그리고 주소는 꼭 보안상의 이유로 https만 받습니다. 람다의 경우 ARN을 그대로

복붙 하시면 됩니다.

구현

H/W

1)라즈베리파이3 2대

2)알렉사 사용을 위한 마이크 스피커

3)GPIO 작동 확인을 위한 점퍼선2개와 LED1개

S/W

1)파이썬(flask, flask-ask, paho-mqtt, RPi.GPIO) 모듈

2)공유기 사용중이므로 외부망에서의 접속을 위한 localtunnel.(대체품 ngrok)

3)알렉사 SDK

라즈베리 1대와 스피커 마이크는 알렉사 단말, 나머지 1대는 요청 처리용 라즈베리입니다.

단말은 SDK, 서버 라즈베리에서 응답이오면 처리해줄 코드(py)만 있으면 됩니다. 스킬은 아마존에서…

저에게 문제는 요청을 처리 해주는 서버단이 였습니다. 서버 클라이언트의 개념을 잘 모르는 터라

통신 프로그래밍이 어려웠으나… 구글링하며 공부하여 구현 하였습니다.

처음에는 라즈베리 1대에 백엔드단까지 구현하여 사용 하려고 했으나 전원이 완전히 꺼졌다

켜지는 상황에서는 문제되는 상황이 있었기 때문에 분리하여 구현 했습니다.(지금 생각해보니 당연한 것…)

파이썬의 flask 모듈로 서버가 실행되고, flask-ask로 intent 요청을 처리하도록 했습니다.

그리고 intent 요청이 처리될 때, mqtt를 이용하여 간단하게 숫자 같은것을 보내 단말 라즈베리에서

그것을 이용하여 GPIO 제어를 합니다. 코드의 형식은 아마존 문서를 보면 자세하게 설명돼 있습니다.

저는 회사 공유기에 서버 라즈베리가 물려져 있고, 알렉사 스킬에서 endpoint를 https만 받기 때문에

localtunnel을 이용하여 https 도메인을 만들었습니다. mqtt도 MQTT Broker라고 중개 서버가 필요한데,

이것은 mqttclould라는 곳을 이용하여 해결 하였습니다. (자체적으로도 구현 가능하나 저는 못합니다…)

끝!