
Blurt는 Mac에서 단축키를 누르고 말하면 현재 포커스된 앱에 받아쓰기 결과를 붙여 넣는 오픈소스 앱이다. AssemblyAI API 키가 필요하며, 오디오를 Mac에서 AssemblyAI로 보내 음성을 텍스트로 바꾼다. MIT 라이선스로 제공되고 구독이나 계정은 필요하지 않다.
설치와 사용
Blurt는 Intel 및 Apple Silicon Mac에서 macOS 15 이상을 지원하며, Liquid Glass UI를 사용할 수 있는 macOS 26을 권장한다. AssemblyAI API 키가 필요하고 무료 요금제가 있다. Blurt.dmg를 내려받아 디스크 이미지를 연 뒤 Blurt.app을 Applications로 옮겨 설치한다.
처음 실행하면 설정 마법사가 마이크와 손쉬운 사용 권한을 요청하고 API 키를 입력받는다. 텍스트 입력란을 클릭한 뒤 기본 단축키인 오른쪽 ⌘ 키를 누르고 말하면 된다. 다시 눌러 받아쓰기를 끝내거나, 키를 누르고 있는 동안 말한 뒤 놓아 푸시 투 토크(push-to-talk) 방식으로 사용할 수도 있다. 말한 내용은 커서 위치에 정리된 텍스트로 들어간다. 메인 창의 Style 메뉴에서 문체를 선택하거나 설정에서 단축키, 마이크, 효과음을 바꿀 수 있다.
받아쓰기와 개인정보 처리
Blurt는 AppKit과 SwiftUI로 만든 네이티브 앱이며 Electron이나 웹 뷰를 사용하지 않는다. 외부 의존성이 없는 Swift 6 패키지 BlurtEngine이 마이크 입력, AssemblyAI 받아쓰기 API에 보내는 동기식 POST 요청, 클립보드 복사를 처리한다. 로컬 모델이나 업로드 후 결과를 반복 확인하는 작업 대기열, 백그라운드 데몬은 없다. 한 번 말할 때마다 HTTP 요청 한 번을 보내며, 음성 인식과 서버 측 대규모 언어 모델(LLM)의 문장 정리를 함께 수행한다. 제작자는 일반적으로 한 번의 왕복이 약 1초 안에 끝난다고 설명한다. 말하는 동안 HTTPS 연결을 미리 준비하고, 키를 놓으면 곧바로 ‘전사 중’ 상태로 바꾼다.
문장 정리에 쓰이는 문맥은 같은 세션에서 최근에 말한 내용과 커서 바로 앞의 짧은 텍스트다. 화면에 있는 앱 이름, 창 제목, 입력란, 선택 영역은 전송하지 않는다. 비밀번호 입력란은 읽지 않으며, 그곳에 받아쓴 내용도 문맥으로 저장하지 않는다. 설정에 등록한 핵심 용어와 선택한 스타일 지침도 요청에 포함된다. 텍스트 단축어는 응답을 받은 뒤 Mac에서 확장하므로 서버에 보내지 않는다.
최근 받아쓰기 기록은 메모리에만 보관하고 디스크에는 쓰지 않는다. Blurt를 종료하면 기록을 지우며, 최대 100건 또는 요청당 약 4096자까지만 보관하고 오래된 내용부터 제외한다. 따라서 앱이 실행 중일 때 한 앱에서 받아쓴 텍스트가 다른 앱에서 하는 받아쓰기 요청의 문맥으로 전송될 수 있다. Blurt는 오디오와 대본을 저장하지 않는다. 다만 기본 설정에서는 꺼져 있는 설정의 Advanced 메뉴에 있는 개발자 모드를 켜면 각 받아쓰기를 Mac의 로컬 로그에 기록한다.
Blurt는 원격 측정, 충돌 보고, 분석, 사용 추적을 보내지 않는다. AssemblyAI로 보내는 요청에는 Blurt 이름과 버전, macOS 버전을 담은 User-Agent가 포함된다. 이는 AssemblyAI가 문제를 해당 릴리스나 운영체제와 연결해 확인할 수 있도록 하는 정보다. macOS가 원래 보내던 헤더에는 앱, OS 빌드, 네트워크 라이브러리 빌드도 들어 있었다. 개인이나 Mac을 식별하는 정보는 없으며 설치별 ID나 카운터도 없다. 전사는 AssemblyAI가 처리하므로 해당 오디오에는 AssemblyAI 개인정보 처리방침과 서비스 약관이 적용된다.
주요 기능과 설정
- 받아쓰기 결과는 합성한 ⌘V 입력으로 현재 포커스된 앱에 붙여 넣는다. 기존 클립보드 내용은 저장했다가 복원한다. 말하는 동안 대상 앱이 종료되면 텍스트가 사라지는 대신 클립보드에 남는다.
- 기본 단축키는 오른쪽 ⌘이며 오른쪽 ⌥ 또는
fn으로 바꿀 수 있다. 한 번 누르기와 길게 누르기를 전환 동작으로 사용하거나, 설정에서 누르기 전용 또는 길게 누르기 전용으로 제한할 수 있다. 키 이벤트 감지는 단독 수정 키만 처리한다. 단독 수정 키는 원래 문자를 입력하지 않으며, ⌘C 같은 조합 키는 그대로 전달된다. - 스타일은 최대 네 개까지 저장할 수 있다. “항상 소문자로 쓰기”처럼 짧은 자유 형식 지침을 지정하고 메인 창의 Style 메뉴에서 바꾼다. 설정의 Styles에서 Enhanced transcripts를 끄면 정리 과정을 거치지 않은 그대로의 전사문을 붙여 넣는다.
- Vocabulary 설정에서는 이름과 전문용어의 철자를 유도할 핵심 용어를 등록하고, 말한 문구를 저장된 텍스트로 바꾸는 텍스트 단축어를 설정할 수 있다. 예를 들어 “개인 이메일”이라고 말하면 이메일 주소를 넣도록 할 수 있다. 단축어 확장은 붙여 넣기 전에 Mac에서 이뤄진다.
- 제작자는 AssemblyAI가 공개한 벤치마크에서 Whisper보다 환각이 30% 적다고 소개한다. 18개 언어를 자동 감지하며 문장 중간에 언어를 바꿔 말할 수도 있다.
- 화면 위에 뜨는 표시창은 실시간 마이크 음량과 처리 단계, 메뉴 막대 표시기는 받아쓰기 상태를 보여준다. 시작과 종료 효과음은 Yamaha DX7 또는 Roland Juno-106 소리로 설정하거나 끌 수 있다.
- 설정의 Advanced에는 초기화 기능이 있다. API 키와 설정, 권한 허가를 지운 뒤 앱을 처음 실행하는 상태로 다시 시작해 권한 문제를 초기화할 수 있다.
- Blurt는 하루 한 번 또는 사용자가 요청할 때 Sparkle로 새 버전을 확인한다. 업데이트는 사용자가 허용하면 설치되며, 설치 전 서명과 검증을 거친다. Advanced 설정에서 매일 확인을 끄거나 업데이트를 자동 설치하도록 바꿀 수 있다.
소스 빌드와 구성
소스에서 빌드하려면 전체 Xcode 26 이상(Command Line Tools만으로는 안 됨), Homebrew, Apple Development 인증서가 필요하다. Xcode의 Settings → Accounts에 Apple ID를 추가하면 인증서를 무료로 받을 수 있다.
scripts/bootstrap.sh # one-time: install the toolchain from Brewfile
scripts/dev-build.sh # build + install "Blurt Dev" to /Applications
open -a "Blurt Dev" # run it
scripts/check.sh # full repo health check — the same script CI runs
swift test # engine unit tests only
dev-build.sh는 macOS가 빌드 디렉터리에 있는 앱에 손쉬운 사용 및 입력 모니터링 권한을 등록하지 않기 때문에 앱을 /Applications에 설치한다. 앱은 별도 번들 ID를 사용하는 Blurt Dev.app으로 설치되므로 정식 Blurt와 나란히 둘 수 있다. 자세한 로컬 설정과 각 스크립트, 서명 및 변경 사항 반영 절차는 CONTRIBUTING.md에, 구성 설명은 AGENTS.md에 있다.
저장소는 MIT 라이선스다. BlurtEngine은 마이크 입력, 받아쓰기 API 전사, 포커스된 앱에 붙여 넣기 기능을 제공하는 독립 패키지로, 세 가지 프로토콜 경계 뒤에 구현을 두고 테스트에서 대체할 수 있다. 개발 안내는 Sources/BlurtEngine/README.md에서 볼 수 있다.
Sources/BlurtEngine/ Swift 6 package owning the pipeline — no external dependencies
Audio/ MicCapture: fresh AVCaptureSession per session, 16 kHz mono PCM,
live level meter; DX7/Juno-106 sound packs
STT/ AssemblyAITranscriber: one POST to dictation.assemblyai.com/v1/transcribe/live
(STT + LLM rewrite); STTPrompt (contextual priming:
your recent dictations then the text before the cursor, and
nothing else about your screen)
Pipeline/ DictationSession actor: press/release/cancel commands, phase
stream, auto-release before the API's recording cap
Hotkey/ DictationKeyGate/Router: pure, unit-tested state machine for the
lone-modifier trigger (tap vs hold vs combo)
Injection/ KeyInjector: save clipboard → paste via synthesized ⌘V → restore
FocusCapture/ Accessibility reads of the focused app/window/field, kept local:
paste spacing and the developer-mode log
Config/ Keychain API-key store, key terms, styles, text shortcuts
App/Blurt/ AppKit/SwiftUI shell (Xcode project generated by XcodeGen)
AppCoordinator.swift the one place the engine is composed for the real app
Hotkey/ DictationKeyTap: the CGEventTap feeding the engine's key gate
Overlay/, MenuBar/ floating status pill, menu bar dictation indicator
Update/ UpdaterModel: the Sparkle updater behind every "Check for Updates"
Wizard/ setup wizard + settings window
App/BlurtiOS/ the iPhone app and its keyboard (in development; README.md there)
BlurtiOSCore/ the logic, apart from the UI: the App Group contract between the
app and the keyboard, the keyboard's model and rules
BlurtiOS/Sources/ the app: listens and transcribes over the engine's pipeline
BlurtKeyboard/Sources/ the keyboard: a remote control that inserts the words, since
iOS lets no keyboard use the microphone
iOS 앱과 키보드는 개발 중이며 관련 설명은 해당 디렉터리의 README.md에 있다. iOS에서는 키보드가 마이크를 사용할 수 없으므로 키보드는 받아쓰기 앱을 원격으로 제어해 텍스트를 삽입하는 방식으로 구성된다.
응답 속도에 관한 설명
저장소의 지연 시간 설명에 따르면 체감 속도는 주로 준비 작업에 달려 있다. press()는 기다리지 않고 HTTPS 연결을 준비하며 포커스된 입력란의 문맥을 읽기 시작한다. release()는 녹음 내용을 디스크에서 읽기 전에 ‘전사 중’ 상태를 설정하므로 정지 효과음은 입출력 작업이 끝난 뒤가 아니라 키를 놓을 때 재생된다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요