Show HN: Yap – 다운로드할 모델이 없는 macOS용 OSS 온디바이스 음성 받아쓰기
요약
Yap은 API 키나 계정 필요 없이 로컬에서 작동하는 빠르고 개인 정보 보호에 강한 macOS용 오픈소스 음성 받아쓰기 도구입니다. 메뉴 바를 통해 단축키로 실행하며, 실시간 파형과 미리보기를 제공하고 텍스트를 클립보드에 붙여넣습니다. 무거운 모델이나 외부 API 의존성을 제거하여 낮은 사양의 Mac에서도 효율적으로 작동하도록 설계되었습니다.
핵심 포인트
- API 키나 계정 없이 로컬에서 작동하는 온디바이스 받아쓰기
- macOS 26+ 환경을 지원하며, Apple Silicon Mac에 최적화됨
- 무거운 모델이나 외부 API 의존성을 제거하여 빠르고 가벼움
- 사용자가 원하는 모든 텍스트 필드에 쉽게 붙여넣기 가능
Yap
어디든 타이핑할 수 있는 곳에서 작동하는 매우 빠른 macOS 음성 받아쓰기 기능.
단축키를 누르고, 말하고, 다시 누릅니다. 사용하던 어떤 텍스트 필드에도 당신의 말이 입력됩니다. 계정 필요 없음, API 키 필요 없음, 기기를 벗어나는 오디오 없음.
Frigade가 제작했습니다.
</div>작동 방식
Yap은 메뉴 바에 상주하며 단축키를 기다립니다. 이를 실행하면 화면 하단 근처에 라이브 파형(live waveform)과 지금까지 말한 내용의 실시간 미리보기가 있는 작은 창이 나타납니다. 단축키를 다시 누르면 텍스트가 이미 작업 중이던 앱에 붙여넣어집니다. 모든 받아쓰기 내용은 로컬에 저장되므로 나중에 돌아와서 복사할 수 있습니다.
기본 단축키는 ⌘⇧D입니다. 이를 재설정하거나, 대신 하나의 수정자 키(modifier key)를 설정할 수도 있습니다. 여분의 엄지손가락이 있다면 오른쪽 shift만 누르는 것도 좋습니다.
설치
가장 빠른 방법은 웹사이트에서 다운로드하는 것입니다: frigade.com/yap. 또는 Homebrew를 사용하세요.
Homebrew
brew install --cask frigadehq/tap/yap
나중에 업데이트하려면:
brew upgrade --cask yap
직접 다운로드
웹사이트에서 Yap 다운로드하거나, Releases에서 .dmg 파일을 바로 가져오세요. 이를 Applications 폴더로 드래그합니다.
Yap은 Apple Silicon Mac의 macOS 26 (Tahoe)에서 작동합니다. Intel Mac은 지원하지 않습니다. 배포된 빌드는 서명 및 공증(notarized)되었으므로, macOS가 문제없이 열 수 있습니다.
개발 배경
macOS용 음성-텍스트 도구는 부족함이 없으며, 오픈 소스 중에는 정말 좋은 것도 많습니다. 하지만 대부분의 도구들이 비슷한 몇 가지 문제에 직면하고 있습니다:
- 일부는 비용이 발생하는데, 이는 이제 OS에 무료로 내장된 기능에 대해서는 너무 큰 요구입니다.
- 대부분은 무거운 모델을 다운로드하도록 만듭니다. Whisper 가중치(weights)는 수백 메가바이트에 달하며 RAM에 상주하고, 최신 고성능 Mac에서만 빠르다고 느껴집니다. 사양이 낮은 기기에서는 단락 하나를 되돌아오는 데 30초에서 1분까지 걸릴 수 있습니다.
- 많은 앱들이 Electron이나 웹 스택(web-stack) 기반의 애플리케이션이라, 메뉴 바 아이콘과 설정 창을 실행하기 위해 전체 브라우저 엔진이 메모리에 유휴 상태로 대기합니다.
- 사용하지 않을 설정과 모드들로 인해 부풀려진 경우도 많습니다.
- 일부는 클로즈드 소스(closed source)라, 오디오와 전사된 텍스트가 기기에 남아 있는지 확인할 방법 없이 신뢰해야 합니다.
최근에 바뀐 점은 macOS 26입니다. 이 OS는 SpeechAnalyzer와 SpeechTranscriber라는 두 가지 API를 추가했는데, 이는 OS가 자체적으로 제공하고 관리하는 모델을 사용하여 온디바이스(on-device) 스트리밍 음성 인식 기능을 구현합니다. 이 앱 자체는 어떤 모델도 포함하지 않으며, 첫 단어 전에 메모리에 아무것도 로드하지 않고, API 키나 분당 비용이 필요 없습니다. 말하는 즉시 텍스트가 돌아옵니다.
애플의 모델은 실제로 얼마나 좋을까요? 놀랍게도 대체하는 것보다 더 좋습니다. 최근 벤치마크에 따르면, 깨끗한 오디오에서 단어 오류율(word error rate)이 2.12%였고, 잡음이 있는 환경에서는 4.56%였습니다. 이는 Whisper Small의 3.74%와 7.95%보다 낮은 수치이며, 5,559개의 LibriSpeech 클립을 테스트했을 때 약 세 배 더 빨랐습니다.
그래서 Yap은 모델을 전혀 포함하지 않습니다. 전체가 오픈 소스인 네이티브 Swift로 작성된 4MB 크기의 앱으로, 대략 3천 줄 정도의 코드만 있으며 브라우저 엔진은 찾아볼 수 없습니다. 메모리 사용량은 약 60MB 수준이며 네트워크에 접근하지 않습니다. 저희는 Frigade에서 하루 종일 이 앱을 사용하는데, 주로 코딩 에이전트에게 프롬프트를 제공하거나, 이메일을 작성하고, 슬랙 메시지를 전송하는 등 말로 하는 것이 타이핑보다 빠르기만 하면 모든 것을 처리할 때 사용합니다.
기능
기능
- Apple의 Speech framework를 통한 온디바이스(On-device) 받아쓰기
- 전역 단축키(Global shortcut), 완전히 재설정 가능하며, 오른쪽 Shift와 같은 선택적 단일 수정자 트리거 지원
- 현재 포커스된 앱 필드에 바로 붙여넣기
- 검색, 복사, 삭제가 가능한 로컬 받아쓰기 기록
- 말하는 동안 실시간 파형(waveform) 및 부분 받아쓰기 제공
- Escape 키를 두 번 누르면 진행 중인 받아쓰기를 폐기할 수 있음
- 세션 중간에 변경되는 경우에도 시스템 기본 마이크를 따름
- 로그인 시 선택적 실행, 기본적으로 비활성화됨
- 메뉴 막대(menu bar), Dock, 둘 다 또는 어느 쪽도에 존재 — 설정에서 아이콘 중 하나를 숨기고 단축키만으로 실행 가능
- 계정 필요 없음, 네트워크 호출 없음, 원격 측정(telemetry) 데이터 전송 없음
요구 사항
macOS 26 (Tahoe) 이상 버전, Apple Silicon Mac에서 사용 가능. Yap은 macOS 26에 포함된 Apple의 음성 모델에 의존하며, SpeechAnalyzer는 Apple Silicon에서만 온디바이스로 실행됩니다. 우리는 인텔(Intel) 지원을 고의로 제외했습니다: 이전 기기에서 받아쓰기를 할 수 있는 유일한 방법은 오디오를 Apple로 전송하는 API였고, 이는 Yap이 제공하는 약속 중 하나를 깨뜨리기 때문입니다. 소스 코드 빌드를 위해서는 Xcode 26이 필요합니다.
권한
첫 실행 시 Yap은 네 가지 항목에 대한 권한을 요청하고 각각 설명합니다:
| 권한 | 이유 |
|---|---|
| 마이크(Microphone) | 사용자의 목소리를 듣기 위함 |
| ... | |
| 접근성(Accessibility)은 시스템 설정에서 수동으로 켜야 합니다. macOS는 사용자 대신 타이핑하는 모든 앱에 이를 요구하며, 프로그램적으로 부여할 방법이 없습니다. |
작동 방식
오디오는 AVAudioEngine을 통해 기본 입력 장치에서 나오고 분석기가 요청하는 형식으로 변환됩니다. 캡처는 음성 스택(speech stack) 초기화가 완료되기 전에 시작되며, 이 시간 동안 기록된 버퍼는 받아쓰기 기능이 연결되면 유지되었다가 플러시되므로 문장의 첫 단어가 잘리는 일이 없습니다.
음성 받아쓰기는 SpeechAnalyzer를 통해 휘발성 결과(volatile results)가 켜진 상태로 실행되며, 이것이 라이브 미리보기 기능을 제공하는 방식입니다. 다른 경로는 없습니다. SFSpeechRecognizer와 같은 이전 API는 특정 로케일에 온디바이스 모델이 없을 경우 Apple 서버에 폴백할 수 있기 때문에 Yap은 이를 사용하지 않습니다. 만약 SpeechAnalyzer가 장치에서 사용자의 언어를 처리할 수 없다면, 오디오를 어딘가로 전송하는 대신 받아쓰기가 중단됩니다.
텍스트 삽입 부분이 까다롭습니다. Yap은 텍스트를 클립보드에 작성하고, 시스템 이벤트를 통해 ⌘V를 실행한 다음, 이전 클립보드 내용을 복원합니다. Chromium 기반 앱들은 붙여넣기(pasteboard) 데이터를 비동기적으로 그리고 여러 번 읽기 때문에, 너무 일찍 복원하면 렌더러가 오래된 데이터(stale data)를 받게 됩니다. 이 사소한 디테일이 모든 곳에서 작동하는 것과 네이티브 앱에서만 작동하는 것을 가르는 차이점입니다.
상태는 한곳에 존재합니다. RecordingCoordinator는 작은 상태 기계(state machine)이며, 그 의존성들이 모두 프로토콜로 구성되어 있어 마이크가 필요하지 않은 단위 테스트로 로직을 커버할 수 있습니다.
FAQ
macOS 내장 받아쓰기를 사용하지 않는 이유가 무엇인가요?
Apple의 내장 받아쓰기 기능 역시 일부 작업을 온라인에서 수행하며, 심지어
SpeechAnalyzer는 Apple Silicon에서만 온디바이스로 작동합니다. Intel Mac을 커버하는 이전 방식은 SFSpeechRecognizer였는데, 이는 로케일에 온디바이스 모델이 없는 경우 오디오를 Apple로 전송할 수 있습니다. 그래서 우리는 약속을 조용히 깨뜨리는 것보다는 이 기능을 제거했습니다. 만약 사용자가 Intel Mac 사용자라면, 0.1.4 버전 이하에 머무르는 것이 좋습니다 (참고: 해당 Intel 버전은 API 호출을 Apple로 전송합니다).
로드맵
특별히 많은 계획이 있는 것은 아니며, 그것이 의도된 바입니다. Yap은 단 하나의 기능만 수행하며, 사용자가 생각할 필요가 없을 만큼 작게 유지하는 것이 주요 설계 원칙입니다. 대부분의 기능 아이디어는 이런 앱을 더 나쁘게 만듭니다.
하지만 우리는 완고하지 않습니다. 매일 사용할 만한 기능이 빠져 있다면 이슈를 열거나 풀 리퀘스트(pull request)를 보내주세요. 공정한 검토를 거칠 것입니다. 현재 Yap은 시스템 로케일을 따르기 때문에, 언어 선택기가 가장 유력한 다음 추가 기능입니다.
개발
단 한 줄로 소스에서 빌드하고 설치할 수 있습니다. 이 명령어는 Git을 복제(clone)하고, yap 디렉토리로 이동한 후, Yap을 /Applications에 배치하고 실행합니다:
git clone https://github.com/FrigadeHQ/yap.git && cd yap && ./install.sh
이 스크립트는 XcodeGen이 설치되어 있지 않으면 설치하고, 실행 중인 모든 복사본을 종료한 다음, 새 빌드로 교체합니다. 변경 사항이 있을 때마다 언제든지 ./install.sh를 다시 실행하여 재빌드할 수 있습니다.
Xcode에서 작업하는 것을 선호한다면:
xcodegen generate # project.yml로부터 Yap.xcodeproj 작성
open Yap.xcodeproj # 그리고 ⌘R로 실행
Xcode 프로젝트는 커밋되는 것이 아니라 생성되므로, 구성 변경 사항이 diff에서 읽기 쉬운 상태를 유지합니다.
테스트는 다음 명령어로 실행할 수 있습니다:
xcodebuild -project Yap.xcodeproj -scheme Yap -destination 'platform=macOS' test
로컬 빌드에 대해 알아야 할 점이 하나 있습니다. 로컬 빌드는 ad-hoc으로 서명되기 때문에 안정적인 식별자가 없어 macOS는 모든 재빌드를 완전히 새로운 애플리케이션으로 취급하며, 이전에 부여했던 권한을 잊어버립니다. 증상은 혼란스럽습니다. 시스템 설정(System Settings)의 체크박스는 여전히 활성화된 것처럼 보이지만, 붙여넣기 기능이 조용히 작동하지 않습니다. 이러한 문제를 해결하기 위해 설정에 정확히
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Code Generation의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기