fieldmemo: 휴대폰은 주머니에 넣고, 말로 기록하며 집에서 필드 저널 만들기
요약
fieldmemo는 산책 중 녹음된 음성 메모를 인터넷 연결 없이 자체 장치에서 현장 일지(field journal)로 변환하는 도구입니다. 사용자는 휴대폰을 주머니에 넣고 걸으면서 발견한 것을 말로 기록할 수 있으며, 집에 돌아와 GPX 트랙 파일과 함께 명령어를 실행하면 체계적인 저널링 결과물(Markdown, GeoJSON, CSV)을 얻게 됩니다.
핵심 포인트
- 산책 중 음성 메모를 현장 일지로 변환하는 도구입니다.
- 인터넷 연결 없이 자체 장치에서 작동하여 사용 편의성이 높습니다.
- GPX 트랙과 녹음된 메모를 기반으로 저널, GeoJSON, CSV 세 가지 결과물을 생성합니다.
이 글은 Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass에 제출하는 내용입니다.
AI 공개: 이 게시물은 AI 코딩 에이전트의 도움을 받아 작성되었으며, 해당 에이전트가 대부분의 코드와 초안 작성을 담당했습니다. 저는 내용을 검토하고 데모를 시청한 후 텍스트를 승인했습니다. 아래에 기재된 작동 여부 및 오류 내용은 기억에 의존한 것이 아니라 리포지토리의 빌드 로그에서 가져온 것입니다.
제가 만든 것 (What I Built)
fieldmemo는 산책 중에 녹음한 음성 메모를 인터넷 연결 없이, 사용자의 자체 장치에서 현장 일지(field journal)로 변환합니다.
이 아이디어는 휴대폰을 주머니에 넣고 다니는 것입니다. 무언가를 발견하면 녹음을 누르고 말합니다: "능선 위를 선회하는 두 마리의 황조롱이", "두 번째 들판 너머의 스틸(stile) 계단이 부서져 있으니, 시의회에 보고하세요", "다음 9월에는 블랙베리 따러 오세요". 앱을 열 필요도 없고, 작성할 양식도 없으며, 차가워진 손가락으로 타이핑할 필요도 없습니다. 그 후 휴대폰을 주머니에 넣고 계속 걸으면 됩니다.
집에 돌아와 메모 폴더와 (만약 녹음했다면) 휴대폰이나 시계의 GPX 트랙 파일을 함께 사용하여 다음 명령어를 실행합니다:
fieldmemo walks/2026-10-08/memos --gpx walks/2026-10-08/track.gpx
그러면 세 개의 파일이 생성됩니다:
journal.md: 목격한 것, 들었지만 보지 못한 것, 각 장소에 대한 지도 링크가 포함된 경로 문제점, 할 일 목록(to-do list), 그리고 모든 메모의 녹취록이 담긴 타임라인.walk.geojson: 트랙과 각 메모 지점을 표시하는 핀으로 구성되어 있으며, QGIS, uMap 또는 geojson.io에서 사용할 수 있습니다.notes.csv: 목격 사항, 위험 요소 또는 할 일 항목별로 한 행씩 기록됩니다.
이 도구는 산책 중에 화면을 보는 데 시간을 쓰지 않으면서도 산책 기록을 남기고 싶은 하이커(walkers), 조류 관찰가(birders), 그리고 트레커(ramblers)를 위한 것이며, 부서진 스틸이나 침수된 길에 대해 시의회에 보고하고 그 시간과 위치를 문서로 남기고자 하는 모든 사람들을 위한 것입니다.
데모 (Demo)

