소프트웨어/iOS

SleepWithAI 개발 & 겨울방학 iOS 개발자 양성 프로그램 수료

충무로술겜마 2020. 2. 4. 21:34

저번달에 동국대에서 실시한 iOS 개발자 양성 특강에 참여했다는 글을 작성했었는데, 어제 (2/3) 그 길고도 짧았던 특강이 끝났습니다. 

 

특강은 코더스하이와 함께 총 7주간 진행되었으며, 약 4주간 Swift 문법과 Xcode 사용법, 그리고 여타 데이터 입출력 방법을 배우고, 나머지 3주간 팀 프로젝트를 진행했습니다.

 

팀을 짤때도 상당히 재밌는 방식으로 진행되었는데, 수업을 듣는 모든 학생이 각자 하나씩 어플리케이션 아이디어를 만들어, 스토리보드를 그리고 발표를 하는 방식으로 진행되었습니다. 그 아이디어 중 학생들이 각자 투표를 진행하여 3명이 되면 팀이 꾸려지는 방식이었는데, 제 경우에는 슬리피타임이라는 홈페이지를 참조하여 수면 싸이클을 사용한 수면 도움 어플리케이션을 만들자는 아이디어였습니다.

 

그런데 이번 특강은 Core ML을 사용하여 어플리케이션을 만드는게 목적이었기 때문에, 단순히 수면 싸이클을 측정하는 것 외에도 백그라운드 레코딩을 사용하여 사용자가 취침을 하는 동안 모든 소리를 녹음하고, 머신러닝을 통해 실시간으로 코골이와 잠꼬대를 구분하는 어플리케이션을 만들기로 프로젝트가 확장되었습니다. (사실 친구추가, 랭킹제도 도입 등 여러가지 아이디어가 많았으나 현실적으로 몇주 안되는 기간동안 만들기가 어렵다는 판단하, 프로젝트 사이즈를 많이 줄였습니다.)

 

결과적으로 이런 결과물이 나왔습니다! (사실 진짜 많은 일들이 있었는데, 막상 작성하려니깐 기억이 하나도 안나네요...ㅠ 매일 밤새면 이렇습니다...)

SleepWithAI (a.k.a. SWAI)

깃헙 레포지터리 주소: https://projectintheclass.github.io/SleepWithAI/

SleepWithAI Marketing Website: https://projectintheclass.github.io/SleepWithAI/

 

SleepWithAI

Sleeping Sound Data Analysis If you press 'Sleep Now' button, SWAI will start recording your sleeptalking & snoring sounds. With CoreML sound classificatoin machine learning model, SWAI will give you intuitive sleep quality indicators by daily & total char

projectintheclass.github.io

일단 SleepWithAI는 사용자를 일어나게끔 해야하는데, Apple은 현재 (iOS 13, Xcode11) 알람기능에 대한 공식적인 지원이 하나도 없습니다. (아이폰 내장 알람 어플리케이션 쓰라 이말인거죠 ㅋㅋㅋ) 그래서 대략 두가지 방법이 있습니다.

 

1. Push Notification에 Custom Sound를 집어넣어서 30초 미만의 음악을 들려준다

2. AVAudioSession을 사용하여 일정 트리거가 발동되면 음악 플레이어를 실행시킨다.

 

저는 바보같게도 1번 방식을 생각하고 코딩에 임하고 있었는데 1번 방식은 핸드폰이 방해금지 모드일때는 무력화 된다는 사실을 마감 하루전에 알았습니다. 진짜 패닉이었는데, 같이 프로젝트 해주신분이 2번 방식을 짜주셔서 겨우 넘겼던 것 같습니다.

 

그래서 결론적으론 2번 방식을 사용하여 알람 소리를 울렸습니다.

 

SleepWithAI 어플리케이션은 유저를 크게 두가지 방법으로 깨웁니다. 

 

1. Normal Sleep Mode 

말 그대로 보통 취침 모드입니다. 사용자가 어플리케이션을 키자마자 홈 탭에서 볼 수 있는 datePicker를 통해 다음날 일어날 시간을 정하고, Sleep Now 버튼을 누릅니다. 이 버튼을 누름과 동시에, 어플리케이션은 백그라운드 녹음을 실행하며, 매순간 들어오는 소리에 대한 분석을 행하고, Label로 Recognition 결과를 출력합니다. Recognition 결과값은 3가지입니다. background(아무 소리도 아닐때) / snoring (코골이) / sleeptalking (잠꼬대) 유저가 설정한 시간이 되기 30분 전부터는 recognition에 snoring 혹은 sleeptalking이 n초 이상 지속될 경우 얕은 잠을 잔다고 판단, 알람을 울려서 사용자를 깨웁니다. 

 

2. I Don't Care Mode

사실 저는 Do not Disturb (호텔 문걸이에 거는 그거) 모드라고 지을려고 했었는데, 이름 지을 당시에 DD가 생각이 안나서 그냥 I Don't Care로 정했습니다. 이 모드는 Normal Sleep Mode와는 정 반대의 위치에 있는 기능입니다. 사용자가 다음날 일어날 필요가 없는경우, 이 모드를 선택하면 어플리케이션이 백그라운드 녹음을 실행하고 Normal Sleep Mode와 똑같이 매 순간 들어오는 소리에 대한 분석과 출력을 합니다. 하지만 다른 점이 있다면 사용자가 설정한 시간이 없기 때문에, 어플리케이션에서 자동으로 사용자에게 맞춤화 된 알람을 제공할 수 있습니다. Sleep Foundation에 따르면 연령별로 권장되는 수면시간이 존재하기에 이를 기반으로 슬리피타임 홈페이지에서 제공하는 수식을 사용하여 사용자를 깨울 수 있도록 하였습니다. 

 

