【问题标题】:AVSpeechsynthesizer is not working inside a api call in swiftAVSpeechsynthesizer 不能在 swift 的 api 调用中工作
【发布时间】:2024-01-01 13:39:01
【问题描述】:

目前我正在开发一个演示应用程序,并被分成 3 个部分 1. 语音转文字(完成) 2. 将文本发送到服务器并获取响应(使用 API.ai)(完成) 3. 文字转语音,转语音的回复消息不起作用。

文本到语音在函数内部不起作用,我可以为其添加更多优先级。

这里是代码

@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)

【问题讨论】:

  • 尝试在主队列中运行代码?
  • @chengsam 不工作
  • 尝试用一个简单的按钮点击事件来实现TTS,行得通吗?
  • @chengsam TTS 在简单的按钮点击中工作,
  • 但我认为这部分是问题

标签: ios swift speech-recognition dialogflow-es avspeechsynthesizer


【解决方案1】:

更新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)
}

需要重新启动音频引擎。

【讨论】:

    最近更新 更多