arrow_back 프로젝트 목록으로

2026-10-17

[해커톤 2/3] ExecuTorch Hackathon — NPU로 대화의 문맥을 읽는 IDK Button

Arduino VENTUNO Q와 Qualcomm Hexagon NPU로 만든 문맥 기반 통역 장치. 프로젝트 리드와 NPU 파이프라인·모델 변환·양자화·검증을 맡은 기록.

해커톤 시리즈 2/3 — ExecuTorch Hackathon

세 번의 해커톤을 돌아보는 시리즈의 두 번째 글입니다. 첫 번째 SF Hacks 프로젝트에서 캠퍼스 접근성을 다뤘다면, 이번에는 말을 듣다가 의미를 놓친 순간, 버튼 하나로 문맥을 다시 확인하는 장치를 만들었습니다.

2026년 10월 17일 샌프란시스코 Founders, Inc.에서 시작한 ExecuTorch Hackathon의 IoT 트랙에 참가했습니다. Arduino VENTUNO Q와 Qualcomm Hexagon NPU, Qualcomm AI 플랫폼을 활용해 IDK Button — The button that knows what is being said를 제작했습니다. 저는 프로젝트 리드와 NPU 추론 파이프라인, 모델 변환·양자화·검증을 맡았습니다.

ExecuTorch Hackathon IoT 트랙 안내 화면 옆에서 발표하는 모습
10월 18일, IoT 트랙 현장에서 프로젝트를 소개하던 순간.
항목 내용
행사 ExecuTorch Hackathon
트랙 IoT
참가 기준일 2026년 10월 17일
장소 Founders, Inc. · San Francisco Lab
프로젝트 IDK Button
팀 규모 3명
주요 플랫폼 Arduino VENTUNO Q · Qualcomm Hexagon NPU · ExecuTorch · QNN/QAIRT · GenieX
내 역할 프로젝트 리드, NPU 파이프라인·추론, 양자화, 모델 변환, 검증

첨부한 제출 기록상 최종 제출 시각은 10월 18일 오후 1시 0분 2초(PDT)입니다. 이 글의 날짜는 행사 시작일인 2026-10-17로 설정했습니다.

GitHub 저장소 · 제출 시연 영상

1. 문제 정의 — 단어를 알아도 문맥을 놓칠 때

외국어 대화에서는 모든 단어를 들었다고 해서 뜻까지 이해한 것은 아닙니다. ground, port, bank처럼 여러 의미를 가진 단어도 있고, make it처럼 문장과 상황에 따라 해석이 달라지는 표현도 있습니다.

IDK Button은 이런 순간에 최근 대화를 바탕으로 지금 문장의 의미를 확인하는 도구입니다. 음성을 텍스트로 바꾸고, 이전 문맥과 함께 해석하며, 뜻이 모호하면 사용자에게 의미를 다시 묻도록 구성했습니다. 번역한 문장과 기억하고 싶은 단어를 저장하는 기능도 연결했습니다.

휴대폰에 문장을 다시 입력하는 대신 물리 버튼과 노브를 입력 수단으로 사용했습니다. 대화를 듣는 중에 버튼을 누르고, 필요한 선택을 하고, 결과를 확인하는 흐름이 프로젝트의 중심입니다.

Founders, Inc. 행사장에서 노트북을 펼치고 작업하는 참가자들
10월 17일의 행사장. 각 테이블에서 프로젝트 개발이 진행되고 있었습니다.

2. 팀 구성과 내가 맡은 부분

팀원 담당 역할
Minjae Kim (나) 프로젝트 리드, NPU 파이프라인 및 추론, 양자화, 모델 변환, 검증
Satyam Sharma 백엔드, 웹페이지 호스팅, SQLite 데이터베이스
Albert Chang 하드웨어, 하우징 제작, 펌웨어 제작

저는 모델을 보드에서 실행하는 경로를 구성하고 검증하는 역할을 맡았습니다. 음성 인식과 언어 모델이 서로 다른 실행 환경을 사용하므로, 각각의 모델 준비·런타임·입출력을 맞추고 앱이 호출할 수 있는 형태로 연결하는 작업이 필요했습니다.

Satyam은 백엔드와 웹페이지 호스팅, SQLite 저장 계층을 담당했고, Albert는 실제로 조작할 수 있는 하드웨어와 하우징, 펌웨어를 담당했습니다. 팀의 구현은 보드의 AI 추론 → Mac의 애플리케이션 처리 → 물리 장치와 대시보드의 피드백으로 이어집니다.

3. 시스템 구조 — 보드와 Mac의 역할

음성 인식과 LLM 추론은 보드의 Qualcomm NPU에서 실행하고, 대시보드·백엔드·사전 검색은 Mac에서 처리하는 구조입니다. AI 추론에 인터넷 연결은 필요하지 않지만, 전체 애플리케이션은 보드와 Mac을 함께 사용합니다.

