2017-04-10 12 views
0

現在、私はデモアプリケーションで作業中で、3つの部分に分かれています 1.テキストへの音声入力(完了) 2.テキストをサーバーに送信し、応答を取得します戻る(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) 
} 

が再びオーディオエンジンを始動する必要があります更新。

関連する問題