语音识别在 iOS 上出现错误
Posted
技术标签:
【中文标题】语音识别在 iOS 上出现错误【英文标题】:Speech Recognition got an error on iOS 【发布时间】:2016-10-08 01:16:59 【问题描述】:我正在研究ios上的语音识别,但是每次调用[_recognitionRequest endAudio]方法时,总是在recognitionTaskWithRequest中报错:消息在底部。
-(void) stopRecording
if (_disableSpeechSW == YES)
return;
if (_isAuthorization == NO)
return;
NSLog(@"stopRecording");
if ([_audioEngine isRunning])
[_audioEngine stop];
[_recognitionRequest endAudio];
-(void) startRecording
..........
[_speechRecognizer recognitionTaskWithRequest:_recognitionRequest
resultHandler:^(SFSpeechRecognitionResult *result,NSError *error)
if (error != nil )
NSLog(@"%@",[error description]);
else
..........
];
[实用程序] +[AFAggregator logDictationFailedWithError:] 错误 Domain=kAFAssistantErrorDomain Code=203 "重试" UserInfo=NSLocalizedDescription=重试,NSUnderlyingError=0x17424c690 错误域=SiriSpeechErrorDomain Code=1 "(null)"
【问题讨论】:
嘿@Martylin,您应该接受正确的答案,以便其他有相同问题的人可以看到哪个答案有用。请阅读this help topic on what to do when someone answers your question。也请检查您的其他问题,因为没有一个被接受。 Code=203 "Retry" 并不是真正的错误错误。它有助于识别识别器何时完成并且未检测到任何结果。 【参考方案1】:有关 siri 语音限制的更多说明,请参阅此帖子:Speech Recognition Limits for iOS 10
Use my function below to stop speech recognization. Hope its works.
-(void)stopRecording
dispatch_async(dispatch_get_main_queue(), ^
if(audioEngine.isRunning)
[inputNode removeTapOnBus:0];
[inputNode reset];
[audioEngine stop];
[recognitionRequest endAudio];
[recognitionTask cancel];
recognitionTask = nil;
recognitionRequest = nil;
);
【讨论】:
解决了我的问题。谢谢。我收到Domain=kAFAssistantErrorDomain Code=216 "(null)"
很高兴能帮助开发者【参考方案2】:
我发现“endAudio”不允许从recognitionTaskWithRequest块外部调用,如果您直接调用方法“[self stopRecording]”,那么该块将立即响应错误“kAFAssistantErrorDomain Code=203”。
这是我的代码中带有 stopRecord 的 4 部分
1和2都可以
3 和 4 错误
1.from block → detecedVoice → withVoiceControl → stopRecord → ok
2.from block error → stopRecord → startRecord → ok
3.按钮点击 → stopRecord → kAFAssistantErrorDomain Code=203
4.timer 40s → stopRecord → startRecord → kAFAssistantErrorDomain Code=203
【讨论】:
如果我需要从外部识别任务WithRequest 调用 .endAudio ,例如在 viewDidDisappear() 中,还有什么选择? 您尝试过 Apple 的原始 SpeakToMe 示例项目吗?由于它包含相同的代码,正如我所看到的,它看起来像是另一个 Apple 错误,要么在示例中,所以我们都可以产生错误,要么在框架中。【参考方案3】:正如有人指出的那样,即使它伪装成一个错误,它也不完全是一个错误。真正发生的是,识别时间超过了 Apple 为 API 设置的 1 分钟限制,并且在一分钟限制期间没有识别出任何单词。 解决方法是添加一个定时器,在小于 60 秒的一段时间后停止识别:
var timerSST = timerSST = Timer.scheduledTimer(timeInterval: value, target: self, selector: #selector(fire), userInfo: nil, repeats: true)
当视图控制器启动时启动计时器。当计时器到期时,它会调用:
@objc func fire()
if(startedSTT)
stopRecording()
// restart it
DispatchQueue.main.asyncAfter(deadline: .now() + 1)
do
try self.startRecording()
catch let error
print("There was a problem starting recording: \(error.localizedDescription)")
这里是一个关于如何停止的例子:
fileprivate func stopRecording()
audioEngine.stop()
request.endAudio()
recognitionTask?.cancel()
//recognitionTask?.finish()
audioEngine.inputNode.removeTap(onBus: 0);
audioEngine.inputNode.reset()
startedSTT = false
如果停止未正确完成,您将无法重新开始录制以进行识别。注意线条:
recognitionTask?.cancel() vs .finish
输入节点的重置:
audioEngine.inputNode.removeTap(onBus: 0);
audioEngine.inputNode.reset()
使用这些技术,我能够以这种方式继续进行语音识别工作。 希望能帮助到你!
大卫
【讨论】:
试图提供一个按钮来更改语言。由于重新初始化的错误,一直在敲我的头。给予 1 秒的延迟修复它!以上是关于语音识别在 iOS 上出现错误的主要内容,如果未能解决你的问题,请参考以下文章
iOS 10 语音识别“kAFAssistantErrorDomain”错误代码