【问题标题】:Error getting when implementing SFSpeechAudioBufferRecognitionRequest Domain=kAFAssistantErrorDomain Code=216实现 SFSpeechAudioBufferRecognitionRequest Domain=kAFAssistantErrorDomain Code=216 时出错
【发布时间】:2018-11-10 07:38:44
【问题描述】:

在 Objective-c 语言中实现 SFSpeechAudioBufferRecognitionRequest 时出现错误。这是我的代码..它在一天前就开始工作了。错误是 Domain=kAFAssistantErrorDomain Code=216 "(null)"

- (void)startListening {

// Initialize the AVAudioEngine
audioEngine = [[AVAudioEngine alloc] init];

// Make sure there's not a recognition task already running
if (recognitionTask) {
    [recognitionTask cancel];
    recognitionTask = nil;
}

// Starts an AVAudio Session
NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

// Starts a recognition process, in the block it logs the input or stops the audio
// process if there's an error.
recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
 inputNode = audioEngine.inputNode;
recognitionRequest.shouldReportPartialResults = NO;
recognitionRequest.taskHint = SFSpeechRecognitionTaskHintDictation;
[self startWaveAudio];

// Sets the recording format
AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];
[inputNode installTapOnBus:0 bufferSize:4096 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
    [recognitionRequest appendAudioPCMBuffer:buffer];
}];

// Starts the audio engine, i.e. it starts listening.
[audioEngine prepare];
[audioEngine startAndReturnError:&error];


__block BOOL isFinal = NO;

recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {

    [self stopWaveAudio];

    if (result) {
        // Whatever you say in the microphone after pressing the button should be being logged
        // in the console.
        NSLog(@"RESULT:%@",result.bestTranscription.formattedString);

        for (SFTranscription *tra in result.transcriptions) {
            NSLog(@"Multiple Results : %@", tra.formattedString);
        }

        if(isFinal == NO) {
            [self calculateResultOfSpeechWithResultString:result.bestTranscription.formattedString];
        }
        isFinal = !result.isFinal;
    }
    if (error || isFinal) {
        NSLog(@"Error Description : %@", error);
        [self stopRecording];

    }
}];
}

- (IBAction)tap2TlkBtnPrsd:(UIButton *)sender {
  if (audioEngine.isRunning) {
   [self stopRecording];
} else {
    [self startListening];
}

isMicOn = !isMicOn;
micPrompt = NO;

}

-(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;
            }
       // });


}

并且尝试了不同的方法,比如在请求语音后附加音频缓冲区..

如果可能的话,任何人都可以告诉我,我怎样才能实现一个场景,比如用户会拼出这个词,结果只会是那个词?

【问题讨论】:

    标签: ios objective-c speech-recognition speech-to-text


    【解决方案1】:

    当我取消识别任务时,我有同样的错误=216。 SFSpeechRecognitionResultisFinal 属性仅在识别器认为说话者已经结束时才为真。所以当你第一次尝试isFinal = !result.isFinal;时,它是False,你的isFinal标志调用stopRecording()所在的块,用[recognitionTask cancel];取消它。

    因此,如果您只想要第一个转录(单词),您可以调用bestTranscription 第一段的substring 属性,然后调用[recognitionTask finish];

    ...
    if (result) {
        // First transcription
        NSLog(@"RESULT:%@",[[result.bestTranscription.segments.firstObject] substring]);
        [recognitionTask finish];
        [self stopRecording];
    }
    if (error) {
        NSLog(@"Error Description : %@", error);
        [recognitionTask cancel];
        [self stopRecording];
    }
    ...
    -(void)stopRecording {
    
            if(audioEngine.isRunning){
                [inputNode removeTapOnBus:0];
                [inputNode reset];
                [audioEngine stop];
                [recognitionRequest endAudio];
                recognitionTask = nil;
                recognitionRequest = nil;
            }
    
    }
    

    【讨论】:

    • 非常感谢您的回复。会尝试你的想法。
    猜你喜欢
    • 2017-06-27
    • 2017-11-29
    • 1970-01-01
    • 2020-01-26
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多