단계 실행 위치 구현
음성 인식 VENTUNO Q의 Hexagon NPU Whisper tiny · ExecuTorch · QNN 백엔드
문맥 분석·번역 VENTUNO Q의 NPU Qwen3.5-2B Q4_0 · GenieX · Qualcomm QAIRT 실행 경로
요청 조율·화면 Mac FastAPI 백엔드 · 웹 대시보드
사전 검색·저장 Mac 검토된 소규모 어휘 규칙 · OEWN 2025 · SQLite
버튼·노브·표시 보드의 MCU 및 주변 하드웨어 Arduino 펌웨어 · RouterBridge · LED 매트릭스

보드에서 인식한 텍스트는 Mac의 FastAPI로 전달되고, FastAPI가 다시 보드의 Qwen 모델에 문맥 분석과 번역을 요청합니다. 이 연결에는 USB와 ADB 포트 전달을 사용합니다. 코드에 나타나는 127.0.0.1 주소만으로 실행 위치를 판단하기보다, 포트 전달을 포함한 전체 요청 경로를 확인해야 했습니다.

4. 내 담당 — NPU 파이프라인, 모델 변환과 양자화

Whisper: ExecuTorch로 준비한 음성 인식 경로

음성 인식에는 사전 컴파일한 whisper_qnn_fp16.pte를 사용합니다. 실행 코드에서는 ExecuTorch의 _load_for_executorch()로 파일을 읽고, libqnn_executorch_backend.so를 로드한 뒤 QnnBackend가 등록되어 있는지 확인합니다.

Qualcomm Hexagon 런타임 라이브러리를 찾을 수 있도록 ADSP_LIBRARY_PATH와 라이브러리 경로를 구성했습니다. 제출 설명의 실행 구조에서는 Whisper의 인코더·디코더 추론이 QNN/QAIRT의 HTP 경로를 통해 Hexagon NPU에서 수행됩니다. 오디오 전처리와 토큰 선택 같은 주변 제어는 모델 실행과 구분됩니다.

변환된 모델 파일을 읽는 데서 끝나는 것이 아니라, 의도한 백엔드를 사용할 수 있는지, 모델 메서드를 실제로 호출할 수 있는지, 결과가 다음 단계에 전달되는지까지 확인하는 것이 제 작업의 핵심이었습니다.

Qwen: Q4_0 모델과 별도의 NPU 실행 경로

문맥 분석과 번역에는 unsloth/Qwen3.5-2B-GGUF의 Q4_0 양자화 모델을 사용했습니다. 이 모델은 Whisper와 같은 .pte 경로가 아니라, GenieX의 llama.cpp 기반 추론 엔진과 Qualcomm NPU 실행 경로로 서비스합니다. 서버는 --compute npu 옵션으로 실행하도록 구성했습니다.

따라서 프로젝트의 모델 준비 과정은 두 갈래로 나뉩니다.

  • Whisper: ExecuTorch AOT 컴파일 산출물, QNN 백엔드, FP16 모델 실행
  • Qwen: GGUF Q4_0 양자화 모델, GenieX 서버를 통한 문맥 분석·번역

Whisper의 FP16 실행과 Qwen의 4비트 양자화를 구분해 관리했습니다. 모델마다 파일 형식과 런타임, 호출 방식이 다르기 때문에 하나의 변환 방식으로 묶어 설명할 수 없었습니다.

토큰 단위 디코딩과 인식 후보

Whisper 실행 코드에는 encoder와 decoder 메서드를 호출하는 디코딩 루프가 있습니다. 가장 유력한 토큰을 선택하는 greedy decoding에 더해, 인식이 불확실한 경우 일부 위치에서 두 번째 후보 토큰을 선택해 다른 전사 후보를 만드는 경로를 포함했습니다.

무음 가능성과 후보 간 점수 차이 등을 함께 다루고, 화면에서 원문 인식 후보를 비교할 수 있도록 연결했습니다. 대체 후보가 항상 정답이라는 의미는 아니지만, 잘못 인식한 문장을 그대로 번역하는 상황을 사용자가 확인할 수 있게 합니다.

제출 시연 영상에 담긴 실시간 전사 대시보드와 물리 장치
제출 시연 영상의 대시보드. 실시간 전사와 해석 결과를 나눠 표시합니다.

5. 문맥을 확인하고 의미를 고르는 과정

버튼을 누른 순간의 문맥 고정

대화를 계속 듣는 동안에도, 사용자가 해석을 요청한 문맥은 고정되어야 합니다. 처리 중에 들어온 새 발화가 기존 요청의 의미를 바꾸지 않도록 실시간 전사와 버튼 시점의 스냅샷을 구분했습니다.

저장소에는 최근 30초의 오디오 버퍼와 문장 기록을 관리하는 코드가 있습니다. 최근 문장들을 문맥으로 사용하고, 해석할 대상 문장을 별도로 선택하는 구조입니다. 버튼을 누른 뒤에도 듣기는 이어질 수 있지만, 이미 고정한 요청은 그대로 유지합니다.

사전 규칙과 LLM을 함께 사용