이것이 레포지토리에서 샘플 워크를 전체 실행한 결과입니다: 메모 7개 입력, 저널 출력, GPU 없이 8코어 CPU로 약 48초가 소요되었습니다. 이것은 작성된 "한눈에 보기(At a glance)" 블록이며, 지도 링크만 단축되었을 뿐입니다:
**확인됨:** buzzard, fly agaric x12, blackberry
**들려옴 (미확인):** green woodpecker
...
솔직하게 말씀드리자면: 샘플 워크는 합성(synthetic)입니다. 메모는 오픈 소스 음성-텍스트 변환 엔진인 Piper가 말한 것이고, 바람 소리를 흉내 내기 위해 브라운 노이즈를 섞었으며, GPX 트랙은 가짜 루프입니다. 제가 이렇게 한 이유는 누구나 정확히 이 데모를 재실행할 수 있도록 하기 위함이지만, TTS 음성이 바람 부는 언덕에서 실제 사람 목소리보다 훨씬 깨끗하므로, 여기의 정확도는 최상의 경우로 간주해 주세요.
코드
GitHub logo darrenmakes / fieldmemo
음성 메모 + GPX 트랙 -> 오프라인 현장 저널, 지도 레이어 및 CSV (Whisper + Ollama를 통한 Gemma 4). AI 지원 빌드.
fieldmemo
산책로에서 말하고, 집에서 읽으세요.
산책할 때 휴대폰을 주머니에 넣고 다니세요. 무언가를 보면 녹음을 누르고 "능선 너머 두 마리 버자드", "두 번째 들판의 샛길 옆 난간", "다음 9월에 블랙베리를 보러 오세요"와 같이 말하세요. 그 후, fieldmemo를 음성 메모 폴더(그리고 시계나 휴대폰에서 받은 GPX 트랙이 있다면 그것도)에 겨누면 다음과 같은 것을 작성합니다:
journal.md: 읽기 쉬운 현장 저널. 무엇을 보았는지, 무엇을 들었는지, 지도 링크가 포함된 경로상의 문제점들, 할 일 목록(to-do list), 그리고 모든 메모의 스크립트가 담긴 타임라인.walk.geojson: 당신의 트랙과 메모당 핀이 찍힌 파일. QGIS, uMap, geojson.io 또는 모든 GIS 도구에서 열 수 있습니다.notes.csv: 관찰 기록, 위험 요소 또는 할 일 목록별로 한 행씩 정리되어 스프레드시트 사용 준비가 된 파일.
모든 것이 당신의 자체 기기에서 실행됩니다: Whisper (를 통해 faster-whisper)를 이용한 음성-텍스트 변환과 Google의 오픈 가중치 모델인 Gemma를 Ollama가 서비스하는 노트 작성 기능까지…
Python으로 작성되었으며 MIT 라이선스를 따르고, 테스트를 포함하여 약 640줄 분량입니다. 이 저장소에는 샘플 산책 기록, 이를 생성하는 스크립트, 그리고 발생한 모든 문제를 기록한 docs/BUILD-LOG.md가 포함되어 있습니다.
구축 과정 (How I Built It)
네 가지 오픈 소스 구성 요소가 작동합니다:
- Whisper (
small.en)를 faster-whisper를 통해 사용하여 CPU에서 음성 인식(speech-to-text)을 수행합니다. - Google의 오픈 가중치 모델인 Gemma 4 E2B를 4비트 GGUF (3.1 GB) 형태로 Ollama가 제공합니다. 이 모델은 각 녹취록을 읽고 고정된 스키마(
seen,heard,hazard,todo또는note)에 따라 JSON 형식으로 반환하며, 각 항목은 주제(subject), 개수(count), 그리고 몇 단어의 상세 정보로 구성됩니다. - 위치 정보를 위한 GPX 트랙과 타이밍을 위한 일반 Python 스크립트입니다.
가장 흥미로운 부분은 모든 것이 잘못되었던 지점들이었습니다.
**Whisper는
작은 모델이 지어낸 것들. 저는 Gemma 3 1B로 시작했는데, 이 모델은 약 1.2 GB의 RAM에 들어맞기 때문입니다. 메모에 "보지 않았다(didn't see it though)"고 적혀 있는데도 목공새를 "봤다(seen)"고 표시했고, "딱따구리 두 마리, 어쩌면 세 마리, 나무 뒤로 계속 떨어지고 있다"라는 문구를 딱따구리와 나무 3개로 바꾸었으며, 한 번의 실행에서는 자동차 주차장 메모에 단 하나의 균류도 언급되지 않았음에도 불구하고 "날파리버섯: 돌 위에 자라는 작고 창백한 버섯(fly agaric: a small, pale mushroom growing on a stone)"을 추가했습니다. 제 추측으로는 이 모델이 제가 직접 제공한 프롬프트의 예시에서 "날파리버섯"이라는 단어를 가져온 것 같습니다.
Gemma 4 E2B는 같은 메모들에서 종류를 정확하게 파악했습니다: 들은 것(heard) 대 본 것(seen), 침수된 길을 위험 요소로, 블랙베리를 할 일 목록으로요. 이 모델은 약 3 GB의 RAM이 필요하며 CPU에서 메모리당 4초에서 8초가 걸리기 때문에 기본값이며, 더 작은 장비에서는 Gemma 3 1B를 사용할 수 있습니다.
그래서 모든 답변은 확인됩니다. 작은 모델은 언젠가는 무언가를 지어내기 마련이므로, fieldmemo는 JSON을 신뢰하지 않습니다. 각 항목의 주어는 반드시 전사(transcript)에 실제로 존재하는 단어로 구성되어야 하며, 개수도 언급되어야 합니다("두 마리", "한 다스", "12"). 실패하는 모든 내용은 단순히 삭제되는 것이 아니라 저널에서 이유와 함께 취소선 처리됩니다. 이것이 바로 지어낸 버섯을 잡아낸 방식입니다.
그러다 확인 과정에서 정답이 거부된 적도 있습니다. Whisper는 "두 번째 필드 뒤의 스타일(style)"이라고 기록했습니다. Gemma 4는 이를 "돌계단(stile)"으로 읽었고, 이는 정확한 내용이었지만, 저희가 만든 새로운 검증 시스템은 "stile"이라는 단어가 전사에는 없다는 이유로 이를 거부했습니다. 해결책은 다음과 같습니다: 전사에 없는 단어라도 그것이 사용자의 용어집(glossary)에 있고 전사에 그 단어와 두 글자 이내의 단어가 포함되어 있다면 허용합니다. 저널에는 수정됨: "style"을 들었으나, "stile"로 읽음과 같이 표시되므로, 모델이 수정한 내용과 사용자가 동의할지 여부를 판단할 수 있습니다.
시간대(Time zones). Android 녹음기는 로컬 시간으로 파일 이름에 기록합니다 (Recording_20261008_101940.m4a). iPhone에서 내보낸 파일은 New Recording 4.m4a라는 이름이며, 시간을 UTC 메타데이터 태그로 유지합니다. GPX는 항상 UTC입니다. 이 중 하나라도 잘못 알면 모든 핀이 트랙을 따라 한 시간씩 밀리게 됩니다. 잘못된 시간대를 사용하여 샘플을 실행하면 iPhone 메모가 타임라인 맨 위로 점프하고, 마지막 두 개의 메모는 "트랙 종료 후 27분" 및 "트랙 종료 후 53분"에 위치하게 됩니다. fieldmemo는 트랙 내 어딘가에 떨어지는 한 시간의 오류는 감지할 수 없지만, 트랙을 벗어난 곳이나 5분보다 긴 GPS 공백에 있는 메모에는 잘못된 위치 대신 위치 정보가 없어지고, --tz와 --clock-offset를 가리키는 경고 메시지가 표시됩니다.
사소한 문제점들: ollama pull은 제가 구축한 네트워크에 의해 차단되었기 때문에 Hugging Face에서 GGUF 파일을 다운로드하여 한 줄의 Modelfile로 가져왔으며, 이 내용은 이제 README에 문서화되어 있습니다. faster-whisper 1.2.1 버전은 최신 PyAV(unexpected keyword argument 'metadata_errors')와 충돌했기 때문에, fieldmemo는 대신 ffmpeg 바이너리를 사용하여 오디오를 디코딩합니다. 보너스로, 이제 ffmpeg가 처리할 수 있는 모든 것을 읽을 수 있게 되었습니다.
시간대, 보간(interpolation), 그리고 접지 확인(grounding check)을 다루는 8개의 단위 테스트가 있으며, 전체 파이프라인은 CPU에서 실행됩니다.
Open Innovation은 왜 중요한가요?
fieldmemo가 처리하는 것을 보세요: 사용자가 걸어간 위치에 대한 타임스탬프 기록과 음성 녹음입니다. 이것은 당신이 어디에 살고 있는지, 언제 외출했는지, 그리고 어떤 소리를 내는지를 기록합니다. 오픈 웨이트(open weights)를 로컬에서 실행하기 때문에, 이 모든 정보가 외부로 전송되지 않습니다. 신뢰해야 할 계정이나 API 키, 서버가 없습니다. 모델을 다운로드하면 네트워크에 아무것도 닿지 않습니다.
또한 실행하는 데 비용이 들지 않습니다. 샘플 워크는 CPU의 약 48초만 소요되었으며, 분당 전사(transcription) 요금이나 메모에 대한 토큰별 요금이 전혀 없습니다.
더 큰 차이는 이것을 구축하는 과정에서 드러났습니다:
- 하나의 플래그로 모델을 교체할 수 있었습니다. 동일한 일곱 개의 메모에 대해 Gemma 3 1B와 Gemma 4 E2B를 비교하는 데는 몇 분밖에 걸리지 않았으며, 작은 모델의 실수를 나란히 보는 것이 그라운딩 체크가 존재하는 이유입니다. 가중치(weights)가 디스크에 있기 때문에 선택은 어떤 플랜을 사용하느냐가 아니라 장치가 가진 RAM 용량에 달려 있습니다.
- 음성 모델을 조향할 수 있었습니다. 이 용어집(glossary)이 작동하는 이유는 로컬 Whisper를 사용하여 프롬프트를 설정할 수 있기 때문입니다. Cairngorms에서 걷는 사람이 "ptarmigan"과 "bothy"를 추가하여 같은 날 더 나은 전사본을 얻을 수 있습니다.
- 결과는 그대로 유지됩니다. 저장소의 지침에 있는 가중치(weights)는 고정된 파일입니다. 다음 달에 샘플을 실행하면, 기계 간의 작은 수치적 차이를 제외하고 제가 받은 것과 동일한 답변을 얻어야 하며, 따라서 README와 빌드 로그가 진실하게 유지됩니다. 호스팅되는 모델은 아무런 통보 없이 내부적으로 변경될 수 있습니다.
저는 폐쇄형 API를 이것과 비교하여 벤치마킹하지 않았기 때문에, 오픈 스택이 더 정확하다고 주장할 수는 없습니다. 제가 말씀드릴 수 있는 것은, 사용자의 위치와 목소리를 중심으로 구축된 도구의 경우, 로컬에서 작동하고 오픈 소스인 버전이 실제로 사용하고 싶은 버전이라는 것입니다.
내 에이전트 세션 (My Agent Session)
이것은 AI 코딩 에이전트를 사용하여 구축되었습니다. DevRelay 내보내기(export)는 가지고 있지 않지만, 저장소의 docs/BUILD-LOG.md에는 세션에 대한 단계별 기록이 담겨 있습니다: 무엇을 시도했는지, 무엇이 고장 났는지, 그리고 그 결과 무엇이 변경되었는지를 보여줍니다.
수상 부문 (Prize Categories)
- Gemma의 최고의 활용 사례: Gemma 4 E2B는 Ollama를 통해 로컬에서 실행되며, 각 전사본을 구조화된 현장 메모로 변환하는 핵심 작업을 수행합니다. 저장소에서는 동일한 메모에 대해 Gemma 3 1B와 비교하며, 이것이 기본값입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기