iOS 앱에 음성 인식을 통합하면 사용자가 상호 작용하는 방법을 변환하고, 손없는 제어, 빠른 데이터 입력 및 액세스 성을 개선합니다. Apple의 Speech Framework는 사용자 개인 정보를 존중하고 신뢰할 수있는 실시간 트래픽을 제공하는 강력한 On-device 음성을 제공합니다. 이 문서는 기본 설정에서 고급 구현 패턴으로 모든 것을 다루고, 다국어 지원 및 오류 처리 모범 사례를 포함합니다.

Speech Framework 아키텍처 이해

Speech Framework (iOS 10에서 도입)는 3 개의 핵심 구성 요소를 통해 작동합니다.

  • SFSpeechRecognizer] – 특정 언어와 현지인에 대한 인식을 조정하는 기본 인터페이스. 그것은 장치 또는 서버 기반 인식을 사용할 수 있습니다.
  • SFSpeechRecognitionRequest – 오디오 입력을 나타냅니다. 두 개의 주요 서브 클래스: ] 사전 녹음된 오디오 파일 및 라이브 오디오 스트림에 대한.
  • SFSpeechRecognitionTask – 인식 프로세스를 관리하고 진행 업데이트 및 최종 결과를 제공합니다. 취소 및 포장을 지원합니다.

자동 음성 인식기(ASR) 엔진을 통해 프레임 워크 프로세스 오디오. 기본적으로 iOS 15+는 모든 지원되는 언어에 대한 on-device 승인을 사용하여 대기 시간을 줄이고 데이터를 결코 제거하지 않습니다. 서버 기반 인식은 여전히 오래된 장치 또는 특정 언어로 사용할 수 있지만 활성 인터넷 연결 및 사용자 동의가 필요합니다.

주요 특징 및 기능

  • Real-time Streaming – Voice는 user가 주기적인 부분 결과를 가진 것으로 표현됩니다.
  • Alternate transcriptions] – 각 결과는 과 를 통해 자신감을 갖는 여러 해석을 포함합니다.
  • Contextual Phrases – 개발자는 도메인 별 용어에 대한 정확성을 향상시키기 위해 을 통해 사용자 정의 구문을 제공 할 수 있습니다.
  • 지원 언어 – 60개 언어 및 지역 악센트 이상. 현재 목록을 검색하기 위해 를 사용합니다.

권한 및 프로젝트 구성 설정

Always 요청 권한이 명시적으로 부여됩니다.] 적절한 권한이 없으면 시스템은 인식 요청을 거부합니다. 이 단계를 따르십시오.

Info.plist 요구 사항

key (Privacy – Speech Recognition Usage Description)를 클리어, 사용자 인터페이스 설명 추가합니다. 예:

<key>NSSpeechRecognitionUsageDescription</key>
<string>This app uses speech recognition to transcribe your voice commands for hands-free navigation.</string>

앱이 오디오를 기록하는 경우 (라이브 인식을위한 데모), ]을 추가합니다.

관련 기사

] 앱 라이프사이클 초기에, 일반적으로 보기 컨트롤러의 ]에. 콜백은 4개의 상태 중 하나를 반환합니다:

import Speech

SFSpeechRecognizer.requestAuthorization { authStatus in
 DispatchQueue.main.async {
 switch authStatus {
 case .authorized:
 // Enable microphone and recognition UI
 case .denied, .restricted:
 // Show error and disable features
 print("Speech recognition not available")
 case .notDetermined:
 // Handle if the user hasn't seen the dialog (rare)
 @unknown default:
 break
 }
 }
}

참고: 프레임 워크는 ]를 반환할 수 있습니다. 디바이스가 모호한 제어 프로파일에 의해 관리되거나, 음성 인식이 Screen Time을 통해 비활성화되는 경우.

실시간 음성 인식 구현

실시간 음성 캡처를 위해, 당신은 ]] 오디오 버퍼를 인식 요청에 스트림해야합니다. 다음 코드는 적절한 정리로 생산 읽기 구현을 보여줍니다.

1단계: 오디오 세션 구성

