본문으로 건너뛰기

© 2026 Molayo

HN분석2026. 05. 15. 12:31

밤에 나를 깨우는 것이 무엇인지 알아내기 위해 AI로 도구를 만들게 한 이야기

요약

작가는 수면 중 깨는 원인을 파악하기 위해 AI 도구를 활용하여 개인적인 스마트 홈 모니터링 시스템을 구축했습니다. 이 시스템은 기존의 센서 데이터(모션, 문, 온도 등)와 Garmin 워치에서 가져온 수면 단계 데이터를 통합하고, 추가된 마이크를 통해 녹음된 소음 이벤트 데이터를 결합합니다. 최종적으로 웹 앱 형태로 모든 데이터를 시각화하여, 사용자가 밤에 깨어난 특정 순간의 맥락을 쉽게 검토할 수 있도록 돕습니다.

핵심 포인트

  • AI 도구 덕분에 복잡한 개인 프로젝트(스마트 홈 통합)를 주말 안에 현실적으로 구현할 수 있었습니다.
  • 수면 중 각성 원인 파악은 소리, 수면 단계, 센서 이벤트 데이터를 종합적으로 분석해야 합니다.
  • 시스템은 Home Assistant와 Raspberry Pi를 기반으로 하며, 오디오/수면 데이터/센서 이벤트를 하나의 웹 앱에서 통합하여 시각화합니다.
  • 웹 앱은 PWA(Progressive Web App) 형태로 홈 네트워크 내부에서만 서비스되어 개인 정보 보호에 강점을 가집니다.

나는 삶의 질에 영향을 미치는 작은 것들에 주의를 기울이려 노력한다. 무언가가 계속 나를 괴롭힐 때, 나는 그것을 조사하고, 가능성 있는 원인을 찾아내어 조치를 취하고 싶어 한다.

최근에 변한 점은 그것을 지원하기 위해 내가 기꺼이 만들고자 하는 것이다. AI 도구(AI tooling) 덕분에, 몇 년 전이라면 "보상에 비해 노력이 너무 많이 든다"며 무시했을 프로젝트들이 이제는 주말 안에 끝낼 수 있는 수준이 되었다. 그래서 일상생활에서 문제에 부딪힐 때마다, 나는 "사실, 이걸 조사하기 위한 무언가를 만들 수 있겠는데"라고 생각하는 자신을 발견하곤 한다.

이 포스트는 그러한 문제 중 하나인 나의 수면에 관한 이야기다.

문제

나는 시끄러운 도시에 산다. 어떤 밤에는 무엇 때문에 깼는지 전혀 모른 채 새벽 3시에 깨기도 한다. 어떤 밤에는 완전히 깨지는 않지만, 다음 날 아침 내 워치가 새벽 3시 32분에 무언가가 나를 깊은 수면(deep sleep)에서 끌어냈음을 보여주기도 한다.

좌절스러운 부분은 그 원인이 무엇인지 거의 알 수 없다는 점이다. 소리가 당신을 깨울 때, 당신의 뇌는 여전히 어떤 수면 단계(sleep stage)에 있었는지에서 벗어나는 전환 과정에 있으며, 제대로 다시 작동하기까지는 시간이 걸린다. 무슨 일이 일어나고 있는지 인지할 때쯤이면 소음은 이미 사라진 상태다. 소리가 반복되거나(천둥, 멈추지 않는 자동차 경보음) 나중에 단서를 남기지 않는 한(쾅 하는 소리 뒤에 이어지는 번개 섬광), 당신은 혼란스러운 상태로 깨어나게 되고 원인은 미스터리로 남는다.

그리고 원인을 명시하지 못하면, 그것을 해결할 수도 없다. 집 안이었을까? 밖이었을까? 이웃이었을까? 트럭이었을까? 문이었을까? 당신이 시도하는 모든 "해결책"은 그저 추측일 뿐이며, 추측은 비용이 많이 드는 경향이 있다.

그래서 나는 임무를 수행하기로 했다 😏

내가 만든 것 (개요)

