SMART MIRROR 제작기 #END

in kr-dev •  7 years ago 

그동안 연제했던 SMART MIRROR 제작기를 어느정도 완성하여 마지막으로 근황을 올리려고 합니다.

사용

Library

  1. Jsoup
  2. OkHttp
  3. AutofitTextView
  4. otto

API

  1. DarkSky
  2. ip-api

그외

  1. Google New Rss

전체 과정

계기

처음 시작은 몇년 전 뉴스에 나온 Smart Mirror 에 관한 글My Bathroom Mirror Is Smarter Than Yours입니다.

당시 '오…... 저런것도 있구나….' 생각하였고 따라서 해보고 싶었지만 당시 저는 군복무 중 이었고 그렇게 기억 한편으로 사라지게 되었습니다.

그리고 전역 후 학교를 다니던 중 우연히 다시 그 내용을 보게 되었고 이번에는 한번 해보자고 생각하여 틈틈히 만들어보게 되었습니다.

과정

들어가며

사실 smart mirror는 전세계에서 많은 개발자들이 Raspberry Pi를 활용하여 만들고 있습니다. Youtube 등에서 다양한 형태의 거울이 나오고 있는데 대부분은 대형 모니터에 반사 필름을 붙여서 만드는 형태 입니다. 즉, 프로그램 자체는 거울과 전혀 관계가 없으며 빈 화면에 정보만 표시하는 형태 입니다.

하지만 저는 모니터와 반사필름을 살 여유가 없었기 때문에 스탠드형 거울이 아닌 탁상거울 컨셉으로 스마트폰, 태블릿에서 작동하는 형태로 만들기로 하였습니다. 그래서 제 smart mirror는 반사필름이 아닌 기기의 카메라가 거울 역할을 하게 되었습니다.

이렇게 컨셉을 정하니 이전에 봤던 google의 android vision이 생각나서 예제 중 하나인 Face Tracker의 happiness 측정을 합칠 수 있지 않을까 싶었고 (이때 그만뒀어야 했는데….) happiness에 따라 인사말이 달라지게하는게 최종 목표중 하나가 되었습니다.

목표 정하기

위의 과정을 거치며 다음과 같은 목표를 설정했습니다.

  1. 날씨 표시
  2. 현재 시간
  3. 기분에 따른 인사말 변경
  4. 뉴스 표시
  5. 다국어 지원
  6. TTS 지원

구현

날씨 구현

날씨를 구현할때 다음과 같은 준비가 필요했습다.

  1. 현재 위치의 좌표 구하기
  2. 좌표의 날씨 구하기

Android의 Location Service를 사용하려면 위치관련 권한을 추가해야 하는데 가능하면 권한 확인 부분은 피하고 싶었습니다. 그래서 ip-api를 통해서 좌표 정보를 받아왔고 이를 darksky의 api를 활용해서 날씨 정보를 받아왔습니다. 정리하자면 순서가 다음과 같습니다.

  1. ip-api를 통해 ip주소의 좌표 받아오기
  2. darksky의 api를 통해 1번에서 받아온 좌표의 날씨 받아오기
  3. 화면에 표시

여기서 기상청의 api를 사용하지 않은 이유는 다국어 지원을 고려하고 있었기 때문입니다. 국내, 국외를 별도로 구현하는 것 은 바람직하지 않다고 생각하여 전세계 날씨 정보를 제공하는 darksky의 api를 사용하였습니다.

마침 날씨 표시에 사용한 ip-api와 darksky모두 json형태로 값을 반환해주고 있었으며 이전에 json을 다뤄봤기 때문에 JsonObject를 이용하여 수월하게 작업할 수 있었습니다. 하지만 이 과정에서 데이터를 못 받아오는 현상이 있었는데 이는 위치조회와 날씨조회를 분리하여 구현하여 발생한 문제였으며 하나의 asynctask로 구현하였더니 사라졌습니다. 아마 위치정보 조회에서 문제가 있었지 않나 생각하고 있습니다. 하지만, 이렇게 끝난줄 알았으나 이 다음엔 네트워크 상태가 안좋을경우 표시까지 상당시간 지연되는 현상이 있었으며 이 때문에 카메라의 프리뷰가 보여질 때 까지 지연이 심해졌습니다. 그래서 asynctask로 변경하였고 카메라 프리뷰까지의 지연시간을 단축시킬 수 있었습니다. 역시 네트워크 작업은 비동기로 하는게 좋지 않나 싶은데 다른 상황에서는 어떨지 모르겠습니다.

인사말 표시

인사말 표시의 핵심은 기분에 따른 메시지 변경인데 베이스로 사용한 예제에서는 메인 액티비티에서 해당 값을 받아오기 어려운 구조 였습니다.(제 실력에서는) 그래서 otto를 사용하였는데 얼굴 인식시 호출되는 메소드에서 publish하면 메인 액티비티에서 subscribe하는 구조로 해결하였고 얼굴인식이 실시간인 만큼 30초에 한번만 체크하게 하여 반복적인 인사말 출력을 제한하였습니다.

뉴스 표시

뉴스의 경우 가장 간단한 부분이었는데 언론사의 선정이 가장 큰 문제였습니다. 언론사마다 성향이 있고 특정언론사를 싫어하는 분 들도 계셔서 결국 구글 뉴스의 RSS피드를 활용하였습니다. 날씨와 마찬가지로 요청 후 Jsoup파싱으로 처리하였습니다.

시간 표시

그냥 안드로이드에서 지원하는 위젯 추가로 해결했습니다. 이게 제일 간단하더라고요

텍스트 사이즈 조정

다양한 기기에서 구동을 목표로 했기 때문에 텍스트 사이즈는 어느정도 중요한 문제였습니다.

특히 뉴스의 경우 헤드라인이 길 수 록 2줄, 3줄로 개행되는 문제가 심했는데 이는 AutofitTextView 라이브러리로 해결했습니다. 개인적으로 자주 사용하는 라이브러리고 추후 직접 만들어보려고 합니다.

TTS

TTS (Text To Speech)의 경우 여러 라이브러리가 있습니다. 외국 라이브러리도 있고 국내 라이브러리도 존재합니다. 이들 라이브러리는 기기에 내장된 TTS보다 나은 성능을 보여 줄 때도 있지만 한가지 걸리는 점 은 네트워크를 사용한다는 것 입니다. 물론 사용 환경을 네트워크가 되는 환경으로 했지만 추후 유지보수, 별도의 설치, 용량 문제, 호환성 등을 생각해서 기기 기본 TTS로 결정하였습니다.

시연

처음 실행시 화면

처음 실행 화면

얼굴 인식시 화면

얼굴 인식시 화면

향후 목표

  1. Google Speech API
  2. 레이아웃 개선
  3. Calendar 추가
  4. 그외....

후기

스마트거울은 참 매력적인 토이 프로젝트입니다. 이것저것 사용해보고 직접 만들경우 자신에게 커스텀 할 수 있는점이 매력적이죠. 나중에 여유가 생기면 스탠드 거울로 만들어서 아침마다 개인화된 브리핑을 받는게 목표입니다.

오픈소스로 공개된 스마트 거울도 많으니 관심있으신분은 직접 돌려보시는것 도 괜찮을듯 합니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!