ON-DEVICE AI 실습기
zsh — SpeechAnalyzerTest

Xcode 없이, 터미널만으로
Apple의 새 음성인식 API를 켜봤다

작성자: 정진호 + Sonnet 5

macOS 26(Tahoe)에 조용히 들어온 SpeechAnalyzer를 MacBook Pro M3 Pro에서 직접 빌드하고, 실제 48분짜리 강의 녹음까지 돌려봤습니다. 코드를 한 줄도 몰라도 그대로 복사·붙여넣기만으로 따라올 수 있게 정리했습니다.

이 글은 코드를 한 줄도 몰라도 따라 읽을 수 있게 썼습니다. 애플이 이번 macOS에 조용히 얹어놓은 새 음성인식 엔진을, 무거운 개발 도구 하나 설치하지 않고 터미널 몇 줄로 실제 음성 파일에 돌려본 과정을 그대로 담았습니다.

what-is speechanalyzer

SpeechAnalyzer는 무엇일까요?

SpeechAnalyzer는 macOS 26 · iOS 26부터 애플이 새로 넣은 음성 인식(Speech-to-Text) 엔진입니다. 마이크나 오디오 파일에 담긴 사람 목소리를 텍스트로 바꿔주는 기능인데, 핵심은 이 모든 처리가 기기 안에서 끝난다는 점입니다. 인터넷에 오디오를 보내지 않고, 클라우드 서버도 거치지 않습니다.

기존에도 SFSpeechRecognizer라는 음성인식 API가 있었지만, 짧은 명령어나 받아쓰기 정도에 맞춰져 있었습니다. SpeechAnalyzer는 그보다 훨씬 긴 오디오 — 강의, 회의, 팟캐스트 같은 몇십 분짜리 녹음도 한 번에 처리하도록 새로 설계됐습니다.

알아두면 좋은 용어 3가지
SpeechAnalyzer
오디오를 넣으면 분석을 진행하는 엔진 그 자체입니다. 여러 처리 모듈을 붙여서 씁니다.
SpeechTranscriber
SpeechAnalyzer에 붙이는 모듈 중 하나로, "음성 → 텍스트" 변환을 실제로 담당합니다.
on-device
"기기 내부에서 처리"라는 뜻입니다. 네트워크 연결 없이도 동작하고, 음성 데이터가 바깥으로 나가지 않습니다.
requirements --check

로컬에서 쓰려면 무엇이 필요할까요?

거창한 건 필요 없습니다. 아래 네 가지만 있으면 이 글에 나오는 모든 걸 그대로 따라 하실 수 있습니다.

필수
macOS 26 (Tahoe) 이상
SpeechAnalyzer는 이번 OS부터 추가된 API라, 그 이전 macOS에는 아예 존재하지 않습니다.
필수
Apple Silicon Mac
M1 이상 칩에 내장된 Neural Engine이 온디바이스 인식 속도를 책임집니다. 이 글의 테스트는 M3 Pro로 진행했습니다.
필수
Command Line Tools
Xcode.app 전체가 아니라, 훨씬 가벼운 커맨드라인 도구만 있으면 됩니다. 이유는 바로 다음 챕터에서 설명하겠습니다.
선택
터미널 사용 경험
없어도 괜찮습니다. 이 글의 명령어를 그대로 복사해서 붙여넣기만 하면 됩니다.
why --no-xcode

왜 굳이 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를 테스트할 수 있다"는 사실을 직접 확인한 것에 가깝습니다.

why --web-ui

CLI로 이미 되는데, 왜 웹 화면까지 만들었을까요?

터미널 도구는 완성됐고 실제로 잘 작동했습니다. 그런데 매번 파일 경로를 정확히 타이핑하고, 로케일 값을 외워서 입력하고, 결과를 터미널 스크롤로 읽어야 하는 건 반복할수록 번거로웠습니다. 그래서 같은 엔진을 그대로 재사용하는 얇은 웹 화면을 하나 더 얹었습니다.

CLI만 있을 때

  • 파일 경로를 정확히 입력해야 함
  • 결과가 텍스트로만 주르륵 출력
  • 처리 통계를 눈으로 계산해야 함
  • 비개발자에게 공유하기 어려움

웹 UI를 더한 뒤

  • 파일을 드래그 앤 드롭
  • 처리 시간·속도·글자수를 자동 계산
  • 완료 시 결과를 모달로 정리해서 표시
  • 라이트/다크 테마 지원