먼저 배경 설명을 하나 하자면: 나는 이미 Home Assistant와 집 안 곳곳의 다양한 센서들 *(모션, 문, 조명, 온도, 습도, CO₂, 공기질)*를 이용한 스마트 홈 설정을 갖추고 있다. 이 프로젝트에 필요한 데이터의 상당 부분은 이미 수집되고 있었다. 나는 오디오 부분만 추가하고, 나의 수면 데이터를 가져와서, 모든 것을 하나로 연결하기만 하면 되었다.

나는 몇 가지만 추가하면 되었다:

  • 저렴한 USB 마이크 두 개: 하나는 집 안에, 다른 하나는 거리를 향한 창문 밖에 설치
  • Raspberry Pi (마이크로 컴퓨터): 내가 집에 있고 침대에 있을 때만 소리를 듣는 역할 - Garmin 워치로부터 가져온 수면 데이터
  • 오디오, 수면 데이터, 그리고 기존의 센서 이벤트(sensor events)를 결합하는 홈 랩(home lab) 상의 웹 앱 (web app)

Pi가 흥미로울 정도로 큰 소리를 감지하면, 전후 몇 초간의 맥락을 포함한 짧은 클립을 저장합니다. 전체 감지 모드는 Home Assistant에 의해 제어됩니다. Pi는 Home Assistant 통합(integration)으로 노출되며, 자동화(automation)를 통해 내가 집에 있고, 침대에 있으며, 평소 수면 시간대일 때만 활성화됩니다. 이 조건들을 벗어나면 완전히 비활성화되어 마이크 접근이 전혀 이루어지지 않습니다. 이것이 바로 내가 원했던 동작이었으며, 내 개인 홈 네트워크 상에서도 마찬가지입니다.

실질적인 유용함은 웹 앱(web app)에서 발생합니다. 매일 밤의 데이터는 음악 편집기의 트랙처럼 나열됩니다. 수면 단계(sleep stages)를 위한 트랙 하나, 심박수(heart rate)와 HRV(심박 변이도)를 위한 트랙 하나, 센서 이벤트(sensor events)를 위한 몇 개의 트랙, 그리고 오디오가 로드된 소음 이벤트(noise events)를 위한 트랙 하나가 있습니다.

단연코 가장 유용한 기능은 내 수면 단계가 바뀌거나 잠에서 깨어난 순간을 시각적으로 표시해 주는 방식입니다. 이것이 시작점입니다. 나는 밤의 데이터를 훑어보며 강조된 순간들 *(빨간색으로 표시됨)*을 찾아 클릭하여 들어봅니다.

한 가지 더 멋진 점은, 프론트엔드(frontend)가 웹 푸시(web push) 기능이 있는 프로그레시브 웹 앱(progressive web app)이며, 오직 내 홈 네트워크 내부에서만 서비스된다는 것입니다. 내가 잠에서 깨어 휴대폰을 확인하는 순간, 어젯밤의 데이터를 검토할 준비가 되었다는 알림을 받습니다. 어떤 데이터도 네트워크를 벗어나지 않는데, 이 점이 정말 마음에 듭니다.

AI가 한 일과 하지 않은 일

기대를 명확히 하기 위해 말씀드리자면, AI는 내가 이것을 주말 동안 현실적으로 구축할 수 있게 해준 핵심 요소였습니다. 전체 작업에는 대략 8시간의 노동이 소요되었고, 이후 며칠 동안 몇 가지 작은 개선 작업이 추가되었습니다. AI 도구(AI tooling)가 없었다면 나는 시작조차 하지 않았을 것입니다.

하지만 저는 실제 소리를 식별하는 데 AI를 사용하고 있지는 않습니다 (적어도 아직은 말이죠). 문 소리인지, 그릇 소리인지, 아니면 오토바이 소리인지 인식하는 듣기 작업은 여전히 헤드폰을 쓴 제가 직접 하고 있습니다. 도구는 단지 제가 들어볼 가치가 있는 순간들을 가리켜 줄 뿐입니다.

그리고 워크플로우(workflow)에 대해 말씀드리자면, 저는 코드를 읽지 않았습니다 (의도적인 선택이었습니다). 저는 결과를 테스트하고, 무언가 잘못되었을 때 직접적인 피드백을 주었으며, AI가 제 브라우저에서 실행 중인 앱의 스크린샷을 찍게 함으로써 스스로의 출력물을 검증하도록 했습니다.

