iOS中SFSpeechRecognitionTaskDelegate方法未触发问题排查
问题分析与修复方案
你的代理方法没被调用,核心问题出在重复创建识别任务以及录音流程的几个关键步骤缺失上,咱们一步步拆解:
1. 重复创建SFSpeechRecognitionTask导致代理失效
你先调用了带代理的初始化方法:
[speechRecognizer recognitionTaskWithRequest:recognitionRequest delegate:self];
但没有把返回的任务对象赋值给recognitionTask,紧接着又用带resultHandler的方法重新创建了一个任务并赋值:
recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { // ... 你的结果处理代码 }];
这会导致第一个绑定了代理的任务被系统丢弃,后续只有resultHandler的回调会触发,代理方法自然不会被调用。
2. 录音流程缺失关键步骤
你的代码里还有两个致命的遗漏:
- 没有启动
AVAudioEngine:输入节点的Tap只有在引擎启动后才会开始捕获音频 - 没有把捕获到的音频数据传递给识别请求:
installTapOnBus的block里没有将AVAudioPCMBuffer添加到recognitionRequest中,识别任务拿不到音频数据,也不会触发代理回调
修正后的完整代码
- (void) startRecording { audioEngine = [[AVAudioEngine alloc] init]; if (recognitionTask) { NSLog(@"recognition task already running"); [recognitionTask cancel]; recognitionTask = nil; } NSError *error; audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryRecord error:&error]; [audioSession setMode:AVAudioSessionModeMeasurement error:&error]; [audioSession setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error]; // 确保recognitionRequest已正确初始化(如果之前没创建的话) if (!recognitionRequest) { recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; } inputNode = audioEngine.inputNode; recognitionRequest.shouldReportPartialResults = YES; // 只创建一次绑定代理的识别任务 recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest delegate:self]; AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { // 将捕获的音频数据传递给识别请求 [recognitionRequest appendAudioPCMBuffer:buffer]; }]; // 启动音频引擎 [audioEngine prepare]; [audioEngine startAndReturnError:&error]; if (error) { NSLog(@"Audio engine start error: %@", error.localizedDescription); } }
额外注意事项
- 确保你已经在Info.plist中配置了麦克风权限(
NSMicrophoneUsageDescription)和语音识别权限(NSSpeechRecognitionUsageDescription),否则识别任务会直接失败 - 检查
speechRecognizer是否可用([speechRecognizer isAvailable]),如果设备不支持语音识别或没有网络(部分识别类型需要联网),代理也不会触发正常回调
内容的提问来源于stack exchange,提问作者user9479872
相关产品推荐
相关产品推荐

