안녕하세요
Cochl에서 Developer Relations Manager를 맡고 있는 장민서 입니다.
최근에 사용하는 ‘밥친구'라는 단어를 아시나요? 함께 밥 먹는 친구가 아닌 식사하면서 보는 방송이나 영상을 말합니다. 1박 2일, 무한도전 등 다양한 방송들이 현대인의 밥친구가 되어주고 있는 오늘날! 저도 집에서 점심 먹으면서 보던 유튜브 클립 하나에 꽂히게 되었습니다.
바로 유해진 씨의 반려견 ‘겨울이'가 나온 삼시세끼 고창 편입니다. 본인의 반려견인 겨울이가 보이지 않자 유해진 씨가 ‘안돼! 안돼 일루와!’ 하면서 겨울이를 부릅니다. 그러자 바로 눈에 보이지 않던 겨울이가 득달같이 유해진 씨에게 달려오는데요, 이걸 보면서 주인이 근처에 있지 않아도 주인의 목소리가 들리면 강아지나 고양이가 반응할까? 라는 생각이 들었습니다.
후후, 그렇게 저의 호기심을 함께 해결 해줄 분들을 찾아나서기 시작했습니다.
[제 1장 : 우리의 얼레벌레 계획]
때마침 우리 회사가 세상에 있는 모든 소리를 인식할 수 있는 Sound AI 기술을 개발하고 있고, 우리 팀에는 고양이를 키우는 개발자분이 계셨을 뿐입니다 
팀에서 고양이 4마리를 모시고 있는 개발자분을 호출! 아주 간단하게 짜인 제 아이디어를 설명해 드렸습니다. 그리고 독립적인 개체라고 알려진 고양이도 집에 혼자 있으면 분리불안을 느낄 수 있고, 그럴 때 강아지가 하울링 하듯 고양이도 소리를 낸다는 정보도 함께 입수했습니다. 흠, 그렇다면 고양이가 불안해할 때 주인이 없어도 주인의 목소리가 들린다면 고양이를 진정시킬 수 있지 않을까요?
우선 개발자 한 분은 포획에 성공했으니, 현재 제공되고 있는 Cochl.Sense 서비스에 고양이나 강아지 소리를 탐지할 수 있는 기능이 있는지 확인해봐야 했습니다. 서비스 되는 Cochl.Sense에는 24가지 소리만 탐지할 수 있으나, 내부적으로 보유하고 있는 소리 클래스는 수 백 가지로 알고 있기에 이를 정확하게 알고 있는 분이 프로젝트에 필요했습니다.
마침 라즈베리 파이를 이용해 레퍼런스 디바이스에 Cochl.Sense를 탑재하는 프로젝트를 진행하고 계시는 최적의 리서쳐 분을 발견하여 급하게 섭외에 성공하였습니다 :) 그렇게 이 원대한 프로젝트의 첫 삽을 뜨게 된 거죠.
아주 간단하게 나타내 본 프로젝트 도식화
저희가 생각해 낸 프로젝트의 흐름은 다음과 같았습니다.
//프로젝트 흐름
1) 집에 혼자 남겨진 고양이가 불안한 나머지 ‘야옹'하고 운다.
2) 라즈베리 파이로 고양이 울음소리를 인식할 수 있는 디바이스를 만들어 울음소리를 인식하게 한다.
3) 고양이 울음소리를 인식하면 앱으로 신호를 날리고, 앱 사용자가 알림을 받을 수 있게 한다.
4) 사용자는 앱 내 버튼을 눌러 미리 녹음해 둔 목소리를 재생한다.
5) 고양이는 디바이스에 나오는 주인의 목소리를 듣고 편안해진다.
HTML
복사
해당 프로젝트를 진행하기 위해 크게 2 부분으로 나눴습니다. 리서쳐인 상민님께서 Sound AI와 디바이스를 다루는 부분을 맡고 백엔드 개발자인 문성님께서 앱 개발을 담당해주셨습니다. 그럼 간단하게 어떤 과정을 거쳐서 프로젝트가 진행되었는지 보여드리겠습니다.
[제 2장 : Device, Connectivity, and Cat]
안녕하세요, ‘고양이는 야옹야옹하고 웁니다’ 프로젝트에 참여한 리서쳐 이상민입니다. 일단 프로젝트의 전제 조건 중 하나는 고양이 울음소리를 인식하는 것입니다.
우리 회사의 Sound AI 기술인 Cochl.Sense에 고양이 울음소리를 인식하는 기능이 있고, 간단하게 이런 식으로 작동되는 것을 비디오를 통해 확인해볼 수 있습니다. 이를 통해 고양이 울음소리를 인식하는 데는 아무 문제가 없다는 것이 증명되었습니다.
저희의 원대한 계획에 따르면 고양이 울음소리를 인식하는 기기가 있고, 기기는 사용자에게 알림을 보내야 합니다. 그렇게 되기 위해 울음소리를 인식하는 기기는 무조건 인터넷에 연결되어있어야 했습니다. 인터넷에 연결에는 2가지 방법이 있습니다 - 1) 유선 연결 (Ethernet), 2) 무선 연결 (Wifi).
고양이 울음소리 인식용으로 사용한 기기는 Raspberry Pi Zero로 쉽게 말해 초소형 컴퓨터라고 보시면 됩니다. 이 기기를 통해 다양한 IoT 서비스를 운영할 수 있습니다. 아쉽게도 이 기기는 유선 연결이 불가능한 모델이었기에 와이파이를 연결하는 것이 유일한 방법이었습니다.
이 기기를 가령 제가 사는 집에 설치하기 위해서는 저희 집에 있는 와이파이 이름과 패스워드를 알고 있어야 합니다. 하지만 사람들이 다 똑같은 와이파이를 사용하고 있지 않기 때문에 환경에 따라 하드코딩을 해야 하는 어려움이 있었습니다. 사용자들이 어느 환경에서든 본인의 무선인터넷 환경에 연결할 수 있게 하려면 상용 IoT 기기처럼 쉬운 와이파이 세팅은 필수적이었습니다. 그래서 최선을 다해 이런 방식을 구현해 보았습니다.
라즈베리파이를 AP모드로 작동시키면 라즈베리파이가 마치 공유기처럼 작동하여 사용자의 모바일 기기가 와이파이를 통해 라즈베리파이에 접속할 수 있습니다. 접속 시 주변 공유기의 아이디와 패스워드를 입력할 수 있는 창을 보여주고 모바일 기기에서 공유기의 아이디와 패스워드를 입력해주면 외부 공유기에 연결이 되게끔 하는 구조로 구현했습니다. 이 작업은 생각보다 쉽지는 않았습니다. 사용자들이 사용하기에도 원터치로 모든 것이 해결된다던가 간단하게 할 수 있는 방법은 아니었으나, 문제를 해결하기 위해서 저희가 할 수 있는 가장 나은 방법이라고 생각되었습니다.
이제 와이파이가 연결되었으니 고양이 울음소리를 인식할 때 알림을 보내야 합니다. HTTP 방식을 사용하면 요청을 보낼 시 응답 받게 됩니다. 그러나 고양이 울음소리가 없을 때도 계속해서 요청하고 응답을 받는 것은 비효율적이라고 느꼈습니다. 이벤트가 발생했을 때만 메시지를 주어야 하는 것이 핵심이었기에 토픽 기반의 Pub/Sub 방식을 이용하기로 했고, 그중 제가 사용해본 방법 중 가장 간단한 MQTT 방식을 사용해보았습니다.
이 방식을 통해서는 특정 토픽을 subscribe (구독)한 모든 클라이언트한테 메시지를 발송합니다. MQTT는 일대다로 메시지 전송이 가능하지만, 저희 시나리오에 기반한 기기에 대해서만 알림을 주는 1대 1 방식으로 동작하게끔 했습니다. 이러한 MQTT 서비스를 구축하기 위해 모스키토라는 MQTT 브로커 서비스를 사용했습니다.
아까 말씀드렸듯이 토픽 기반으로 작동되기에 라즈베리파이라는 토픽을 구독하고 앱에서는 앱이라는 토픽을 구독합니다. 고양이 울음소리가 발생했을 때 앱 토픽으로 메시지를 발송하면 앱 토픽을 구독하고 있는 어플리케이션에서는 알림을 받을 수 있습니다. 어플리케이션에서 알림을 받고 버튼을 누르면 Rpi(라즈베리파이) 토픽으로 퍼블리시 메시지를 날리게 됩니다. 그러면 Rpi 토픽을 구독하고 있는 기기로 메시지가 날아가게 되고, 사용자가 이미 녹음한 음성을 재생하게 됩니다.
여기까지 나름의 소프트웨어를 구축하기도 굉장히 어려운 과정이었지만 저희에게 넘어야 할 산이 하나 더 있었으니 그것은 바로 ‘케이스'였습니다. 저도 예쁘게 3D 프린터로 만들고 싶었지만 그러기엔 변수가 너무 많아 납땜과 톱질로 다져진 가내수공업 방식을 택하게 되었습니다. 그것이 토이프로젝트의 참 맛 아니겠어요?
투박해보여도 성능하나는 끝내줬습니다.
보시면 아시겠지만 이미 판매되고 있는 틴케이스를 구해 직접 잘라 나사못을 박고 라즈베리파이를 고양이의 공격으로부터 안전하게 지키기 위한 모든 준비를 끝냈습니다. 라즈베리파이와 스피커, 마이크 기능을 하는 모듈을 함께 붙여 제작했습니다.
하드웨어는 준비가 되었으니 앱이 어떻게 구현되었는지 설명하겠습니다.
[제 3장 : Flutter 단기간에 활용하기]
다음으로 앱을 담당하게 된 저는 Cochl에서 백엔드를 맡은 정문성입니다.
저는 사실 백엔드 개발자라 앱 개발에 익숙하지 않습니다. 그런데 눈 떠보니 토이프로젝트 내에서 앱 개발을 담당하게 되었고, 단기간에 새로운 기술을 익혀 앱 개발을 해야 했습니다. 우선 어떤 기술을 쓸지 인터넷에 검색했는데, 근래에는 ‘플러터(Flutter)’라는 재미있는 기술이 있는 것을 발견했습니다. 특히나 개발 기간이 다른 기술에 비해서 짧다는 점에 혹해 플러터를 사용해 앱 개발을 하기로 했습니다.
엄청나게 단축되는 개발 기간!
새로운 기술을 습득하기 위해 우선 서점으로 가 가장 얇은 책인 ‘플러터를 익히는 가장 쉽고 빠른 책'을 구매해 간단하게 훑어보았습니다. 단순히 플러터가 어떤 프레임워크고, 개발 환경을 어떻게 구축해야 하는지 그리고 플러터의 코드는 어떤 형태로 구성되는지 감을 익히기 위함이었습니다. 지금 당장 플러터를 정복한다기 보다는 필요한 기능만 습득해 앱을 만드는 것이 목표였기에 이 정도로 충분하다고 생각했습니다.
그리고 앱에 필요한 기능의 예제를 모으기 시작했습니다. 예제들이 잘 돌아가는 것을 확인해본 뒤 조합한다면 우리가 원하는 앱을 만들 수 있지 않을까 하는 긍정 회로를 돌리며 개발해나갔습니다. 결국에는 시간에 쫓겨서 앱을 만들다 보니 너무 막 만든 게 아닐까 하는 아쉬움이 남긴 했습니다.
그리고 플러터가 다른 기술들에 비해 다소 신생 기술이다 보니 스택오버플로우나 인터넷에 자료가 생각보다는 많이 존재하지 않았습니다. 그래서 깃헙을 애용하게 되었습니다. 예를 들어 플러터의 특정 메소드에 대해 사용 방법을 알고 싶다면 그 메소드의 이름을 깃헙에 검색해 실제로 동작하는 코드를 게시해놓은 글들을 찾아봤습니다. 그런 식으로 스택오버플로우와 깃헙을 참고해 앱을 완성해 나갔습니다.
모든 준비가 완료된 후 저희 집에 있는 4마리의 고양이와 테스트를 진행했습니다.
처음에는 고양이들이 제 목소리에 잘 반응 해줬습니다만 한 가지 간과한 부분이 있었습니다. 고양이가 울었을 때 들려주는 제 목소리를 딱 1개의 예제만 녹음해둔 나머지 나중에는 고양이들이 제 목소리에 익숙해져서 목소리가 들려도 울음을 멈추지 않았습니다. 이 부분은 여러 개의 예제 샘플을 만든다거나 실시간으로 들려주는 기능을 추가하는 등의 보완이 필요해 보였습니다. 아래 동영상에서 실제로 어떻게 작동하는지 보실 수 있습니다.
[제 4장 : 이거 비즈니스화 할 수 있을까?]
소프트웨어부터 하드웨어까지 모든 것을 총망라하는 프로젝트가 이렇게 끝났습니다. 하지만 토이프로젝트로 진행하다 보니 ‘실현 가능성'에만 초점을 맞추게 되었고, 세세한 구현까지는 기간 내에 마치기가 어려웠던 점이 마음에 남습니다.
가령 앱 부분에서는 코드 최적화와 리팩토링 / 모바일 백그라운드 실행 / UI 개선 등의 작업이 아직 남아있고, 디바이스 측면에서는 LED Indicator를 부착한다던가 WebRTC를 통한 실시간 통화 기능, 그리고 예쁜 케이스 등이 아직은 숙제로 있습니다.
그렇지만 우리 회사가 가지고 있는 Sound AI 기술을 좀 더 친숙하게 풀어낼 수 있는 작업이었기에 이런 식의 프로젝트도 번외로 계속 진행하면 좋겠다고 느꼈습니다.
마지막으로 저희가 이 프로젝트를 하면서 느낀 점과 배운 점을 간단하게 공유합니다.
상민님의 느낀 점과 배운 점
- Machine Listening 기술 파이팅!
- 우리가 개발한 AI를 실제로 활용해 볼 수 있는 의미 있는 프로젝트였다.
- 다양한 messaging 방식을 활용해보고 싶다.
- (화면이 없는 환경에서의) UX는 어렵다.
문성님의 느낀 점과 배운 점
- 플러터 프레임워크를 사용하면 빠르게 앱 개발이 가능하다는 것을 몸소 느꼈다.
- 하나의 코드 베이스로부터 여러 플랫폼으로 컴파일 되다 보니, 몇몇 기능에 제약이 있는 것이 아쉬웠다.
- 토이 프로젝트를 통해 재미있는 기술 하나를 배울 수 있어서 의미 있었다.
저희가 만든 고양이 프로젝트를 비롯해 어떤 서비스를 진행하고 있는지 궁금하신 분들을 위해 아래 이번 프로젝트에서 사용되었던 소스 코드 및 Sound AI를 체험해볼 수 있는 웹사이트 링크도 남깁니다.
•
Github 소스 코드
•
Cochl.Labs