dev.to

THE UNHEARD: A Game That Sends You Outside, Teaches a Machine to Listen, and Makes It Prove Every Word

THE UNHEARD: 밖에서 소리를 모으고, 기계가 배운 내용을 검증하는 게임

THE UNHEARD는 실제 소리를 녹음해 분류하고, 사용자가 붙인 이름을 검색 메모리에 쌓아 작곡까지 이어가는 로컬 우선 게임입니다. 학습하지 않는 CLAP, 검색 메모리, Gemma를 분리하고 검증 수치를 공개했습니다.

AI 요약

THE UNHEARD는 기계가 소리의 이름은 알지만 실제 소리를 기억하지 못한다는 설정으로 시작합니다. 플레이어는 밖에서 소리를 녹음해 ECHO-0에게 들려주고, 기계의 추측을 확인하거나 고칩니다. 녹음이 쌓이면 그 소리들을 재료로 곡을 만듭니다. 프로젝트의 설계 원칙은 “모델은 바뀌지 않고, 메모리가 바뀐다”입니다. 모델을 학습시키는 대신 고정된 음향 모델, 사용자가 가르친 내용을 저장하는 검색 메모리, 문장을 만드는 로컬 언어 모델을 각각 분리합니다.

여섯 장면으로 구성한 흐름

Chamber에서는 ECHO-0가 지금까지 들은 소리의 양을 알립니다. Field에서는 실제 소리를 녹음합니다. 앱은 오프라인 상태에서도 브라우저에 먼저 저장하고, 사용자가 원할 때 서버로 올립니다. Hearing에서는 로컬 CLAP 모델이 소리와 텍스트 라벨의 유사도를 계산합니다. 결과는 확률인 척하지 않고 유사도 점수로 보여줍니다. 사용자는 추측을 승인하거나 고치고, 이름을 바꾸거나 모른다고 답할 수 있습니다.

Specimen은 측정한 음향 특성을 바탕으로 녹음을 시각적 표본으로 만듭니다. 같은 소리에는 같은 형태를 생성합니다. Atlas는 녹음들을 실제 소리의 유사도에 따라 배치하고, 사용자가 붙인 이름을 표시합니다. Orchestra에서는 사용자가 가르친 소리 세 개 이상을 골라 작곡합니다. 녹음에서 잘라낸 소리 조각을 재료로 삼으며, 각 소리를 따로 음소거하거나 재생할 수 있고 WAV 파일로 저장합니다. 게임의 마지막 장면은 이름을 붙인 녹음 세 개 이상으로 만든 작곡이 있어야 열립니다.

모델과 메모리의 역할을 분리합니다

음향 분석에는 LAION-CLAP의 clap-htsat-unfused를 사용합니다. 오디오를 512차원 임베딩으로 바꾸고 텍스트 라벨과 비교하며, CPU에서 실행합니다. 모델 가중치는 내려받아 로컬에서 사용하고 프로젝트는 이를 학습하거나 미세 조정하지 않습니다. 사용자가 소리에 이름을 붙이면 해당 임베딩을 그 이름의 예시로 저장합니다. 이후 추측은 CLAP 점수와 저장된 예시에 대한 최근접 이웃 유사도를 결합합니다. 화면에는 어느 쪽의 점수인지 구분해 보여줍니다.

작성자는 지붕 홈통 소리 두 개를 “Roof gutter”로 가르친 실험도 제시합니다. 학습 전에는 세 번째 녹음의 상위 후보에 Rain, Bicycle, Lawn mower가 있었고, 학습 뒤에는 Roof gutter가 첫 번째가 됐습니다. CLAP 모델은 그대로였고 메모리만 추가됐습니다. 또 이름을 분석이 끝나기 전에 붙이면 이름은 저장되지만 임베딩 예시로 등록되지 않는 결함을 발견했습니다. 분석이 완료될 때 저장된 이름을 정확히 한 번 연결하도록 고쳤습니다. 수정 뒤에는 이름을 먼저 붙이든 분석 뒤에 붙이든 실제 CLAP 유사도가 0.837로 같았습니다. 메모리가 아직 반영되지 않은 상태도 화면에 알립니다.

Gemma의 응답은 코드가 검증합니다

