我在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)"}}
答案 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()
使用这些技术,我能够以这种方式继续进行语音识别。
希望能帮助到你!
大卫