【发布时间】: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