[Tangible] 인공지능 스피커
- 성식 공
- 2021년 1월 28일
- 3분 분량
아두이노로 간단한 시제품들을 만들어보면서 느꼈던 불만 중 하나는, 컴퓨터에서 떨어진 순간 힘을 잃는다는 것이었다. 물론 요즘에야 갖가지 아두이노 쉴드 등을 부착하면 여러가지 다양한 기능을 첨가할 수 있지만, 그 역시 너무 번거럽고 힘들었다. 그러다 마침 라즈베리파이에 대해 배울 수 있는 좋은 기회가 생겨 참여하게 되었고, 더불어 그를 기반으로 인공지능 스피커를 제작해보게 되었다.
이의 기초적인 원리에 대해서는 이전 CaseStudy#11에 내가 아는 한에서 적어놓았다.
인공지능 스피커를 만드는 개략적인 순서는 다음과 같았다.
1. 라즈베리파이 기본 설정(라즈비안 설치 및 네트워크 연결/SSH 접근-PuTTy, VNC 사용)
2. 스피커와 마이크 연결 및 동기화
3. 스피커1: Google Assistant를 기반으로한 서비스 설치하기(Google Console)
4. 스피커2: 외부 라이브러리(TTS, STT)를 이용한 인공지능 구현(기초적인 자연어 처리)
5. Open API를 활용한 다양한 서비스 생성(공공 데이터 포털)
6. 3D 프린터와 GPIO 코드를 연결한 Tangible 하드웨어 시스템 구축
라즈베리파이에 대하여 간단히 소개를 하자면, 아두이노와 마찬가지로 오픈소스 하드웨어이다. 그러나 아두이노와는 다르게 고유의 운영체제가 있다. Lynux기반 운영체인데, 따라서 unix 커맨드 등도 잘 알고 있어야 원활하게 조작이 가능하다. 별도로 GPIO핀을 포함한 hdmi, USB포트, sound포트 등 다양한 하드웨어 연결도 지원한다. 여기서는 RaspberryPi 3 B+ 모델을 사용하였다. 처음에는 막연하게 낯설다고만 생각했는데, 계속 접하다 보니 사람들이 왜 쉽게 설명하고자 할 때 ‘아두이노 + 컴퓨터’라고 설명하는지도 알 것 같았고, 나는 이전부터 GitHub나 unix(Oracle-ubuntu등을 통해) CLI 환경 등에 대해서는 이미 경험이 많아 의외로 친숙하여서 금방 적응하게 되었다. 역시 무엇이든 열심히 해놓으면 후에 도움이 되지 않는 것이 없다.
이외의 준비물로는 스피커, 마이크, 5핀케이블(Raspberry 3 B+의 전원 케이블. 4의 경우 C타입을 지원한다.), 마이크로 SD카드와 어댑터, 사운드카드(라즈베리파이에는 소리정보 출력장치만 있고 입력장치는 없어서) 정도가 필요하였다. 나는 별도로 다른 GPIO 핀들까지도 활용해보고자 버튼 스위치, 터치 센서, 저항, LED, 전선 등을 추가해서 사용하였다.(이때 신기했던 것이 아두이노와는 다르게 라즈베리파이는 수-버전으로 핀이 돌출되어있다. 따라서 수-수 전선은 쓸모가 없고, 브레드보드를 쓰지 않는다면 오히려 암-암 전선이 필요한 경우가 대부분이었다.)
자세한 제작의 과정은 이곳에 줄글 형식으로 적기에는 적절하지 않아 다른 곳에 정리해두었다. 사용된 코드는 Google console과 블로그 홈 상단에 링크 되어있는 내 GitHub 주소를 참고해주길 바란다.
먼저 Google Assitant API를 따와서 받은 버전의 경우에는 원래 집에서 구글 홈 미니와 기가지니와 같은 인공지능 스피커를 사용하고 있었는데 그와 기능이 유사했다. 처음에는 물론 신기했지만 아무래도 기성품을 다운로드 받아서 사용한다는 느낌을 지울 수가 없었다. 또 컴퓨터에서 따로 입력을 넣어야만 작동한다는 점(venu 모드로 전환 후 대기 모드로 전환하는 코드를 실행하지 않으면 작동하지 않는다.)도 만족스럽지 않았다. 나아가 라즈베리파이 자체에 몸체가 없어서 부속품들이 이리저리 나뒹굴고 있는 모양새도 개선해보고 싶었다. 우선 시연 모습은 다음과 같다:
이에 따라 3D 모델링을 통해 라즈베리파이 본체를 담으면서도 그에 필요한 전선의 경로나 전원 케이블이 빠져나갈 구멍, 소리가 입력될 마이크를 지지할 거치대를 고려한 개략적인 몸체를 설계하여 3D 프린터로 출력해보았다. 전반적인 모양은 스피커의 모양을 고려하여 사람의 얼굴처럼 보이도록 해보았는데 많은 사람들이 동의할 지는 잘 모르겠다..ㅎ (3개의 점만 보면 얼굴로 인식한다는 효과가 실제로 있기 때문에: 검색해보니 - ‘파레이돌레이 효과’라고 한단다.)
또한 GPIO코드를 통해 터치센서와 연결하고 터치센서의 신호를 받아 작동하도록 하였다. 아두이노를 연습해보느라 가지고 있었던 잡다한 액추에이터들이 의외로 도움이 되었다.
그리고 역시, 외부 라이브러리들을 이용하여 소리를 글자로 변환해서 이해하고(STT, 자연어 처리) 그를 기반으로 음성 정보를 전달할 수 있는 (TTS) 인공지능 시스템을 별도로 설계하여 보았다. 각각 gTTS 라이브러리와 SpeechRecognition(그 중 Google Speech Recognition), pyaudio 라이브러리와 리눅스 프로그램 flac을 이용하였다. 자연어처리를 위해서는 Dialogue flow와 같은 경로를 사용하여도 되지만 현재 그렇게 복잡한 대화시스템까지 필요한 성능을 구현하기에는 무리가 있다고 생각하여 최소한의 원리를 개인적으로 고민한 나름대로의 자연어 처리 코드를 직접 짜서 사용하였다. 정리하자면 현재 내가 말한 음성 정보를 텍스트로 변환하여 이해하고, 그에 대한 뜻을 이해한 후, 적당한 답을 하게끔 하는 수준의 프로그래밍까지는 완성한 것이다.
그러나 이 상태로는 임의로 입력한 대로만 이야기할 수 있고, 별도의 유의미한 정보를 전달한다던지, 하는 등의 부가적인 기능은 담을 수 없었다. 이를 위하여 공공데이터포털에 있는 Open API 데이터를 실시간으로 불러와 이를 분석하고, 그에 맞게 적절한 정보를 제시하는 프로그램을 짜보았다. 크게 두 가지 데이터를 이용하였는데, 하나는 한국환경공단에서 제공하는 미세먼지 농도와 경보 발령 현황에 대한 데이터였고, 나머지 하나는 보건복지부에서 제공하는 코로나 19 관련 통계 누적 데이터였다. 이를 바탕으로 인공지능 스피커에게 ‘오늘 미세먼지 어때?’ 등의 문장(혹은 그와 유사한 의미의 문장)으로 질문하였을 때 미세먼지 농도와 경보 발령 유무 등의 결과값을 알려주는 서비스를 개발하였다. 또, ‘오늘/어제/그저께 코로나 확진자 수 알려줘’ 등과 같은 조건을 포함한 질문 역시 이해하고 그에 맞는 정보를 대답할 수 있도록 코드를 작성해보았다. 이런 Open API 데이터 이용의 경우 주기적으로 정보가 업데이트 되기 때문에 최신 정보를 받아 바로 전달할 수 있는 장점이 있어 다양한 서비스를 추가적으로 생성해내기 매우 유용하다는 생각이 들었다. 현재까지의 진행이 시연되는 결과물은 다음과 같다:
프로젝트를 마무리한 후, 머신러닝 알고리즘을 이용하여 데이터를 기반으로 다양한 예측 모델 등을 생성할 수 있지 않을까하는 생각도 들었다. 그러나 사실 인공지능 스피커의 경우, 어떤 모델을 예측한다는 기댓값보다는 기성의 정보를 즉각적으로 얻고 싶을 때 사용하는 경우가 아직까지는 지배적이다. 이 경우 머신러닝 알고리즘은 그리 큰 효과를 보지 못한다. 오히려 사용자와의 지속적인 대화를 통해 자연어 처리 알고리즘이나 추천 시스템 등에 사용하여 보는 것이 더 유용할 듯 싶다는 생각을 하였다. 여러 모로 현재까지 공부한 인공지능 코드나, 파이썬, unix 커맨드, CLI 환경 다루기, 전자 회로 설계하기, 알고리즘 등 다양한 분야의 지식들이 총체적으로 모여 하나의 결과물을 만들어냈다는 점이 참 뿌듯했다. 그러나 여전히 참 많은 시행착오를 겪고 스스로의 한계에 열을 받았던 것도 사실이다. 처음 파이썬 공부를 시작해보겠다고 컴퓨터라고는 문서작업 정도만 해봤던 내가 기를 쓰고 시작한 것이 작년 9월이다. 아직 컴퓨터 공부를 시작한 지 5개월. 배울 것이 너무나도 많다.
Comments