语音识别在iOS上出现了错误

11
我正在研究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:] 错误 域 = kAFAssistantErrorDomain 代码=203“重试” 用户信息= {NSLocalizedDescription=重试,NSUnderlyingError=0x17424c690 {错误域=SiriSpeechErrorDomain 代码=1 “(null)”}}

嘿,@Martylin,你应该接受正确的答案,这样其他遇到同样问题的人就可以看到哪个答案有用了。请阅读此帮助主题以了解当有人回答您的问题时该怎么做。还请查看您的其他问题,因为没有一个被接受。 - Bart
2
Code=203 "重试" 不是真正的错误。它有助于识别识别器何时完成但未检测到任何结果。 - Ángel Téllez
3个回答

8

关于Siri语音限制的更多澄清,请参阅此帖子: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;
        }
    });
}

1
问题已解决,谢谢。我一直收到 Domain=kAFAssistantErrorDomain Code=216 "(null)" 的错误信息。 - Brian Boyle
很高兴能够帮助开发者们。 - Sandip Patel - SM

4
我发现"endAudio"不能从recognitionTaskWithRequest块的外部调用,如果直接调用"[self stopRecording]"方法,块将立即响应错误"kAFAssistantErrorDomain Code=203"。
以下是我的代码中与stopRecord相关的4个部分:
1和2是正常的;
3和4出现错误。
1.来自block → detectedVoice → withVoiceControl → stopRecord → 正常; 2.来自block错误 → stopRecord → startRecord → 正常; 3.按钮点击 → stopRecord → kAFAssistantErrorDomain Code=203; 4.计时器40秒 → stopRecord → startRecord → kAFAssistantErrorDomain Code=203。

3
那么,如果我需要从外部调用.endAudio,例如在viewDidDisappear()中,有什么替代方法呢? - Josh
你尝试过原始的苹果SpeakToMe示例项目吗?由于它包含相同的代码,据我所见,这似乎是另一个苹果的bug,可能是在示例中,因此我们都可以产生错误,或者是在框架中。 - lef

3

有人指出这并不是一个真正的错误,即使它被伪装成了一个错误。真正发生的情况是,语音识别所需的时间超过了苹果API设置的1分钟限制,在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()

使用这些技术,我能够让连续语音识别以这种方式工作。
希望能对您有所帮助!
David

一直在尝试添加一个按钮来切换语言。由于重新初始化时出现错误,我已经苦恼了一段时间。最终通过增加1秒的延迟解决了问题! - Jaswant Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接