2017-04-10 7 views
0

현재 데모 응용 프로그램에서 작업 중이며 3 부분으로 흘러갑니다. 1. 음성을 텍스트로 입력 (완료) 2. 텍스트를 서버로 보내고 응답을받습니다. back (API.ai 사용) (완료) 3. 음성 텍스트로 변환하여 응답 메시지가 작동하지 않는 음성으로 변환합니다.AVSpeechsynthesizer가 신속한 API 호출 내에서 작동하지 않습니다.

음성 텍스트가 기능 안에서 작동하지 않습니다. 누구에게 우선 순위를 추가 할 수 있습니까?

여기 연설에 텍스트가 작동하는 이유

@IBAction func startActionTapped(_ sender: Any) { 

    if audioEngine.isRunning { 
     audioEngine.stop() 
     recognitionRequest?.endAudio() 
     startButton.isEnabled = false 
     startButton.setTitle("Start", for: .normal) 

    } 

    else { 
     startRecording() 
     startButton.setTitle("Stop", for: .normal) 

     let loadingNotification = MBProgressHUD.showAdded(to: self.view, animated: true) 
     loadingNotification.mode = MBProgressHUDMode.indeterminate 
     loadingNotification.label.text = "Voice Recogninsing...." 

     DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: { 

      loadingNotification.label.text = "sending request to server...." 


      let request = ApiAI.shared().textRequest() 
      request?.query = ["turn on blue led"] 

      request?.setMappedCompletionBlockSuccess({ (request, response) in 
       let response = response as! AIResponse 

       if response.result.action == "light.led" { 

        if let parameters = response.result.parameters as? [String: AIResponseParameter] { 
         if let led = parameters["led"]?.stringValue { 

          switch led { 
          case "red": 
           print("color is red") 
          case "blue": 
           print("color is blue") 
          case "green": 
           print("color is green") 
          default: 
           print("color is :",led) 
          } 
          self.speechToText = "" 
         } 
        } 
       } else { 
        print("Invalid LED Color") 
       } 

       if let textResponse = response.result.fulfillment.speech { 
       print(textResponse) 
       loadingNotification.hide(animated: true) 
        DispatchQueue.global(qos: .userInitiated).async { 

         let synth = AVSpeechSynthesizer() 
         let utterance = AVSpeechUtterance(string: textResponse) 
         utterance.rate = AVSpeechUtteranceDefaultSpeechRate 
         let lang = "en-US" 

         utterance.voice = AVSpeechSynthesisVoice(language: lang) 
         synth.speak(utterance) 

        } 
       } 
      }, failure: { (request, error) in 
       print(error!) 
      }) 
      ApiAI.shared().enqueue(request) 
     }) 
    } 
    speechToText = "" 
} 

모르는 코드를입니다. 내 질문에 텍스트가 음성으로 작동하지 않습니다. 단계가 누락 되었습니까?

let synth = AVSpeechSynthesizer() 
        let utterance = AVSpeechUtterance(string: textResponse) 
        utterance.rate = AVSpeechUtteranceDefaultSpeechRate 
        let lang = "en-US" 

        utterance.voice = AVSpeechSynthesisVoice(language: lang) 
        synth.speak(utterance) 
+0

메인 대기열에서 코드를 실행 해보십시오. – chengsam

+0

@chengsam이 작동하지 않습니다. – Joe

+0

간단한 버튼 클릭 이벤트를 사용하여 TTS를 구현해보십시오. 작동합니까? 간단한 버튼 클릭으로 – chengsam

답변

0

갱신 TTS 영역에서 코드를 다시 오디오 엔진을 시작하는

do { 
    try AVAudioSession.sharedInstance().setCategory(
     AVAudioSessionCategoryPlayback, 
     with: AVAudioSessionCategoryOptions.mixWithOthers 
    ) 
    let utterance = AVSpeechUtterance(string: textResponse) 
    utterance.rate = AVSpeechUtteranceDefaultSpeechRate 
    let lang = "en-US" 
    self.synth.continueSpeaking() 
    utterance.voice = AVSpeechSynthesisVoice(language: lang) 
    self.synth.continueSpeaking() 
    self.synth.speak(utterance) 
    self.stopEngine() 
    self.startButton.isEnabled = true 
    self.startButton.setTitle("Start", for: .normal) 
} catch { 
    print(error) 
} 

필요.