是的。您可以通过设置扫描部分结果上的传入单词recognitionRequest.shouldReportPartialResults = YES
,然后多次调用结果回调。
然后,您可以随时处理结果,在获得最终结果之前扫描关键字/关键短语(即忽略result.isFinal
)。当您找到您正在寻找的关键字/关键短语时,然后取消识别。
我已经成功地在Speaking Email中使用这种方法实现了语音命令,作为修改后的Cordova 插件(来源在这里)。
例子:
- (void) recordAndRecognizeWithLang:(NSString *) lang
{
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:lang];
self.sfSpeechRecognizer = [[SFSpeechRecognizer alloc] initWithLocale:locale];
if (!self.sfSpeechRecognizer) {
[self sendErrorWithMessage:@"The language is not supported" andCode:7];
} else {
// Cancel the previous task if it's running.
if ( self.recognitionTask ) {
[self.recognitionTask cancel];
self.recognitionTask = nil;
}
[self initAudioSession];
self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
self.recognitionRequest.shouldReportPartialResults = [[self.command argumentAtIndex:1] boolValue];
self.recognitionTask = [self.sfSpeechRecognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult *result, NSError *error) {
if (error) {
NSLog(@"error");
[self stopAndRelease];
[self sendErrorWithMessage:error.localizedFailureReason andCode:error.code];
}
if (result) {
NSMutableArray * alternatives = [[NSMutableArray alloc] init];
int maxAlternatives = [[self.command argumentAtIndex:2] intValue];
for ( SFTranscription *transcription in result.transcriptions ) {
if (alternatives.count < maxAlternatives) {
float confMed = 0;
for ( SFTranscriptionSegment *transcriptionSegment in transcription.segments ) {
NSLog(@"transcriptionSegment.confidence %f", transcriptionSegment.confidence);
confMed +=transcriptionSegment.confidence;
}
NSMutableDictionary * resultDict = [[NSMutableDictionary alloc]init];
[resultDict setValue:transcription.formattedString forKey:@"transcript"];
[resultDict setValue:[NSNumber numberWithBool:result.isFinal] forKey:@"final"];
[resultDict setValue:[NSNumber numberWithFloat:confMed/transcription.segments.count]forKey:@"confidence"];
[alternatives addObject:resultDict];
}
}
[self sendResults:@[alternatives]];
if ( result.isFinal ) {
[self stopAndRelease];
}
}
}];
AVAudioFormat *recordingFormat = [self.audioEngine.inputNode outputFormatForBus:0];
[self.audioEngine.inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
[self.recognitionRequest appendAudioPCMBuffer:buffer];
}],
[self.audioEngine prepare];
[self.audioEngine startAndReturnError:nil];
}
}