10

我正在研究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 "重试" UserInfo={NSLocalizedDescription=重试, NSUnderlyingError=0x17424c690 {错误域=SiriSpeechErrorDomain 代码=1 "(null)"}}

4

3 回答 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;
        }
    });
}
于 2017-06-09T09:48:00.380 回答
4

我发现“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.按钮点击→停止记录→ kAFAssistantErrorDomain Code=203

4.timer 40s → stopRecord → startRecord → kAFAssistantErrorDomain Code=203

于 2016-10-08T07:48:12.197 回答
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()

使用这些技术,我能够以这种方式继续进行语音识别工作。
希望能帮助到你!

大卫

于 2019-07-03T23:54:06.857 回答