핵심은, 웹 UI가 새로운 인식 로직을 추가한 게 아니라는 점입니다. 화면 뒤에서는 여전히 우리가 만든 그 swiftc 바이너리를 그대로 호출합니다. Python 표준 라이브러리만으로 만든 아주 가벼운 로컬 서버가 업로드된 파일을 받아서 CLI 도구에 넘기고, 그 결과를 예쁘게 포장해서 보여줄 뿐입니다. 엔진은 하나, 얼굴만 두 개인 셈입니다.

benchmark --run

M3에서는 얼마나 빠를까요?

세 가지 오디오로 실제 처리 시간을 측정해봤습니다. 모두 인터넷 연결 없이, 오직 이 Mac 안에서만 처리된 수치입니다.

0
5분짜리 원본 에세이 음성을 2.29초만에 인식했습니다 — 실시간 재생보다 이만큼 빨랐습니다
테스트 1 · 문학 텍스트(TTS)
0.83
오디오 107초 → 처리 0.83초
실시간 대비 약 129배
테스트 2 · 실제 강의 녹음(48분)
18.0
오디오 2,877초 → 처리 18.04초
실시간 대비 약 160배
테스트 3 · 원본 에세이(5분)
2.29
오디오 324.1초 → 처리 2.29초
실시간 대비 약 141배 · 2,398자 인식

실감이 잘 안 나실 수도 있는데, 48분짜리 강의를 재생 시간의 1/160로 줄여서 처리했다는 뜻입니다. 커피 한 모금 마실 시간에 한 시간 가까운 녹음이 텍스트로 바뀝니다. 그것도 클라우드 서버를 한 번도 거치지 않고, 인터넷 요금도 API 사용료도 0원으로 말이죠.

so-what

이게 왜 중요할까요?

이 실험이 특별한 이유는 속도 그 자체보다, "실험실 수준의 AI"가 아니라 "지금 당장 쓸 수 있는 AI"라는 걸 직접 확인했다는 데 있습니다.

강의 녹음, 회의 내용, 개인 메모처럼 누구에게도 보내고 싶지 않은 음성이 있죠. SpeechAnalyzer는 그런 오디오를 외부로 한 바이트도 전송하지 않고, 3년 전 나온 노트북 칩만으로도 실시간보다 백 배 넘게 빠르게 처리합니다. 그리고 이걸 확인하는 데 필요했던 건 몇 GB짜리 개발 도구가 아니라, 이미 컴퓨터 안에 들어있던 가벼운 커맨드라인 도구 하나였습니다.

결국 이 글이 보여드리고 싶었던 건 하나입니다 — 최신 애플 AI 기능을 만져보는 데 생각보다 큰 장벽이 없다는 것입니다.

follow-along --now

왕초보 실습 — 5단계로 직접 해보세요

아래 명령어를 순서대로 터미널(Terminal.app)에 그대로 복사해서 붙여넣고 Enter만 누르시면 됩니다. 에디터를 열 필요도, Swift 문법을 알 필요도 없습니다.

  1. 1

    Command Line Tools 확인·설치

    이미 설치돼 있는지 먼저 확인해보겠습니다.

    $ xcode-select -p
    /Library/Developer/CommandLineTools

    이렇게 경로가 나오면 이미 준비가 끝난 겁니다. 대신 에러가 뜨면 아래 명령으로 설치해주세요 (팝업이 뜨면 "설치"를 클릭하시면 됩니다. Xcode.app이 아니라 훨씬 가벼운 도구만 설치됩니다).

    $ xcode-select --install
  2. 2

    작업 폴더 만들기

    테스트용 폴더를 하나 만들고 그 안으로 이동하겠습니다.

    $ mkdir -p ~/speechanalyzer-test && cd ~/speechanalyzer-test
  3. 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. 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. 5

    실제 오디오로 실행하기

    갖고 계신 오디오 파일(mp3 / wav / m4a / caf 등 무엇이든) 경로를 넣고 실행해보세요.

    $ ./SpeechAnalyzerTest ~/Desktop/내오디오.mp3 ko-KR
    온디바이스 언어 모델 다운로드 중...
    다운로드 완료.
    [결과] 여기에 인식된 텍스트가 그대로 출력됩니다
    완료.

    언어 모델 다운로드는 처음 한 번만 일어납니다. 두 번째 실행부터는 그 과정 없이 바로 인식 결과가 나옵니다. 영어 파일이면 마지막 인자만 en-US로 바꿔주시면 됩니다.

여기까지 오셨다면 Xcode.app 없이 macOS 26의 최신 온디바이스 음성인식을 직접 돌려보신 겁니다. 반복해서 쓰실 거라면, 앞서 설명해드린 것처럼 이 실행 파일을 그대로 호출하는 가벼운 웹 화면을 하나 얹으시면 매번 명령어를 치지 않아도 됩니다.