语音识别在iOS上出错

时间:2016-10-08 01:16:59

标签: ios objective-c speech-recognition siri sfspeechrecognizer

我在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 {
   ..........
  }
}];}
  

[Utility] + [AFAggregator logDictationFailedWithError:]错误   Domain = kAFAssistantErrorDomain Code = 203" Retry"   UserInfo = {NSLocalizedDescription = Retry,NSUnderlyingError = 0x17424c690   {错误域= SiriSpeechErrorDomain代码= 1"(null)"}}

3 个答案:

答案 0 :(得分:6)

有关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;
        }
    });
}

答案 1 :(得分:4)

我想通了“endAudio”不允许从RecognitionTaskWithRequest块外部调用,如果你直接调用方法“[self stopRecording]”那么块会立即响应错误“kAFAssistantErrorDomain Code = 203”。

这是我的代码中的4部分,带有stopRecord

1和2很好

3和4错误

1.from block→detecedVoice→withVoiceControl→stopRecord→ ok

2.来自区块错误→stopRecord→startRecord→ ok

3.button tap→stopRecord→ kAFAssistantErrorDomain Code = 203

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

答案 2 :(得分:0)

正如某人指出的那样,即使将其伪装成错误,也不完全是错误。真正发生的是,识别时间超过了Apple为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  

并重置inputNode:

audioEngine.inputNode.removeTap(onBus: 0);
audioEngine.inputNode.reset()

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

大卫