[swift] NotificationBanner 알림창 메시지 음성 인식 기능 설정

NotificationBanner는 앱에서 알림창을 표시하기 위한 편리한 라이브러리입니다. 이제는 알림창 메시지를 음성으로 인식하는 기능을 추가하고 싶다면, 아래의 가이드를 따라 설정할 수 있습니다.

음성 인식 기능 추가

  1. Speech Recognition 관련 프레임워크를 추가합니다. 이를 위해 Xcode에서 프로젝트를 열고, 프로젝트 네비게이터에서 프로젝트명을 클릭한 뒤 “Build Phases” 탭으로 이동합니다.
  2. “Link Binary With Libraries” 섹션에서 “+” 버튼을 클릭하여 Speech.framework를 추가합니다.

권한 요청

  1. 음성 인식을 위해 앱이 권한을 요청해야 합니다. Info.plist 파일을 열고, “Privacy - Speech Recognition Usage Description”를 추가합니다. 이 항목의 값으로 앱이 사용자에게 요청할 권한에 대한 설명을 입력합니다.

예시:

<key>NSAppleMusicUsageDescription</key>
<string>음성 인식을 통해 알림창 메시지를 읽어드립니다.</string>

음성 인식 설정

  1. NotificationBanner를 사용하기 위해 해당 라이브러리를 import 해줍니다.
    import NotificationBannerSwift
    
  2. 음성 인식을 위한 객체를 생성하고, 인식할 언어와 델리게이트를 설정합니다.
    let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ko-KR"))! // 인식할 언어 설정
    speechRecognizer.delegate = self // 델리게이트 설정
    
  3. 음성 인식을 시작하고, 결과를 받기 위해 델리게이트를 구현합니다.
    func startRecording() {
     let audioSession = AVAudioSession.sharedInstance()
     do {
         try audioSession.setCategory(.record, mode: .default, options: [])
         try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
     } catch {
         print("음성 인식을 위한 오디오 세션 설정 중 오류가 발생했습니다.")
     }
        
     recognitionTask?.cancel()
     self.recognitionTask = nil
        
     let audioBuffer = audioEngine.inputNode!.busTappedSampleTime
     inputNode.removeTap(onBus: 0)
     inputNode.installTap(onBus: 0, bufferSize: 1024, format: inputNode.outputFormat(forBus: 0)) { [weak self] (buffer: AVAudioPCMBuffer, time: AVAudioTime) in
         self?.recognitionRequest.append(buffer)
     }
        
     audioEngine.prepare()
     do {
         try audioEngine.start()
     } catch {
         print("음성 인식을 시작하는 데 문제가 발생했습니다.")
     }
        
     recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { [weak self] (result: SFSpeechRecognitionResult?, error: Error?) in
         if let result = result {
             let bestString = result.bestTranscription.formattedString
             // 음성 메시지 처리 로직 작성
         } else if let error = error {
             print("음성 인식 중 오류가 발생했습니다: \(error.localizedDescription)")
         }
     })
    }
    
  4. 음성 인식 기능을 활용하여 알림창 메시지를 처리하는 로직을 작성합니다. 예를 들어, 다음과 같은 코드를 사용하여 메시지를 음성으로 읽어줄 수 있습니다.
    if bestString.lowercased() == "알림 메시지" {
     let message = "알림이 도착했습니다."
     let banner = NotificationBanner(title: "알림", subtitle: message, style: .info)
     banner.show()
        
     // 음성으로 메시지 읽어주기
     let utterance = AVSpeechUtterance(string: message)
     utterance.voice = AVSpeechSynthesisVoice(language: "ko-KR")
     utterance.rate = 0.5
        
     let synthesizer = AVSpeechSynthesizer()
     synthesizer.speak(utterance)
    }
    

참고 자료