이 글은 코드를 한 줄도 몰라도 따라 읽을 수 있게 썼습니다. 애플이 이번 macOS에 조용히 얹어놓은 새 음성인식 엔진을, 무거운 개발 도구 하나 설치하지 않고 터미널 몇 줄로 실제 음성 파일에 돌려본 과정을 그대로 담았습니다.
SpeechAnalyzer는 무엇일까요?
SpeechAnalyzer는 macOS 26 · iOS 26부터 애플이 새로 넣은 음성 인식(Speech-to-Text) 엔진입니다. 마이크나 오디오 파일에 담긴 사람 목소리를 텍스트로 바꿔주는 기능인데, 핵심은 이 모든 처리가 기기 안에서 끝난다는 점입니다. 인터넷에 오디오를 보내지 않고, 클라우드 서버도 거치지 않습니다.
기존에도 SFSpeechRecognizer라는 음성인식 API가 있었지만, 짧은 명령어나 받아쓰기 정도에 맞춰져 있었습니다. SpeechAnalyzer는 그보다 훨씬 긴 오디오 — 강의, 회의, 팟캐스트 같은 몇십 분짜리 녹음도 한 번에 처리하도록 새로 설계됐습니다.
- SpeechAnalyzer
- 오디오를 넣으면 분석을 진행하는 엔진 그 자체입니다. 여러 처리 모듈을 붙여서 씁니다.
- SpeechTranscriber
- SpeechAnalyzer에 붙이는 모듈 중 하나로, "음성 → 텍스트" 변환을 실제로 담당합니다.
- on-device
- "기기 내부에서 처리"라는 뜻입니다. 네트워크 연결 없이도 동작하고, 음성 데이터가 바깥으로 나가지 않습니다.
로컬에서 쓰려면 무엇이 필요할까요?
거창한 건 필요 없습니다. 아래 네 가지만 있으면 이 글에 나오는 모든 걸 그대로 따라 하실 수 있습니다.
왜 굳이 Xcode를 쓰지 않았을까요?
보통 애플 신기술을 테스트하려면 Xcode부터 설치하라고 합니다. 문제는 Xcode가 몇 GB짜리 대형 앱이라는 것입니다. "테스트만 해보고 싶은데 이걸 다 설치해야 하나" 하는 질문에서 이 프로젝트를 시작했습니다.
확인해보니 반전이 있었습니다. macOS 26이 깔린 Mac에는 이미 Command Line Tools라는 훨씬 가벼운 도구가 있는데, 여기에 SpeechAnalyzer가 포함된 최신 SDK가 이미 들어있었습니다. Xcode.app을 열지 않고도 코드를 컴파일할 수 있는 조건은 이미 갖춰져 있었던 셈입니다.
다만 패키지 관리 도구(Swift Package Manager)에 버전 불일치 버그가 있어서, 표준 방식(swift build)은 실패했습니다. 대신 컴파일러(swiftc)를 직접 호출해서 우회했는데, 결과적으로는 더 단순해졌습니다. 실제 방법은 아래 실습 단계에 그대로 담아뒀습니다.
즉 이 프로젝트의 진짜 결론은 "Xcode를 피해갔다"가 아니라, "macOS 26부터는 애초에 Xcode.app이 없어도 최신 API를 테스트할 수 있다"는 사실을 직접 확인한 것에 가깝습니다.
CLI로 이미 되는데, 왜 웹 화면까지 만들었을까요?
터미널 도구는 완성됐고 실제로 잘 작동했습니다. 그런데 매번 파일 경로를 정확히 타이핑하고, 로케일 값을 외워서 입력하고, 결과를 터미널 스크롤로 읽어야 하는 건 반복할수록 번거로웠습니다. 그래서 같은 엔진을 그대로 재사용하는 얇은 웹 화면을 하나 더 얹었습니다.
CLI만 있을 때
- 파일 경로를 정확히 입력해야 함
- 결과가 텍스트로만 주르륵 출력
- 처리 통계를 눈으로 계산해야 함
- 비개발자에게 공유하기 어려움
웹 UI를 더한 뒤
- 파일을 드래그 앤 드롭
- 처리 시간·속도·글자수를 자동 계산
- 완료 시 결과를 모달로 정리해서 표시
- 라이트/다크 테마 지원
핵심은, 웹 UI가 새로운 인식 로직을 추가한 게 아니라는 점입니다. 화면 뒤에서는 여전히 우리가 만든 그 swiftc 바이너리를 그대로 호출합니다. Python 표준 라이브러리만으로 만든 아주 가벼운 로컬 서버가 업로드된 파일을 받아서 CLI 도구에 넘기고, 그 결과를 예쁘게 포장해서 보여줄 뿐입니다. 엔진은 하나, 얼굴만 두 개인 셈입니다.
M3에서는 얼마나 빠를까요?
세 가지 오디오로 실제 처리 시간을 측정해봤습니다. 모두 인터넷 연결 없이, 오직 이 Mac 안에서만 처리된 수치입니다.
실시간 대비 약 129배
실시간 대비 약 160배
실시간 대비 약 141배 · 2,398자 인식
실감이 잘 안 나실 수도 있는데, 48분짜리 강의를 재생 시간의 1/160로 줄여서 처리했다는 뜻입니다. 커피 한 모금 마실 시간에 한 시간 가까운 녹음이 텍스트로 바뀝니다. 그것도 클라우드 서버를 한 번도 거치지 않고, 인터넷 요금도 API 사용료도 0원으로 말이죠.
이게 왜 중요할까요?
이 실험이 특별한 이유는 속도 그 자체보다, "실험실 수준의 AI"가 아니라 "지금 당장 쓸 수 있는 AI"라는 걸 직접 확인했다는 데 있습니다.
강의 녹음, 회의 내용, 개인 메모처럼 누구에게도 보내고 싶지 않은 음성이 있죠. SpeechAnalyzer는 그런 오디오를 외부로 한 바이트도 전송하지 않고, 3년 전 나온 노트북 칩만으로도 실시간보다 백 배 넘게 빠르게 처리합니다. 그리고 이걸 확인하는 데 필요했던 건 몇 GB짜리 개발 도구가 아니라, 이미 컴퓨터 안에 들어있던 가벼운 커맨드라인 도구 하나였습니다.
결국 이 글이 보여드리고 싶었던 건 하나입니다 — 최신 애플 AI 기능을 만져보는 데 생각보다 큰 장벽이 없다는 것입니다.
왕초보 실습 — 5단계로 직접 해보세요
아래 명령어를 순서대로 터미널(Terminal.app)에 그대로 복사해서 붙여넣고 Enter만 누르시면 됩니다. 에디터를 열 필요도, Swift 문법을 알 필요도 없습니다.
-
1
Command Line Tools 확인·설치
이미 설치돼 있는지 먼저 확인해보겠습니다.
$ xcode-select -p /Library/Developer/CommandLineTools
이렇게 경로가 나오면 이미 준비가 끝난 겁니다. 대신 에러가 뜨면 아래 명령으로 설치해주세요 (팝업이 뜨면 "설치"를 클릭하시면 됩니다. Xcode.app이 아니라 훨씬 가벼운 도구만 설치됩니다).
$ xcode-select --install -
2
작업 폴더 만들기
테스트용 폴더를 하나 만들고 그 안으로 이동하겠습니다.
$ mkdir -p ~/speechanalyzer-test && cd ~/speechanalyzer-test
-
3
Swift 코드 파일 만들기
아래 블록 전체를(cat부터 마지막 EOF까지) 통째로 복사해서 터미널에 붙여넣고 Enter를 누르시면, 에디터 없이도 main.swift 파일이 그대로 만들어집니다.
$ cat > main.swift << 'EOF' import Speech import AVFoundation import Foundation @main struct SpeechAnalyzerTest { static func main() async { guard CommandLine.arguments.count > 1 else { print("사용법: ./SpeechAnalyzerTest <오디오파일 경로> [locale, 기본값 ko-KR]") exit(1) } let path = CommandLine.arguments[1] let localeID = CommandLine.arguments.count > 2 ? CommandLine.arguments[2] : "ko-KR" let url = URL(fileURLWithPath: path) let locale = Locale(identifier: localeID) do { let transcriber = SpeechTranscriber(locale: locale, preset: .transcription) if let request = try await AssetInventory.assetInstallationRequest(supporting: [transcriber]) { print("온디바이스 언어 모델 다운로드 중...") try await request.downloadAndInstall() print("다운로드 완료.") } let audioFile = try AVAudioFile(forReading: url) let analyzer = SpeechAnalyzer(modules: [transcriber]) let resultsTask = Task { for try await result in transcriber.results { print("[결과] \(result.text)") } } try await analyzer.start(inputAudioFile: audioFile, finishAfterFile: true) try await analyzer.finalizeAndFinishThroughEndOfInput() await resultsTask.value print("완료.") } catch { print("에러 발생: \(error)") exit(1) } } } EOF
이 코드가 정확히 하는 일은 이렇습니다: 오디오 파일을 열고 → 필요하면 언어 모델을 한 번 내려받고 → SpeechAnalyzer에 넘겨서 → 인식된 텍스트를 한 줄씩 출력합니다.
-
4
컴파일하기
Xcode.app 없이, 방금 설치된 Command Line Tools의 SDK만으로 빌드하겠습니다.
$ SDK=$(xcrun --sdk macosx --show-sdk-path) $ swiftc -target arm64-apple-macos26 -sdk "$SDK" -parse-as-library \ main.swift -o SpeechAnalyzerTest \ -framework Speech -framework AVFoundation
몇 초 정도 걸립니다. 에러 없이 조용히 끝나면 SpeechAnalyzerTest라는 실행 파일이 폴더 안에 생긴 겁니다.
-
5
실제 오디오로 실행하기
갖고 계신 오디오 파일(mp3 / wav / m4a / caf 등 무엇이든) 경로를 넣고 실행해보세요.
$ ./SpeechAnalyzerTest ~/Desktop/내오디오.mp3 ko-KR 온디바이스 언어 모델 다운로드 중... 다운로드 완료. [결과] 여기에 인식된 텍스트가 그대로 출력됩니다 완료.
언어 모델 다운로드는 처음 한 번만 일어납니다. 두 번째 실행부터는 그 과정 없이 바로 인식 결과가 나옵니다. 영어 파일이면 마지막 인자만 en-US로 바꿔주시면 됩니다.
여기까지 오셨다면 Xcode.app 없이 macOS 26의 최신 온디바이스 음성인식을 직접 돌려보신 겁니다. 반복해서 쓰실 거라면, 앞서 설명해드린 것처럼 이 실행 파일을 그대로 호출하는 가벼운 웹 화면을 하나 얹으시면 매번 명령어를 치지 않아도 됩니다.