语音识别在 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”错误代码

数字语音识别0-9常出现的问题

脱机语音识别出现错误 ERROR_RECOGNIZER_BUSY

Web Speech API - iOS 中的语音识别

在 iOS 中同时管理文本到语音和语音识别

iOS:百度长语音识别具体的封装:识别播放进度刷新