2

텍스트 음성 변환 및 텍스트 음성 변환을하는 응용 프로그램을 만들고 있습니다.iOS : SFSpeechRecognizer로 녹음 한 후 AVSpeechSynthesizer가 작동하지 않습니다.

현재 문제는 AVSpeechSynthesizer를 사용하여 text-to-speech가 잘 작동한다는 것입니다. 그러나 SFSpeechRecognizer를 사용하여 음성을 녹음하고 텍스트를 녹음 한 후에는 텍스트 음성 변환이 작동을 멈 춥니 다 (즉, 말하지 않습니다).

나는 또한 너무 빠르다. 그러나 나는이 튜토리얼을 다른 튜토리얼에서 가져 와서 병합하려고했다. 그들은 모두가 AVAudioSession이

private var speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))! 
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 
private var recognitionTask: SFSpeechRecognitionTask? 
private var audioEngine = AVAudioEngine() 

    @objc(speak:location:date:callback:) 
    func speak(name: String, location: String, date: NSNumber,_ callback: @escaping (NSObject) ->()) -> Void { 
     let utterance = AVSpeechUtterance(string: name) 
     let synthesizer = AVSpeechSynthesizer() 
     synthesizer.speak(utterance) 
    } 


    @available(iOS 10.0, *) 
    @objc(startListening:location:date:callback:) 
    func startListening(name: String, location: String, date: NSNumber,_ callback: @escaping (NSObject) ->()) -> Void { 
     if audioEngine.isRunning { 
      audioEngine.stop() 
      recognitionRequest?.endAudio() 


     } else { 

      if recognitionTask != nil { //1 
       recognitionTask?.cancel() 
       recognitionTask = nil 
      } 

      let audioSession = AVAudioSession.sharedInstance() //2 
      do { 
       try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 
       try audioSession.setMode(AVAudioSessionModeMeasurement) 
       try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
      } catch { 
       print("audioSession properties weren't set because of an error.") 
      } 

      recognitionRequest = SFSpeechAudioBufferRecognitionRequest() //3 

      guard let inputNode = audioEngine.inputNode else { 
       fatalError("Audio engine has no input node") 
      } //4 

      guard let recognitionRequest = recognitionRequest else { 
       fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") 
      } //5 

      recognitionRequest.shouldReportPartialResults = true //6 

      recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in //7 

       var isFinal = false //8 

       if result != nil { 

        print(result?.bestTranscription.formattedString) //9 
        isFinal = (result?.isFinal)! 
       } 

       if error != nil || isFinal { //10 
        self.audioEngine.stop() 
        inputNode.removeTap(onBus: 0) 

        self.recognitionRequest = nil 
        self.recognitionTask = nil 


       } 
      }) 

      let recordingFormat = inputNode.outputFormat(forBus: 0) //11 
      inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in 
       self.recognitionRequest?.append(buffer) 
      } 

      audioEngine.prepare() //12 

      do { 
       try audioEngine.start() 
      } catch { 
       print("audioEngine couldn't start because of an error.") 
      } 




     } 

    } 
+0

여기서'speak' 함수를 어디에서 호출합니까? –

+0

문제가 해결 되었습니까 @ SamuelMéndez –

답변

1

:

여기 내 코드입니다. SFSpeechRecognizer

_audioSession.SetCategory(AVAudioSessionCategory.Playback, 
AVAudioSessionCategoryOptions.MixWithOthers); 

과를 들면 다음과 같습니다 : AVSpeechSynthesizer를 들어

나는 그것이로 설정해야합니다 가정

_audioSession.SetCategory(AVAudioSessionCategory.PlayAndRecord, 
AVAudioSessionCategoryOptions.MixWithOthers); 

그것이 도움이되기를 바랍니다.