Ios 文本到语音错误,与“语音到文本”按钮冲突

Ios 文本到语音错误,与“语音到文本”按钮冲突,ios,swift3,text-to-speech,speech-to-text,apple-speech,Ios,Swift3,Text To Speech,Speech To Text,Apple Speech,我正在尝试同时使用iOS语音到文本api和文本到语音api。基本上,用户会说话,他们说的话会被转录到文本视图中。然后用户将按下一个按钮,该按钮将从文本视图中的转录文本提供文本到语音。我的错误是,当用户按下speech to text按钮时,text to speech按钮停止工作。但是,如果我根本不按语音到文本按钮,并通过键盘在文本视图中输入一些文本,则文本到语音按钮可以工作。我想它是有问题的语音文字按钮。我的代码没有出现任何错误,我对正在发生的事情感到困惑 导入UIKit 重要讲话 进口AVF

我正在尝试同时使用iOS语音到文本api和文本到语音api。基本上,用户会说话,他们说的话会被转录到文本视图中。然后用户将按下一个按钮,该按钮将从文本视图中的转录文本提供文本到语音。我的错误是,当用户按下speech to text按钮时,text to speech按钮停止工作。但是,如果我根本不按语音到文本按钮,并通过键盘在文本视图中输入一些文本,则文本到语音按钮可以工作。我想它是有问题的语音文字按钮。我的代码没有出现任何错误,我对正在发生的事情感到困惑

导入UIKit
重要讲话
进口AVF基金会
类SpeechRecognitionViewController:UIViewController、SFSpeechRecognitizerDelegate、UIPickerViewData源、UIPickerViewElegate{
专用var语音识别器:SFSpeechRecognizer!
私有var识别请求:SFSpeechAudioBufferRecognitionRequest!
私有var识别任务:SFSpeechRecognitionTask!
私有let audioEngine=AVAudioEngine()
私有变量区域设置:[区域设置]!
private let defaultLocale=Locale(标识符:“en-US”)
@IBOutlet弱var记录BTN:UIButton!
@IBVAR扬声器:UIButton!
@IBMOutlet弱var文本视图:UITextField!
//@IBOutlet弱var textView:UITextView!
//@IBOutlet专用弱var记录BTN:UIButton!
//@IBOutlet私有弱var选择器:UIPickerView!
@IBVAR选择器:UIPickerView!
重写func viewDidLoad(){
super.viewDidLoad()
recordBtn.isEnabled=false
locales=SFSpeechRecognizer.supportedLocales().map({$0})
让index=NSArray(数组:locales).index(of:defaultLocale)
picker.selectRow(索引,不完整:0,动画:false)
PrepareRecogniter(区域设置:defaultLocale)
}
覆盖函数视图显示(u动画:Bool){
super.viewdide显示(动画)
SFSpeechRecognizer.requestAuthorization{authStatus in
/*
无法在主线程上调用回调。请添加
对主队列的操作,以更新记录按钮的状态。
*/
OperationQueue.main.addOperation{
切换身份验证状态{
案例.授权:
self.recordBtn.isEnabled=true
案件.驳回:
self.recordBtn.isEnabled=false
self.recordBtn.setTitle(“用户拒绝访问语音识别”,用于:。已禁用)
案例.限制性:
self.recordBtn.isEnabled=false
self.recordBtn.setTitle(“此设备上限制的语音识别”,用于:。已禁用)
案例。未确定:
self.recordBtn.isEnabled=false
self.recordBtn.setTitle(“语音识别尚未授权”,用于:。已禁用)
}
}
}
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
专用职能制备认知程序(语言环境:语言环境){
speechRecognizer=SFSpeechRecognizer(locale:locale)!
speechRecognizer.delegate=self
}
private func startRecording()抛出{
//如果上一个任务正在运行,请取消它。
如果让识别任务=识别任务{
识别任务。取消()
self.recognitionTask=nil
}
让audioSession=AVAudioSession.sharedInstance()
尝试audioSession.setCategory(AVAudioSessionCategoryRecord)
尝试audioSession.setMode(AVAudioSessionModeMeasurement)
请尝试audioSession.setActive(true,带:.notifyOthersOnDeactivation)
recognitionRequest=SFSpeechAudioBufferRecognitionRequest()
guard let inputNode=audioEngine.inputNode else{fatalError(“音频引擎没有输入节点”)}
guard let recognitionRequest=recognitionRequest else{fatalError(“无法创建SFSpeechAudioBufferRecognitionRequest对象”)}
//配置请求,以便在音频录制完成之前返回结果
recognitionRequest.shouldReportPartialResults=true
//识别任务表示语音识别会话。
//我们保留对任务的引用,以便可以取消它。
recognitionTask=speechRecognizer.recognitionTask(with:recognitionRequest){result,错误在
var isFinal=false
如果让结果=结果{
self.textView.text=result.bestTranscription.formattedString
isFinal=result.isFinal
}
如果错误!=nil | |为最终结果{
self.audioEngine.stop()
inputNode.removeTap(onBus:0)
self.recognitionRequest=nil
self.recognitionTask=nil
self.recordBtn.isEnabled=true
self.recordBtn.setTitle(“开始录制”,用于:[])
}
}
让recordingFormat=inputNode.outputFormat(forBus:0)
inputNode.installTap(onBus:0,bufferSize:1024,format:recordingFormat){(buffer:AVAudioPCMBuffer,when:AVAudioTime)在
self.recognitionRequest?.append(缓冲区)
}
audioEngine.prepare()
试试audioEngine.start()
textView.text=“(正在侦听…””
}
// =========================================================================
//标记:-UIPickerViewDataSource
func numberOfComponents(在pickerView:UIPickerView中)->Int{
返回1
}
func pickerView(pickerView:UIPickerView,numberOfRowsInComponent:Int)->Int{
返回locales.count
}
// =========================================================================
//标记:-UIPickerViewDelegate
func pickerView(pickerView:UIPickerView,标题行:Int,forComponent comp