마이크로 컴퓨터(micro-computer) 측면에서는 한 단계 더 나아갔습니다. Raspberry Pi는 완전히 새로 설치된 빈 상태였기에, 코딩 에이전트(coding agent)에게 SSH 접근 권한을 주고 장치에서 직접 테스트하도록 했습니다. 에이전트는 실험을 설정하고, 저에게 소리를 지르거나, 물건을 떨어뜨리거나, 주방 수도꼭지를 틀어달라고 요청한 뒤, 샘플을 녹음하고, 이를 분석하여 때로는 스펙트로그램(spectrograms)을 추출해 주기도 했습니다. 저는 이것이 이런 방식으로 작동하기를 원한다고 명시적으로 말해야 했지만, 일단 지시가 내려지자 반복 루프(iteration loop)는 솔직히 꽤 재미있었습니다.

제 개인 하드웨어에서 실행되는 개인 프로젝트로서, 이 모든 설정만으로도 충분했습니다.

여기서 흥미로운 변화는 AI가 제 문제를 해결했다는 점이 아닙니다. AI가 제가 스스로 문제를 해결할 수 있게 해주는 '무언가'를 만드는 비용을 낮춰주었다는 점입니다.

수면 데이터에 관한 참고 사항

저는 Garmin* 시계에서 수면 데이터를 가져옵니다. 모든 시계와 스마트 링(ring)은 수면을 계산하는 방식이 조금씩 다르며, 솔직히 말해서 특정 순간에 제가 정확히 어떤 수면 단계에 있었는지에 대해서는 그 어떤 것도 완전히 신뢰하지 않습니다.

하지만 그들이 모두 상당히 잘하는 것은 당신이 실제로 언제 깨어났는지를 감지하는 것입니다. 그러한 각성 이벤트(wake events)와 단계 사이의 대략적인 전환이 제가 여기서 실제로 관심을 두는 부분입니다. 그것들은 임상적인 진실은 아닙니다. 그것들은 저에게 "이 순간은 조사해 볼 가치가 있다"라고 알려주는 시각적 표식(visual markers)입니다. 그것들이 없다면, 저는 냉장고가 웅웅거리는 소리나 이웃이 별다른 일을 하지 않는 몇 시간 동안의 오디오를 그냥 앉아서 듣고 있어야 했을 것입니다.

저는 수면 과학을 하려는 것이 아닙니다. 저는 가끔 아침에 저를 기분 나쁘게 만들었던 원인이 무엇인지 찾으려는 것입니다.

내가 발견한 것, 그리고 그에 대해 내가 한 일

이것을 실제로 사용하기 시작하자, 패턴이 빠르게 나타났습니다. 흔한 원인들은 다음과 같았습니다:

문. 이웃집 문이 쾅 닫히는 소리, 혹은 아파트 안의 누군가가 화장실에 가면서 문을 특별히 조심스럽게 다루지 않는 소리.
설거지. 우리 집 주방이든 이웃집이든, 아파트 전체에 놀라울 정도로 잘 전달되는 높고 날카로운 소리가 납니다.
거리. 오토바이, 스쿠터, 트럭, 그리고 지나가는 쓰레기 수거 차량.
(제가 사는 나라가 어디인지 맞춰보세요)

  • 가끔은 외부 소음이라고 생각했던 것이 내부의 것이었거나, 그 반대인 경우도 있었습니다.

실제 데이터를 통해, 저는 마침내 추측하는 대신 어느 정도 확신을 가지고 조치를 취할 수 있었습니다:

  • 적절한 음향 패널 (Acoustic panels)을 추가했습니다
    (회의 공간을 만들기 위한 IKEA의 사무실용 제품이 놀라울 정도로 효과가 좋습니다) - 침실 문과 창문 주변에 추가 단열재를 설치했습니다
    (실리콘, 고무 등...) - 내부 소음 중 일부에 대해서는, 하드웨어적인 해결책보다는 가벼운 대화가 해결책이 되기도 했습니다 😄

완벽하지는 않지만 (도시는 도시니까요), 아침에 느끼는 기분과 시간이 지남에 따라 나타나는 Garmin* 데이터 모두에서 차이가 나타나고 있습니다.

궁금한 분들을 위해: 내부적으로 실제로 어떻게 작동하는지

기술적인 부분에 관심이 있는 분들을 위해 조금 더 자세히 설명하자면:

Pi는 계속해서 순환형 인메모리 버퍼 (rolling in-memory buffer)에 기록합니다. 볼륨이 임계값 (threshold)을 넘기 전까지는 디스크에 아무것도 저장되지 않습니다.(Home Assistant를 통해 탐지 기능이 활성화되어 있는 동안에만 작동). 이 과정은 주로 지속적인 배경 소음을 필터링합니다.입력값 위에 노이즈 억제 프로필 (noise suppression profile)이 적용되어 주변 소음 레벨 (ambient noise floor)을 가능한 한 낮게 유지하려고 시도하며, 이를 통해 임계값이 소음에 의해 트리거되지 않도록 합니다. 덕분에 오탐 (false positives)이 크게 줄었습니다.(멀리서 들리는 교통 소음, 냉장고 소리 등). 임계값이 넘었을 때의 스니펫 (snippet)은 타임스탬프와 함께 저장되며, 작은 JSON 파일이 이벤트들을 추적합니다. 스니펫은 여러 밤의 데이터를 저장할 수 있도록 더 작은 오디오 파일로 압축됩니다.(전후 맥락 포함). 이 시스템은 노이즈 이벤트와 오디오 클립을 제 웹 앱에 노출하며, 녹음 상태를 변경하기 위한 별도의 토큰 인증 제어 엔드포인트 (control endpoint)도 제공합니다.Pi 상의 아주 작은 웹 서버 - 이 제어 엔드포인트는 작은 **코딩 에이전트가 작성하도록 시킨 커스텀 Home Assistant 통합 (custom Home Assistant integration)에 의해 사용됩니다. Garmin Connect 인증을 처리하는 좋은 오픈 소스 라이브러리들이 있습니다. 작은 작업 (job)이 인증된 요청을 실행하여 그날의 활동 아카이브를 가져오면, 저는 거기서 수면 단계 (sleep stages), 심박수 (heart rate), HRV, 그리고 데이터 트랙으로 쉽게 보여줄 수 있는 기타 생체 지표 (biomarkers)들을 추출합니다.Garmin의 수면 데이터: - 웹 앱은 세 가지 소스에서 데이터를 가져옵니다: Garmin, Home Assistant(수면 데이터), 그리고 Pi(센서 이벤트)*. 이 모든 데이터는 동기화된 타임라인에 결합되며, 각 소스는 고유한 시각적 트랙으로 표시됩니다. (노이즈 이벤트 및 오디오 클립) - 제가 시도했던 기성 오디오 플레이어들은 제가 원하는 방식으로 멀티 트랙 동기화를 처리하지 못했기 때문에, 결국 직접 만들게 되었습니다.

  • 수면 단계 전환과 깨어남 이벤트 (wake events)가 시각적으로 강조되며, 이 부분이 제가 실제로 가장 의존하는 부분입니다.
  • 프론트엔드는 웹 푸시 (web push) 기능이 있는 PWA이며, 오직 제 홈 네트워크를 통해서만 서비스됩니다.

아직 구상 중이지만 아직 만들지는 않은 아이디어들

지금 가진 것만으로도 충분합니다. 가장 중요한 부분인 '실행'을 할 수 있으니까요. 하지만 언젠가 구현할 수도 있는 몇 가지 확장 기능들이 있습니다.

볼거리가 있을 때만 알림 보내기. 현재는 데이터의 내용과 상관없이 어젯밤 데이터가 준비되면 푸시 (push) 알림을 받습니다. 조용한 밤에는 알림을 건너뛰는 것이 더 스마트할 것입니다.

유사한 소리 클러스터링 (Clustering). 모델을 사용하여 유사한 오디오 클립들을 그룹화한 다음, 클러스터에 한 번만 라벨 (label)을 붙이는 방식입니다 (문 소리, 설거지 소리, 오토바이 소리, ...). 시간이 지나면 이 도구가 새로운 이벤트의 출처를 스스로 추측할 수도 있을 것입니다.

클러스터 시각화 (Visualization). 분류 (classification) 기능이 없더라도, 소리들이 어떻게 그룹화되는지 보는 것만으로도 청취 세션의 속도를 크게 높일 수 있습니다. 이는 데이터 라벨링 (data labeling) 작업에도 도움이 될 수 있습니다.