Gemma 3 4B는 Ollama를 통해 로컬에서 실행하며, 기억의 변화 설명, 임무 제안, 작곡 해설만 맡습니다. 게임의 기억 상태나 임무 완료 여부는 일반 코드가 관리합니다. Gemma에는 오디오, 내부 ID, 사용자의 메모를 주지 않습니다. 짧은 사실 목록과 이를 인용하는 JSON 형식만 전달합니다. 검증기는 숫자가 인용한 사실에 있는지, 인용된 이름이 사용자가 붙인 이름인지, 근거에 없는 소리를 언급하지 않았는지 등을 확인합니다. 조건에 어긋나면 정해진 문장을 대신 보여주고 실패 이유를 기록합니다. Gemma 응답을 기다리는 동안에는 먼저 템플릿 문장을 보여줍니다.

실제 여정의 19개 시점을 세 번씩 실행한 57회 평가에서 첫 응답 48개가 검증을 통과해 성공률은 84.2%였습니다. 두 번째 실행에서도 같은 수치가 나왔습니다. 따뜻한 상태의 중앙 지연 시간은 약 1.3초입니다. 검증기가 “the ears' strongest guess”의 아포스트로피를 여는 따옴표로 잘못 읽는 버그를 고친 뒤 성공률은 71.9%에서 84.2%로 올랐습니다. 반면 재시도까지 포함한 최종 대체 응답률은 측정하지 않았습니다. Gemma 문장이 템플릿보다 나은지도 평가하지 않았습니다. 블라인드 평가표는 준비했지만 아직 응답을 받지 못했습니다.

로컬 우선 구성과 공개한 한계

앱은 React PWA, FastAPI, SQLite로 구성합니다. CLAP 추론, 메모리, 작곡, Gemma는 노트북에서 실행하며 녹음은 기기 밖으로 보내지 않는다고 설명합니다. 휴대전화는 녹음에만 쓰고, 마이크 사용을 위해 HTTPS가 필요해 서버가 앱을 TLS로 제공하는 설정도 넣었습니다. 다만 실제 휴대전화에서 Android 현장 테스트를 마치지 않았습니다. 자동화 테스트는 데스크톱 Chrome과 모의 마이크로 실행했으며, 작성자는 이것이 휴대전화에서 동작한다는 증거가 아니라고 밝힙니다. 휴대전화가 잠기면 녹음이 멈출 수도 있습니다.

데모 음원 역시 실제 현장 녹음이 아닙니다. 비상업적 연구 데이터는 공개 데모에 쓸 수 없어 NumPy로 합성 음원을 만들었고, 영상용으로는 ElevenLabs Sound Effects API로 21개 클립을 생성했습니다. 영상의 내레이션도 ElevenLabs 음성입니다. 영상에 나온 작곡은 앱이 생성 음원으로 만든 결과이며, 실제 녹음처럼 꾸미지 않았다고 설명합니다. 실제 음원에서의 성능은 합성 음원 데모만으로 입증되지 않으며, 작곡의 음악적 품질도 사람에게 평가받지 않았습니다.

저자들은 백엔드 테스트 283개와 프런트엔드 테스트 78개가 통과했다고 밝혔습니다. 프로젝트는 MIT 라이선스로 공개하며, 모델 가중치는 저장소에 포함하지 않습니다. 실행 시 CLAP 모델을 내려받고 Ollama에서 Gemma를 구동합니다.

dev.to 반응

  • @koda2026 — 이클랄, 정직한 로컬 우선 AI 엔지니어링의 모범 사례입니다. “모델은 바뀌지 않고 메모리가 바뀐다”는 원칙은 검색 증강 시스템을 만드는 방식으로 딱 맞습니다. Gemma에 엄격한 JSON 스키마를 강제하고 모델과 사용자 사이에 “의심 많은 검증기”를 둔 점도 좋습니다. 실제 서비스에서 환각을 막으려면 그래야 합니다. 통과율 84.2%를 측정하고 아포스트로피 버그까지 공개한 점에서 엔지니어링의 정직함이 드러납니다. CLAP의 원시 유사도와 사용자가 가르친 예시의 최근접 이웃 유사도를 결합할 때 가중 합을 쓰나요? 아니면 사용자 메모리가 특정 임계값을 넘으면 기본 모델의 신뢰도를 완전히 덮어쓰나요? ElevenLabs 데모 음원에 대해서도 투명하게 밝혀줘서 좋습니다. 한계를 숨긴 가짜 현장 녹음보다 솔직함이 훨씬 신뢰를 줍니다. 계속 만들어주세요!