National Sleep Foundation Recommends New Sleep Times | National Sleep Foundation

FOR IMMEDIATE& RELEASE National Sleep Foundation Email: nsfmedia@sleepfoundation.org WASHINGTON, DC, (February 2, 2015)--The National Sleep Foundation (NSF), along with a multi-disciplinary expert panel, issued its new recommendations for appropriate sleep

www.sleepfoundation.org

 

어플리케이션을 키고 Sleep Now를 누르면 Normal Sleep Mode, I don't care를 누르면 I Don't Care Mode에 진입한다.

어플리케이션을 실행했을때 맨 처음으로 볼 수 있는 화면입니다. 단순히 datePicker와 Sleep Now, I don't care 버튼만을 사용하여 최대한 군더더기 없이 깔끔하게 만들려고 노력했습니다. 애플에서 제공하는 datePicker가 상당히 제약이 많아서 어쩔 수 없이 textField를 하나 더 만들어서 좀 더 잘 보이게 만들었고, 겸사겸사 textField의 밸류값을 참조하여 알람함수에서 사용하는 방식으로 만들었습니다. 

I Don't Care Mode에 진입시 만약 userDefaults에 사용자 나이가 저장되어 있지 않다면 설정하라는 권장메세지를 띄운다.

원래는 I Don't Care Mode에서 유저의 성별, 나이, 기타 정보를 다 받아서 분석하려고 했으나 시간부족으로 일단 나이 정보만 받기로 했습니다. 나이에 따른 수면 권장량에 얕은잠과 깊은잠을 자는 싸이클 공식을 대입하여 최적의 시간에 깨우게 됩니다.

Sound Classification을 사용하여 분석을 하고 데이터배열에서 출력을 가져온다

Sleep Now 버튼을 누르면 자동적으로 백그라운드 녹음이 켜지고 매 순간 데이터가 분석/저장됩니다. 그리고 실시간으로 코골이와 잠꼬대 분석결과를 띄워주게 됩니다. 사용자는 충전기에 폰을 꽂고 침대 옆에 두기만 하면 됩니다. 

Daily / Total 세그멘트 뷰로 측정한 데이터를 확인 할 수 있다.

Realm을 사용하여 데이터를 저장하고 이 데이터를 통해 차트로 그립니다. Daily / Total 세그멘트 뷰가 있고 사용자는 테이블 뷰를 터치하여 상세한 정보를 알 수 있습니다.

 

어플리케이션 시연 동영상

 

 

7주간, 길고도 짧았던 특강이었습니다. 많은걸 배워갑니다.

마치며...

 

사실 이번 겨울방학은 혼자 코틀린을 배워서 안드로이드 어플리케이션을 만들어보는게 목표였습니다만, 정말 운이 좋게도 iOS 개발자 양성 특강에 참여할 수 있었고 (원래는 참여자 명단이 꽉 차서 대기자 명단에 있었는데 마지막에 추가로 참가하게 되었습니다.) 정말 또 운이 좋게도 같은 동아리, 같은 과 컴퓨터공학과 선배님들과 함께 프로젝트를 할 수 있었던 것 같습니다. 아무래도 공통점이 있다보니 아무것도 모르는 분이랑 하는 커뮤니케이션과는 많이 달랐겠지요. 

 

사실 저는 C언어 외에는 별로 자신이 없습니다. 맨날 절차적인 프로그램만 짜다보니 머리가 굳은거 같기도해요! Swift는 함수형 프로그램이긴 하지만 일단 OOP니깐 구조체와 클래스의 활용이 적절하게 필요한데, 그 부분에 대해서 제가 정말 미흡했다고 봅니다. 아마 제가 짠 코드는 문법만 C로 바꾸면 C언어에서도 그대로 돌아갈거에요;;... 

C언어처럼 짜다보니 실행에는 문제가 없어도, 코드와 코드간에 의존성이 너무 많이 생깁니다. 만약에 한 함수에서 뭔가 하나 고장나면 그 임팩트가 겉잡을 수 없이 넓게 퍼지더라구요... 당분간 C++ 공부할텐데 OOP에 대한 공부를 열심히 하겠습니다.

 

저는 알람 시스템을 만드는걸 주로 했는데, 제가 믿고있던 옳은 길이 다른 팀원분들이 생각하는거랑 너무 달라서 (내가 생각하던 길이 틀린길임을 뒤늦게 알았을 때) 멘붕이 오고 좀 힘들었기도 했는데, 그래도 선배님들이 도와주셔서 감사히 별 탈 없이 끝난 것 같습니다.

 

사실 작년부터 방학을 보낼때마다 매일 재미없는 아르바이트만 하고 아무것도 안했다는 자괴감이 들어서 힘들었는데, 바쁘게 사니깐 그만큼 뿌듯하긴 하네요. 이게 다 제 피와 살이 되는 경험이 되리라 믿어 의심치 않습니다.

'소프트웨어 > iOS' 카테고리의 다른 글

"SleepWithAI"가 애플 앱스토어에 올라갔습니다!!  (0) 2020.02.14