我试图将语音转换为文本并使用语音框架在UILabel中显示它.我已经授权用户允许使用麦克风.
这是我的代码
- (void)startRecording {
if (_recognitionTask != nil) {
[_recognitionTask cancel];
_recognitionTask = nil;
}
NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
[audioSession setMode:AVAudioSessionModeMeasurement error:&error];
[audioSession setActive:YES error:&error];
_recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
_recognitionTask = [[SFSpeechRecognitionTask alloc] init];
AVAudioInputNode *inputNode = [_audioEngine inputNode];
_recognitionRequest.shouldReportPartialResults = YES;
_recognitionTask = [_speechRecognizer recognitionTaskWithRequest:_recognitionRequest resultHandler:^(SFSpeechRecognitionResult *result, NSError *error) {
BOOL isFinal = NO;
if (result != nil) {
_textLabel.text = [[result bestTranscription] formattedString];
isFinal = result.isFinal;
}
NSLog(@"%@", error);
if (error != nil || isFinal) {
_textLabel.text = [NSString stringWithFormat:@"%@", error];
[inputNode removeTapOnBus:0];
[_audioEngine stop];
_recognitionRequest = nil;
_recognitionTask = nil;
}
}];
[_audioEngine prepare];
[_audioEngine startAndReturnError:nil];
}
Run Code Online (Sandbox Code Playgroud)
调试它时会进入recognitionTaskWithRequest块但是结果是nil并且得到如下错误:
错误域= kAFAssistantErrorDomain代码= 203"损坏"UserInfo = {NSUnderlyingError = 0x14651450 {错误域= SiriSpeechErrorDomain代码= 102"(null)"},NSLocalizedDescription = Corrupt}
小智 2
问题是此代码缺少附加识别缓冲区的代码,因此要解决此问题,请在行之前[_audioEngine prepare];添加以下代码
[_audioEngine.inputNode installTapOnBus:0 bufferSize:1024 format:[inputNode inputFormatForBus:0] block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when){
//NSLog(@"Tapped");
[self.recognitionRequest appendAudioPCMBuffer:buffer];
}];
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题。希望它也对您有帮助。