let audioEngine = AVAudioEngine()
let request = SFSpeechAudioBufferRecognitionRequest()
var recognitionTask: SFSpeechRecognitionTask?

func configureAudioSession() {
 let audioSession = AVAudioSession.sharedInstance()
 do {
 try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
 try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
 } catch {
 print("Audio session config failed: \(error.localizedDescription)")
 }
}

옵션은 미묘한 환경에서의 비문 정확도를 향상하는 배경 음악 볼륨을 낮춥니다. 음성 전용 앱을 위해서는 를 고려하여 이어폰 대신 장치 스피커를 통해 오디오를 경로를 고려하십시오.

2단계: Recognizer 및 요청 만들기

func startRecognition() {
 guard let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US")),
 recognizer.isAvailable else {
 handleError("Recognizer unavailable or not supported")
 return
 }

 configureAudioSession()
 request.shouldReportPartialResults = true

 let inputNode = audioEngine.inputNode
 let recordingFormat = inputNode.outputFormat(forBus: 0)

 recognitionTask = recognizer.recognitionTask(with: request) { result, error in
 if let result = result {
 let transcribedText = result.bestTranscription.formattedString
 // Update UI or process command
 print("Partial: \(transcribedText)")

 if result.isFinal {
 self.stopRecognition()
 // Handle final transcription
 }
 }

 if let error = error {
 self.stopRecognition()
 self.handleError(error.localizedDescription)
 }
 }

 inputNode.installTap(onBus: 0, bufferSize: 1024,
 format: recordingFormat) { buffer, _ in
 self.request.append(buffer)
 }

 audioEngine.prepare()
 do {
 try audioEngine.start()
 } catch {
 handleError("Audio engine start failed: \(error.localizedDescription)")
 }
}

3 단계 : 은혜를 끄는

func stopRecognition() {
 recognitionTask?.cancel()
 audioEngine.stop()
 audioEngine.inputNode.removeTap(onBus: 0)
 request.endAudio()
 // Optionally deactivate audio session
 try? AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}

오디오 엔진을 멈추기 전에 인식 작업을 취소합니다. 입력 노드의 탭을 제거하려면 유지 사이클을 발생시키고 마이크를 해제 할 수 있습니다.

Multilingual 및 Custom Locales를 취급

Speech Framework는 동적 로컬 탐지를 지원합니다. 사용자는 언어를 전환하거나 별도의 인스턴스를 생성하여 단일 세션에서 여러 언어를 인식할 수 있습니다.

let locales = ["en-US", "fr-FR", "zh-CN"]
let recognizers = locales.compactMap { SFSpeechRecognizer(locale: Locale(identifier: $0)) }

// Use recognizers[0] for English, etc.

각 인식자는 언어 모델에 대한 메모리 비율을 소비합니다. 여러 언어를 지원하는 경우 이전 장치에서 테스트 성능.

사용자 정의 Vocabulary 및 도메인 약관

]] 속성을 사용하여 업계 별 조건을 개선 ]:

request.contextualStrings = ["Directus", "CMS", "headless", "REST API"]

이 힌트는 이 구문을 호소하고, uncommon 용어의 인식을 감소.

오류 처리 및 Fallback 전략

음성 인식은 많은 이유로 실패 할 수 있습니다 : 네트워크 문제 (서버 기반을 사용하는 경우), 오디오 중단, 마이크 비활성화 또는 메모리 압력. 강력한 핸들러를 구현하십시오 :

enum RecognitionError: LocalizedError {
 case noPermission
 case unavailable
 case audioSessionFailure
 case internalError(Error)

 var errorDescription: String? {
 switch self {
 case .noPermission:
 return "Speech recognition permission denied"
 case .unavailable:
 return "Recognizer is busy or not available"
 case .audioSessionFailure:
 return "Could not start audio capture"
 case .internalError(let error):
 return error.localizedDescription
 }
 }
}

func handleError(_ message: String) {
 // Show alert, retry button, or fallback to text input
 DispatchQueue.main.async {
 // Show toast or log
 }
}

] 의 속성을 통해 인식 작업 상태 변경 취소 또는 시간 초과를 감지합니다.