조건부 알림. 내 수면을 방해했을 가능성이 있는 경우에만 알림을 보냅니다. 그렇지 않으면 조용히 유지합니다.

이 각각의 기능들은 아마도 또 다른 주말을 소모하게 만들 것이며, 이것이 이 글의 더 넓은 요지이기도 합니다. 결국에는 구현하겠지만, 어쩌면 하지 않을 수도 있습니다. 이미 있는 것만으로도 제 역할을 다하고 있기 때문입니다.

이 글을 공유하는 이유

저에게는 이 특정 프로젝트 자체보다 그 밑바탕에 깔린 패턴이 더 중요합니다. 예전에는 "있으면 좋겠지만, 만들 가치는 없는" 범주에 머물러 있던 작고 개인적인 문제들이 하나의 카테고리를 형성하고 있습니다. AI 도구 (tooling) 덕분에, 이러한 프로젝트 중 상당수가 "그래, 안 될 거 없지, 주말 동안 한번 해보자"라는 영역으로 넘어왔습니다.

이번 경험을 통해 제가 얻은 몇 가지는 다음과 같습니다:

수정하기 전에 측정하세요 (Measure before you fix). 저는 거의 새 매트리스를 주문하고 더 두꺼운 커튼을 알아보기 시작할 뻔했습니다. 그것들이 도움이 되었을 수도 있지만, 데이터 없이는 올바른 해결책을 목표로 삼거나 사후에 그것이 실제로 효과가 있었는지 알 방법이 없었습니다.

맥락이 원시 데이터보다 중요합니다 (Context beats raw data). 소음 로그 자체만으로는 별로 유용하지 않습니다. 동일한 이벤트라도 심박수가 급증했는지, 문이 열렸는지, 혹은 당시 깊은 수면 (Deep sleep) 상태였는지에 따라 완전히 다른 이야기를 들려줍니다.

충분히 괜찮은 가장 단순한 신호를 선택하세요. Garmin의 수면 단계 (Sleep stages)는 불완전하지만, 깨어남 감지 (Wake detection) 기능은 제가 주의를 기울일 만한 순간들을 짚어주기에 충분할 만큼 좋습니다. 제게 필요한 것은 그것뿐이었습니다.

AI 도구화 (AI tooling)가 개인용 도구 제작의 문턱을 낮추었습니다. 이제 무언가 사소한 것이 저를 괴롭히기 시작할 때마다, 제 첫 번째 생각은 "이것을 더 잘 이해하기 위해 만들 수 있는 작은 시스템이 있을까?"입니다. 예전에는 그 대답이 "아마 그럴 가치가 없을 거야"였지만, 요즘은 "응"인 경우가 훨씬 더 많습니다.

이 프로젝트가 구축된 방식에 대한 몇 가지 주의사항

제 배경에 대하여: 저는 소프트웨어 엔지니어링 (Software engineering) 출신입니다. 이것이 제가 8시간 만에 이 일을 해낼 수 있었던 주요 이유입니다. 저는 무엇을 요구해야 하는지, 그리고 결과물에 대해 언제 회의적이어야 하는지를 알고 있었습니다. 반면, 오디오 처리 (Audio processing) 분야는 제가 처음 접하는 영역이며 (Logic Pro와 몇 가지 플러그인을 사용해 본 적은 있지만 그 이상은 아닙), 그 부분의 대부분은 사전 지식 없이 구축했습니다.

그렇긴 하지만, 저는 이 코드를 있는 그대로 어디에도 공개하지 않을 것입니다. 적절한 코드 리뷰 (Code review) 없이 오직 결과에 기반하여 테스트되었기 때문입니다. 제 경우에 이것이 괜찮은 이유는 제가 접근을 차단하고 권한을 제한할 수 있는 홈 랩 (Home lab)에서 실행되기 때문입니다.

작은 면책 조항

저는 수면 과학자가 아니며, 이것은 숙면을 위한 가이드로 의도된 것이 아닙니다. 저는 일상의 삶의 질에 영향을 미치는 사소한 것들에 주의를 기울이고, 할 수 있을 때 조치를 취하려고 노력하는 사람일 뿐입니다. 제 삶에는 크고 작은 많은 것들이 이런 방식으로 접근하는 대상들입니다. 이것도 그중 하나입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0