[라즈베리파이] 음성인식 홈 컨트롤러 - VOICE CONTROLLER
- HelloMaker
- 0
- 16,074
- 0
- 0
- 글주소
- 12-13
- Link
- http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=project_hardcopy&wr_id=252&page=238
이전부터 써오던 NAS (Network Attached Storage) 서버가 있었는데 3년 반 쯤 지나니까 맛이 가버린... 그래서 새로 한 대 맞추는 김에 저전력 일체형 PC를 사서 우분투 리눅스를 깔고 가지고 놀았습니다. 2테라 하드를 기반으로 붙은 NAS, 미디어 서버, 클라우드, 토렌트, 뮤직 스트리밍 등등... 활용 방법이 많아서 꽤나 만족스러웠습니다. 헌데 가끔 간단한 설정을 위해 Telnet 접속해서 작업하는게 귀찮기도 하고.. 좀더 간편하게 작업들을 자동으로 처리하도록 해보고 싶었습니다.
그래서 음성인식으로 홈 서버를 제어할 수 있도록 시스템을 구축해 봤습니다.
안드로이드에서 음성인식 구현하는건 생각보다 간단합니다. 구글 음성인식 API가 제공되기 때문에 코드 몇 줄이면 음성인식 기능을 넣을 수 있습니다. 오히려 음성인식 보다는 인식된 음성 명령을 서버, 그리고 다양한 기기들과 공유할 수 있는 방법이 더 중요합니다. 그래서 사용한 것이 MQTT 프로토콜 입니다.
MQTT 프로토콜은 보통 기계를 위한 트위터 시스템으로 소개됩니다. 우리가 트위터에 메시지를 게시(publish)할 수도 있고, 게시된 메시지는 자동으로 팔로워에게 전송되죠. MQTT 에서는 팔로우 대신 subscribe 라는 단어를 사용합니다만 기능은 뭐 비슷합니다. 암튼 MQTT를 사용하면 다양한 기기들이 서로 원하는 메시지만 공유할 수 있다는 겁니다. 자세한 내용은 아래 링크를 참고하세요.
전체적인 동작 흐름도는 아래와 같습니다.
라즈베리파이같은 서버에 MQTT 서버 프로그램 (broker라 부름)을 설치하면 다양한 장치들이 broker에 붙어 메시지를 주고 받을 수 있습니다. 폰에서 인식한 음성이 텍스트로 변환되어 MQTT broker로 날라가면 라즈베리파이에서 필요한 처리를 할 수도 있구요, 또는 마이크로 컨트롤러에서 메시지를 받아 명령어에 맞는 동작을 하도록 하면 됩니다.
구현 과정
MQTT broker는 제가 가진 우분투 서버에 이미 설치가 되어 있는 상태여서 특별히 건들건 없었습니다. 라즈베리파이에 설치해서 사용하는 법은 아래 링크에 내용이 포함되어 있으니 참고하세요.
음성인식 기능과 MQTT client 기능을 갖춘 안드로이드 앱만 만들면 금방 테스트 해볼 수 있을 것 같았는데... 생각보다 시간이 오래 걸렸네요. 음성인식은 금방 구현했는데, 안드로이드용 MQTT client 소스 공유된게 거의 없더군요. 대부분 Paho 안드로이드용 MQTT 라이브러리를 사용하는 것 같았습니다. 저도 Paho 라이브러리를 받아서 이리저리 수정을 해서 사용했습니다. 음성인식 컨트롤러 만드는데 대부분의 시간은 MQTT 기능 넣는데 들어간...
그렇게 만든 앱이 MQTT VoiceCon 앱입니다.
먼저 MQTT broker (server) 를 등록하고 연결한 뒤, 특정 topic(채널)을 적어둡니다. 그리고 [마이크] 아이콘을 누르고 음성 명령을 내리면 텍스트로 변환되어 MQTT broker 의 topic(채널)으로 전달됩니다.(publish 과정)
해당 topic을 구독(subscribe)하는 장치들은 텍스트로 변환된 음성 명령을 받아서 처리합니다. 라즈베리파이 또는 마이크로 컨트롤러들이 메시지를 받아서 처리하겠죠.
MQTT VoiceCon 앱의 상세 내용은 아래 링크에 있으며 소스코드를 GitHub에 올려두었습니다.
Google Play Store 앱 다운로드 (v4.0.3 이상 지원)
소스코드 다운로드 (GitHub)
동작 테스트
음성 메시지가 우분투 서버에 있는 MQTT Broker 까지 전달은 되지만 이 명령어를 받아서 처리할 프로그램 또는 장치를 만들어야죠. 간단히 테스트하기 위해서 ESP8266 wifi 모듈에 LED를 달아서 음성 명령으로 LED를 on/off 할 수 있도록 만들었습니다.
ESP8266 모듈은 부팅이후 공유기에 연결되고, MQTT broker에 접속합니다. 그리고 특정 topic(채널) 으로 들어오는 메시지를 받습니다. 안드로이드 폰에서도 음성 명령이 같은 topic으로 전달되도록 설정하고 음성명령을 내리면 되겠죠. ESP8266 모듈은 [LED on], [LED off] 명령에 반응하도록 만들어 뒀습니다.
직접 해보니 동작 잘 됩니다!! 테스트에 사용된 ESP8266 소스코드는 아래 링크에 있습니다. 소스 컴파일을 위해서는 ESP8266 - Sming 개발환경이 필요합니다.
뭐 LED 켜고 끄는 것만 제대로 되면 다른 동작도 쉽게 할 수 있겠죠.
좀 더 복잡한 기능을 제어하는 예제도 만들어 봤습니다. 우분투 리눅스가 돌아가는 홈 서버의 일부 기능들도 음성으로 제어하는 겁니다.
이 서버에는 MPD (Music Player Daemon) 가 설치되어 있습니다. MPD를 이용해서 서버에 연결된 스피커로 음악을 재생하기도하고, 온라인으로 스트리밍을 해주기도 합니다. 이걸 음성 명령으로 제어할 수 있도록 만들었습니다.
요걸 위해서 파이썬으로 짠 프로그램을 우분투에서 돌렸습니다. 파이썬 프로그램은 MQTT broker에 연결해서 특정 topic으로 들어오는 메시지를 감시하고 음성 명령어에 따라 해당 동작을 합니다. [음악 재생], [음악 정지] 명령을 내리면 음악이 재생/정지 됩니다.
테스트를 해보니 잘 되네요. 꽤나 간편합니다 ㅎㅎ... TV 도 이걸로 조종할 수 있으면 좋을텐데...
파이썬 프로그램을 작성하기 위해 Paho MQTT Python 라이브러리를 사용했습니다. 아래 링크에 라이브러리 설치방법과 예제 코드가 있으니 참고해서 여러가지 기능을 구현해 보시길...
전 일전에 파이썬으로 홈 오토메이션용 프로그램을 작성해 둔 것이 있어서 재활용 했습니다. 그래서 음악 재생/정지, 사진 촬영 후 메신저로 전송, CCTV on/off 등의 동작을 음성으로 제어할 수 있습니다. 아직 마이크로 컨트롤러를 이용한 기능들은 별루 넣어둔게 없는데... 시간나면 재밌는 기능들 추가해서 소개하도록 하겠습니다.
즐거운 DIY 하시길...