성과 최적화 및 모범 사례

  • ]Prefer on-devicecogni – iOS 15부터, on-devicecognition은 기본적으로이며, 더 낮은 대기시간을 제공합니다. 아직 지원되지 않는 언어가 필요없는 서버 기반을 강제하지 마십시오. ]를 체크하여 가용성을 확인하십시오.
  • Limit 부분 결과 – ]]]는 최종 대문자가 필요한 경우에 과장 감소.
  • 맨age인식 수명 – 사용자가 말하는 중지할 때 긴 실행 작업을 취소합니다. 세션을 자동으로 종료하기 위해 타이머(예: 2초)를 사용하십시오.
  • 배터리 및 메모리 – 오디오 엔진 및 인식 작업은 중요한 리소스를 소비합니다. 앱이 배경으로 갈 때 일시 중지 또는 인식.
  • ]모음 데이터로 테스트] – 마이크 의존성을 방지하기 위해 개발 중에 사전 녹음된 오디오 파일(])를 사용합니다.

관련 링크

전화 통화, 알람, 또는 Siri는 활성 인식 세션을 중단 할 수 있습니다. ]에 가입하고 우아하게 이력서 :

NotificationCenter.default.addObserver(
 self,
 selector: #selector(handleInterruption),
 name: AVAudioSession.interruptionNotification,
 object: nil
)

@objc func handleInterruption(_ notification: Notification) {
 guard let userInfo = notification.userInfo,
 let type = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt else { return }
 if type == AVAudioSession.InterruptionType.began.rawValue {
 stopRecognition()
 } else if type == AVAudioSession.InterruptionType.ended.rawValue {
 // Optionally restart recognition
 }
}

접근성 고려 사항

Voice 인식은 모터 또는 시각 장애를 가진 사용자를 위한 접근성을 강화합니다. 당신의 구현을 보장합니다:

  • 시작/스톱을 듣는 경우 명확한 오디오 피드백을 제공합니다.
  • VoiceOver를 지원하여 인식 버튼에 대한 접근성 라벨을 사용합니다.
  • case 인식에 있는 대안 텍스트 기반 입력 방법을 제공 합니다 실패.
  • 사용자의 개인 정보 보호는 명시된 동의 없이 오디오 데이터를 저장하지 않습니다.

테스트 및 디버깅

시뮬레이터는 마이크를 포함하지 않습니다; 물리적 장치에 대한 테스트. Xcode의 Speech Recognition 진단 로그] ]를 사용하여 ] 값을 로 추가합니다. QA 동안 다른 소음 환경과 악센트를 시뮬레이션합니다.

Real-World 사용 사례

  • CMS 앱의 음성 명령] - 컨텐츠를 인용하거나 메뉴를 자유롭게 탐색 할 수 있습니다. 예를 들어, "새로운 기사를 수집"은 특정 워크플로우를 유발합니다.
  • 주의 ‐ taking 앱에 대한 토론] – 실시간 비문과의 음성 인식.
  • 액세스 ‐인포메이션 – 사용자는 화면을 터치하지 않고 “Go back” 또는 “Open settings”라고 말할 수 있습니다.
  • Medical or legal transcription - 도메인 별 용어를 위한 컨텍스트 문자열을 사용하며, 프라이버시에 대한 ‐장치 인식과 결합합니다.

관련 기사

Apple의 Speech Framework는 iOS 앱에 음성 인식을 추가하기위한 견고한 기반을 제공합니다. 아키텍처를 이해함으로써, 오디오 세션을 관리하고 성능을 최적화하고 사용자 개인 정보를 존중하는 원활한 음성 제어 경험을 만들 수 있습니다. 항상 실제 장치에 테스트하고, 가을 메커니즘을 고려하고, 사용자의 상황에 맞는 기능을 진정으로 강화하는 것을 염두에두고 있습니다.

더 읽기를 위해 Apple의 ]Speech Framework documentation], ]AVAudioSession guide, SFSpeechRecognizer class reference를 참조하십시오. 액세스 가능성에 대한 추가 모범 사례는 Apple AccessLT:7]]]에서 찾을 수 있습니다.]]]