iOS 26 SpeechAnalyzer 라이브 마이크: 설정, 결과 및 문제 해결
이 페이지는 영어 원문을 기계 번역한 것입니다. 영어 원문 보기
실시간 iOS 26 마이크 파이프라인의 경우, 장치 및 로케일 지원을 확인하고, 모델 자산을 준비하며, 호환 가능한 PCM 형식을 확보하고, 오디오를 제공하는 동안 인식 결과를 활용하십시오. 정상적인 완료와 취소를 별도로 처리하여 마지막 단어가 최종이 되도록 하십시오. 이 가이드는 Apple의 API 문서와 현재 SimpleMemo 라이브 마이크 샘플을 따르며, 별도로 다운로드할 수 있는 준비 도우미도 포함되어 있습니다.
전체 샘플부터 시작한 다음 파이프라인을 검사하십시오
The MIT 라이선스 저장소는 SpeechSession을 iOS 26 호스트 앱용 Swift 패키지로 공개합니다. Xcode의 패키지 종속성 아래에 저장소를 추가하고 SpeechAnalyzerLiveMic 제품을 연결하십시오. 해당 README는 SwiftUI 뷰를 표시하여 finalizedText를 표시하고, volatileText을 별도로 렌더링하며, 세션이 준비되는 동안 시작을 비활성화합니다.
완전한 앱 프로젝트를 위해서는 README의 XcodeGen 경로를 따르십시오. 또는 제공된 앱 소스를 새 iOS 26 앱에 복사하십시오. 하나의 통합 경로를 사용하여 동일한 유형을 두 번 정의하지 않도록 하십시오. 이 패키지는 메모 저장, 이메일 전송 또는 Obsidian 통합을 구현하지 않습니다.
링크된 샘플은 마이크 및 음성 인식 권한을 요청합니다. 해당 호스트 앱은 NSMicrophoneUsageDescription 및 NSSpeechRecognitionUsageDescription을 제공해야 하며, 패키지를 추가하면 해당 호스트 설명을 제공할 수 없습니다. 권한 사용을 설명하고, 거부 및 준비 상태를 표시하며, 사용자가 언제 녹화할지 선택하도록 하십시오. 아래 도우미는 허가를 요청하거나 마이크를 시작하지 않습니다.
Apple의 공식 실시간 전사 샘플과 WWDC25 세션은(는) 아키텍처에 유용한 참고 자료입니다. SpeechAnalyzer는 모듈을 좌표합니다; 이는 지원되는 시스템을 위한 추가 API이며, 모든 기존 SFSpeechRecognizer 코드가 구식이라고 가정할 이유가 아닙니다.
녹화하기 전에 지원, 자산 및 형식을 준비하십시오
SpeechTranscriber는 런타임 장치 및 로케일 검사를 제공합니다. iOS 버전 확인만으로는 충분하지 않습니다. 다음 헬퍼는 구성된 전사기, 분석기 및 오디오 형식을 반환하거나 특정 준비 오류를 발생시킵니다.
전체 Swift 준비 도우미를 다운로드하십시오. 전체 파일에는 가져오기, 결과 및 오류 유형과 아래에서 논의되는 DictationTranscriber 힌트 도우미가 포함되어 있습니다. 이것은 전체 녹음 앱이 아니라 설정 구성 요소입니다.
@available(iOS 26.0, *)
@MainActor
public func prepareSpeechAnalyzer(
requestedLocale: Locale,
naturalFormat: AVAudioFormat? = nil
) async throws -> PreparedSpeechAnalyzer {
guard SpeechTranscriber.isAvailable else {
throw SpeechPreparationError.deviceUnavailable
}
guard let locale = await SpeechTranscriber.supportedLocale(
equivalentTo: requestedLocale
) else {
throw SpeechPreparationError.unsupportedLocale
}
let transcriber = SpeechTranscriber(
locale: locale,
preset: .progressiveTranscription
)
// The system may already have the asset; nil means no install is needed.
// A request can automatically reserve the locale or throw if no slot is free.
if let request = try await AssetInventory.assetInstallationRequest(
supporting: [transcriber]
) {
try await request.downloadAndInstall()
}
try Task.checkCancellation()
guard await AssetInventory.status(forModules: [transcriber]) == .installed else {
throw SpeechPreparationError.assetsNotInstalled
}
guard let format = await SpeechAnalyzer.bestAvailableAudioFormat(
compatibleWith: [transcriber], considering: naturalFormat
) else {
throw SpeechPreparationError.noCompatibleFormat
}
let analyzer = SpeechAnalyzer(modules: [transcriber])
try await analyzer.prepareToAnalyze(in: format)
return PreparedSpeechAnalyzer(
locale: locale, transcriber: transcriber,
analyzer: analyzer, audioFormat: format
)
}
AssetInventory는 공유 시스템 모델을 관리합니다. 모델이 시스템이나 다른 앱에 의해 이미 설치되어 있을 수 있습니다. 설치 요청은(는) 설치가 필요하지 않을 경우 nil을 반환합니다; 그렇지 않으면 로케일을 예약하고 다운로드를 시작할 수 있습니다. 예약 제한은 오류를 일으킬 수도 있습니다. 앱의 기능 전반에 걸쳐 예약을 관리하고, 앱 내 다른 곳에서 아직 사용 중인 모델을 공개하는 대신 더 이상 필요하지 않을 때 로케일을 해제하십시오.
오프라인에 가기 전에 필요한 로케일을 준비하고 준비 상태를 확인하십시오. 모델 자산은 앱 번들 외부에 저장되어 있지만, 여전히 시스템 저장 공간을 차지하며 시간이 지남에 따라 변경될 수 있습니다. 호스트 UI에서 다운로드 진행 상황 및 취소를 표시합니다. “On-device recognition”은 “준비나 네트워크 접근이 전혀 필요하지 않다”는 의미가 아닙니다.
분석기가 허용하는 형식으로 PCM을 입력합니다
AVAudioEngine microphone tap
-> owned PCM / conversion for the selected format
-> AsyncStream<AnalyzerInput>
-> SpeechAnalyzer + SpeechTranscriber
-> result consumer and UI state
오디오 세션을 활성화한 후, 입력 노드의 실제 형식을 확인하십시오. 샘플 속도를 하드코딩하지 마십시오. 장치나 경로가 이전에 해당 속도를 자주 사용했기 때문입니다. 적절한 경우 bestAvailableAudioFormat(compatibleWith:considering:)에 자연 형식을 전달하고 선택적 결과를 풀어냅니다. Apple은 분석기가 입력을 투명하게 재샘플하거나 변환하지 않음을 문서화합니다.
리포지토리의 AudioBufferConverter은 이미 일치하는 버퍼를 그대로 반환하며, 형식이 다를 경우 AVAudioConverter을 사용합니다. 불일치 형식에 대해서는 변환이 필요하며, 모든 버퍼에 대한 포괄적인 추가 단계가 아닙니다. 출력 프레임 길이를 확인하고 변환 오류를 보고하십시오; 모든 실패 버퍼를 조용히 삭제하면 녹음 UI가 정상으로 보이지만 텍스트가 생성되지 않습니다.
큐된 오디오에 명시적인 소유권 정책을 적용하십시오. 업데이트된 샘플 변환기는 형식이 이미 일치하더라도 독립적인 PCM 저장소를 반환하므로, 나중에 입력을 재사용하면 대기 중인 오디오를 덮어쓰지 않습니다. 오디오 콜백이 제공하는 버퍼는 콜백이 반환된 후에도 불변 상태로 유지된다고 가정해서는 안 됩니다. 나중에 사용하도록 대기열에 넣을 경우, 적절한 소유 복사본이나 버퍼 수명이 제어되는 파이프라인을 배치하십시오. 버퍼별 UI 변이를 오디오 콜백에서 제외하십시오. 프로덕션의 경우, 큐 작업을 어떻게 바인딩할지 결정하고 과부하 또는 라우트 변경을 처리하십시오.
Swift 6에서는 로컬 변수를 캡처하는 것만으로는 파이프라인이 스레드 안전하다는 것을 증명하지 못합니다. 현재 샘플의 변환기는 단일 처리 스레드 계약과 하나의 변환기 콜백을 위한 개인 잠금 보호 @unchecked Sendable 홀더를 가지고 있습니다. 모든 PCM 버퍼나 변환기가 일반적으로 스레드 간에 공유하기에 안전하도록 만들지는 않습니다. 샘플을 적용하기 전에 해당 계약서를 읽어 주세요.
휘발성 결과를 교체하고; 완료하기 전에 입력을 완료하십시오
프로그레시브 결과가 활성화된 경우, 변동성 결과가 오디오 범위에 대해 텍스트를 수정할 수 있습니다. 모든 부분 결과를 새 문장으로 추가하지 마십시오. 간단한 샘플은 최종 텍스트와 교체 가능한 volatile 꼬리를 유지합니다. 보다 풍부한 편집을 위해 업데이트를 오디오 범위에 맞추고 최종 구간을 별도로 보존하십시오. Apple은 WWDC 세션의 결과 부분에서 이 동작을 설명합니다.
- 일반적인 정지 동작에서는 새로운 마이크 오디오 생성을 중지하고 탭을 한 번 제거하십시오.
AsyncStream입력 연속을 완성하여 분석기가 입력의 끝을 볼 수 있도록 하십시오.finalizeAndFinishThroughEndOfInput()을 기다리십시오, 결과‐소비자 작업은 그대로 유지됩니다.- 결과 소비가 완료될 때까지 기다린 후, 최종 텍스트를 커밋하고 세션 리소스를 릴리스하십시오.
최종화는 입력 종료 및 소비를 기다립니다. 프로듀서가 끝내지 않을 때 전화를 걸면 떠날 수 있습니다. 기다리지 마세요. 결과 작업을 즉시 취소하면 저장하려던 꼬리를 잃을 수도 있습니다. 발화를 버리는 취소 작업은 정상적인 최종 결과라고 가장하는 대신 의도적인 취소 경로를 사용해야 합니다.
공개 패키지는 여전히 학습 샘플입니다. 현재 stop()은 소비자를 최종 완료한 뒤 취소하며, 별도의 소비자 완료 확인서를 노출하지 않습니다. 모든 최종 결과를 유지하는 것이 중요하다면, 그 라이프사이클을 조정하고 테스트하십시오. 또한 테스트는 준비 중에 중지하고, 반복 탭을 수행하며, 종료, 중단을 확인하고, 오류 후 재시작합니다.
어휘 지원은 transcriber 모듈에 따라 달라집니다
새로운 Speech API에 맥락 어휘 지원이 없다고 말하는 것은 부정확합니다. Apple 문서 AnalysisContext.contextualStrings를 DictationTranscriber에 사용합니다. 문서에서는 짧은 구문과 태그 전반에 걸쳐 최대 100 구문을 권장합니다. 그것은 동일한 힌트가 SpeechTranscriber를 맞춤화한다는 약속이 아닙니다.
// For an analyzer configured with DictationTranscriber.
let context = AnalysisContext()
context.contextualStrings[.general] = ["Obsidian", "Yurica"]
try await analyzer.setContext(context)
setContext(_:)은 현재 컨텍스트를 대체하므로 필요할 때 기존 애플리케이션 컨텍스트를 보존하거나 병합하십시오. 다운로드 가능한 도우미는 100 구문을 더 이상 거부하고, 이를 조용히 잘라버리는 대신 거부합니다. 구절 힌트는 DictationTranscriber에 문서화된 맞춤형 언어 모델 옵션과 구별되며, 두 옵션 모두 모든 이름을 올바르게 인식한다는 보장을 하지 않습니다. 앱에 필요한 모듈과 언어를 선택하고 테스트하십시오.
녹음 시 텍스트가 생성되지 않을 경우, 실패한 단계를 찾으십시오.
| 증상 | 다음을 확인하십시오 | 유용한 증거 |
|---|---|---|
| 준비가 실패했습니다 | 장치 지원, 정규화된 로케일, 자산 상태 및 예약/다운로드 오류 | OS 및 장치, 요청/선택된 로케일, 오류 도메인 및 코드 |
| Mic UI가 활성화되어 있으며, 버퍼가 없습니다. | 권한, 오디오 세션 활성화, 경로, 엔진 시동 및 탭 수명 주기 | 콜백이 도착하는지 여부; 샘플 레이트와 채널 수 입력 |
| 버퍼가 도착했습니다, 텍스트가 없습니다 | 호환 형식, 비영 변환기 출력, 입력 및 활성 결과 작업 | 입력/출력 프레임 수와 첫 번째 실제 파이프라인 오류 |
| 말이 반복됩니다 | 휘발성 리비전이 교체되는 대신 추가되고 있는지 | 결과 오디오 범위 및 최종/휘발성 플래그 |
| 마지막 단어가 사라집니다 | 입력 완료 및 최종화 중 소비자 수명 | 마지막 입력 시간, 최종 완료 및 최종 결과 수신 |
| 오프라인 실행 실패 | 해당 장치 및 로케일에서 필요한 모델 준비 | 연결 해제 전 자산 상태 및 설정된 설정 오류 |
진단을 위해서는 단계 타이밍, 프레임 수, 로케일 및 오류 정보를 시작하십시오. 모든 로그 항목마다 원시 녹음 및 인식된 텍스트가 필요하지 않습니다. 사용자가 복제본을 공유하는 경우, 개인 대화 대신 짧고 민감하지 않은 테스트 문구와 관련 구성을 요청하십시오.
검사된 항목과 장치에서 측정해야 할 항목
이 문서는 Apple 문서와 Xcode 26.6에 대해 9월 9, 2026에 대해 검사되었습니다. 다운로드 가능한 헬퍼는 iOS 26 시뮬레이터 대상에 대해 완전한 엄격한 동시성으로 Swift 6 유형 검사를 통과합니다. 오디오를 녹음하지 않으며, 이 검사는 음성 정확성, 성공적인 자산 설치, 혹은 종단 간 마이크 세션을 입증하지 못합니다.
리비전 1befcce의 공개 샘플은 9월 9일에 PCM 변환기 테스트 네 개와 iOS Simulator 빌드를 통과했습니다. 두 테스트는 변환 후 원본 버퍼를 재사용하고, 모노 부동소수점 출력과 인터리브 스테레오 정수 출력이 온전히 유지되는지 확인합니다. 두 테스트 모두 형식이 일치하면 그대로 통과시키던 이전 구현에서는 실패합니다. README는 패키지 리팩터링 이후 실제 iOS 기기에서 다시 테스트하지 않았다고 명시합니다. 이 페이지에 이전에 있던 지연 시간 수치는 현재 패키지의 벤치마크가 아닙니다.
귀하의 앱을 위해 장치, OS, 로케일, 오디오 경로, 모델 준비 상태 및 정확한 타이밍 경계를 기록하십시오. 첫 번째 휘발성 텍스트, 첫 번째 최종 텍스트, 그리고 정규 정지 완성을 별도로 측정합니다. 준비된 자산이 있는 세션과 준비가 필요한 세션을 비교하십시오. 고정된 민감하지 않은 구절을 반복하고, 누락되었거나 중복된 마지막 단어와 속도를 검사하십시오. 하나의 타이밍 결과만으로 Neural Engine 동작이나 하드웨어 제한을 추론하지 마십시오.
Apple Watch에서, 앱에 맞는 경우 별도의 시스템 텍스트 입력 흐름을 사용하십시오. TextFieldLink은 시스템 인터페이스를 열지만, 받아쓰기가 이미 녹음되고 있음을 확인하지 않습니다. SpeechAnalyzer는 watchOS에서 사용할 수 없으며, iOS 패키지는 Watch 마이크 구현이 아닙니다.
자주 묻는 질문
SpeechAnalyzer가 오프라인에서 작동합니까?
SpeechTranscriber는 기기에서 오디오를 처리하지만, 필요한 모델을 사용할 수 있어야 합니다. 앱을 처음 실행하기 전에 이미 모델 파일이 준비되어 있을 수도 있습니다. 오프라인으로 사용하기 전에 확인하고 준비하세요. 모든 최초 실행에 다운로드가 필요하다거나, 이전에 설치한 모델이 항상 남아 있다고 가정하지 마세요.
맞춤 어휘를 추가할 수 있나요?
Apple은 DictationTranscriber용 AnalysisContext.contextualStrings를 문서화하며, 해당 모듈은 맞춤형 언어 콘텐츠 힌트도 공개합니다. 이는 SpeechTranscriber에 대한 동일한 기능에 대한 문서가 아닙니다. 모듈을 신중하게 선택하고 필요한 단어와 로케일을 테스트하십시오.
왜 앱은 기록은 되지만 텍스트는 표시되지 않나요?
장치 및 로케일 지원, 자산 상태, 마이크 입력, 선택적 분석기 형식, 변환기 출력, 입력 순서 및 결과 소비자를 확인하십시오. 모든 빈 결과를 형식 문제로 처리하는 대신 실제 오류를 표시하십시오.
멈췄을 때 마지막 말을 어떻게 유지하나요?
오디오 생성을 중지하고, 입력 연속을 완료한 뒤, 분석기가 입력이 끝날 때까지 완료하도록 하십시오. 최종 결과를 받기 위해 결과 소비자를 살아 있게 유지하십시오. 취소는 별도의 폐기 경로이며, 정상적인 완료를 대체하는 것이 아닙니다.
이 샘플은 Apple Watch에서 실행됩니까?
아니오. 연결된 마이크 세션은 iOS 26 예시이며, SpeechAnalyzer는 watchOS에서 사용할 수 없습니다. Watch 앱은 TextFieldLink와 같은 시스템 텍스트 입력을 사용할 수 있으며, 이는 시스템 입력 인터페이스를 제공하고 받아쓰기 녹음이 시작되었음을 증명하지 않습니다.
샘플에 대해 무엇이 검증되었습니까?
링크된 저장소는 9월 9, 2026에 대한 네 개의 변환기 테스트와 iOS 시뮬레이터 빌드를 기록하며, 재사용된 소스 버퍼 스토리지를 위한 두 개의 회귀를 포함합니다. 물리적 장치 재시험은 청구되지 않습니다. 이 가이드의 준비 도우미는 9월 9에서 Swift 6 완전 엄격 동시성 모드에서 Xcode 26.6으로 타입 검사를 수행되었습니다. 이러한 검사는 마이크 정확도, 모델 다운로드 동작 또는 지연 시간을 입증하지 않습니다.
이와 Simple Memo의 관계
이 가이드와 무료 샘플은 SimpleMemo 개발자가 관리합니다. 앱의 voice input guide는 제품 워크플로우를 설명합니다. 샘플 자체는 이메일을 보내지 않으며 Obsidian에 아무것도 저장하지 않습니다. Simple Memo에서는 이메일에 수신자 설정 및 인증이 필요하고, Obsidian 저장에는 통합 및 대상 설정이 필요합니다. 로컬 음성 인식은 귀하의 앱이 수행하는 이후 작업의 프라이버시 또는 전달 동작을 설명하지 않습니다.
관련: 오프라인 우선 메모 아키텍처. 개발자의 다음 단계는 테스트 구문을 사용하여 전체 샘플을 실행하고, 지원하려는 장치와 로케일에서 준비, 결과 및 중지를 확인하는 것입니다.