사전 검색은 목적에 따라 세 단계로 나뉩니다.

시점 목적 사용 데이터
번역 전 다의어·구동사의 의미 구분 검토된 단어 의미와 표현 규칙
번역 직후 저장할 만한 단어 제안 SQLite에 저장한 OEWN 2025와 프로젝트 용어집
노브로 단어 선택 시 선택한 단어의 뜻 확인 검토된 뜻풀이, 없는 항목은 보드의 Qwen에 요청

이미 알고 있는 표현에는 검토된 규칙을 먼저 적용하고, 규칙만으로 처리하지 못하는 경우에 모델을 사용합니다. 사전 전체를 매번 모델에 맡기는 대신, 확실하게 정리할 수 있는 부분과 문맥 판단이 필요한 부분을 나눴습니다.

모델의 선택 비율과 번역 정확도 구분

작은 언어 모델이 스스로 말하는 확신도를 그대로 정확도처럼 보여주기는 어렵습니다. 저장소에는 후보 의미 중 하나를 여러 번 선택하게 하고, 선택지 순서도 뒤집어 모델이 어느 의미를 얼마나 일관되게 선택하는지 집계하는 코드가 있습니다.

이 값은 후보에 대한 모델의 선택 비율이며, 정답일 확률이나 검증된 번역 정확도가 아닙니다. 같은 오답을 일관되게 고를 수도 있습니다. 의미가 모호할 때 사용자에게 선택을 요청하는 흐름과, 보정되지 않은 translation_confidence를 비워두는 처리를 함께 두었습니다.

6. 하드웨어와 대시보드 연결

Albert가 담당한 장치는 버튼·회전 노브와 LED 표시를 통해 상태를 전달합니다. 녹음, 음성 인식, LLM 처리, 결과 선택 등의 단계에 맞춰 보드의 8×13 LED 매트릭스 표시를 바꾸고, 노브 입력을 대시보드의 선택 상태와 연결합니다.

완성된 하우징 전면의 입력부, 초록색 상태 LED와 회전 노브
하우징에 넣은 장치의 전면. 입력부와 상태 LED, 회전 노브를 한쪽에 모았습니다.
직접 촬영한 24초 영상. 하우징 내부의 보드와 전원·마이크 연결 구성을 볼 수 있습니다.

결과는 자연스러운 번역, 직역, 간단한 문맥 설명의 세 가지 관점으로 구성됩니다. 이 세 항목은 같은 문장을 이해하는 방식이며, 세 개의 정확도 등급을 의미하지 않습니다. 문장과 단어를 저장하고 다시 확인하는 흐름은 Satyam이 담당한 백엔드·SQLite 계층과 이어집니다.

제출 시연 영상의 저장된 번역 문장 목록
문맥을 반영한 해석을 저장하고 다시 확인하는 화면.

7. 검증하면서 중요했던 것

NPU에서 모델을 실행하는 프로젝트에서는 파일 로딩, 백엔드 실행, 응답 형식, 의미의 정확성을 각각 확인해야 했습니다. JSON 형식이 맞거나 HTTP 요청이 성공했다고 해서 번역의 의미까지 맞는 것은 아닙니다.

저장소의 AI 연동 기록에는 실제 보드 호출 결과와 그 번역이 놓친 뉘앙스를 함께 남겼습니다. 예를 들어 You're grounded.를 징계로 해석해도, 문맥상 중요한 ‘외출 금지’까지 충분히 표현했는지는 별도로 평가해야 합니다.

테스트 코드에는 모델 응답을 모의 처리하는 API·문맥 선택·사전·저장 로직 검사와, 하드웨어 입력·전사 상태를 다루는 검사가 포함되어 있습니다. 이러한 소프트웨어 검증과 실제 보드 실행 확인은 서로 보완하는 절차입니다. 공개 저장소에는 모델 가중치, Qualcomm SDK, 런타임 전체가 포함되어 있지 않아 코드만 복제하는 것으로 동일한 NPU 환경이 준비되지는 않습니다.

8. 두 번째 해커톤에서 얻은 것

이번 프로젝트에서는 모델을 장치 위에서 실행하는 과정 자체가 제품 구현의 큰 부분이었습니다. 모델 변환과 양자화, 런타임 설정, 보드와 Mac 사이의 요청 경로를 맞춰야 버튼 입력이 실제 해석 결과까지 이어질 수 있었습니다.

프로젝트 리드로서 제가 맡은 NPU 파이프라인은 Satyam의 백엔드·저장 계층, Albert의 하드웨어·펌웨어와 만나는 지점이기도 했습니다. AI 모델의 출력을 만드는 것에 더해, 사용자가 문맥을 확인하고 선택할 수 있는 형태로 연결한 경험이었습니다.

IDK Button 장치를 들고 무대에 함께 선 참가자들
완성한 장치를 들고 함께 선 무대.

이전 편: 해커톤 1/3 — SF Hacks 2026, GatorAccess

다음 편: 해커톤 3/3 — Cal Hacks 13.0, Drigil