如何检测短语?

时间:2014-01-02 11:48:05

标签: ios speech-recognition openears

我正在我的应用中通过OpenEars功能实现语音演示。 我还使用Rejecto插件来提高识别效果,RapidEars以获得更快的结果。目标是检测短语和单个单词,例如:

    lmGenerator = [[LanguageModelGenerator alloc] init];

NSArray *words = [NSArray arrayWithObjects:@"REBETANDEAL",@"NEWBET",@"REEEBET", nil];
NSString *name = @"NameIWantForMyLanguageModelFiles";
NSError *err = [lmGenerator generateRejectingLanguageModelFromArray:words
                                                     withFilesNamed:name
                                             withOptionalExclusions:nil
                                                    usingVowelsOnly:FALSE
                                                         withWeight:nil
                                             forAcousticModelAtPath:[AcousticModel pathToModel:@"AcousticModelEnglish"]]; // Change "AcousticModelEnglish" to "AcousticModelSpanish" to create a Spanish Rejecto model.
// Change "AcousticModelEnglish" to "AcousticModelSpanish" to create a Spanish language model instead of an English one.

NSDictionary *languageGeneratorResults = nil;

NSString *lmPath = nil;
NSString *dicPath = nil;

if([err code] == noErr) {

    languageGeneratorResults = [err userInfo];

    lmPath = [languageGeneratorResults objectForKey:@"LMPath"];
    dicPath = [languageGeneratorResults objectForKey:@"DictionaryPath"];

} else {
    NSLog(@"Error: %@",[err localizedDescription]);
}





// Change "AcousticModelEnglish" to "AcousticModelSpanish" to perform Spanish recognition instead of English.
[self.pocketsphinxController setRapidEarsToVerbose:FALSE]; // This defaults to FALSE but will give a lot of debug readout if set TRUE
[self.pocketsphinxController setRapidEarsAccuracy:10]; // This defaults to 20, maximum accuracy, but can be set as low as 1 to save CPU
[self.pocketsphinxController setFinalizeHypothesis:TRUE]; // This defaults to TRUE and will return a final hypothesis, but can be turned off to save a little CPU and will then return no final hypothesis; only partial "live" hypotheses.
[self.pocketsphinxController setFasterPartials:TRUE]; // This will give faster rapid recognition with less accuracy. This is what you want in most cases since more accuracy for partial hypotheses will have a delay.
[self.pocketsphinxController setFasterFinals:FALSE]; // This will give an accurate final recognition. You can have earlier final recognitions with less accuracy as well by setting this to TRUE.
[self.pocketsphinxController startRealtimeListeningWithLanguageModelAtPath:lmPath dictionaryAtPath:dicPath acousticModelAtPath:[AcousticModel pathToModel:@"AcousticModelEnglish"]]; // Starts the rapid recognition loop. Change "AcousticModelEnglish" to "AcousticModelSpanish" in order to perform Spanish language recognition.


[self.openEarsEventsObserver setDelegate:self];

大部分时间结果都很好,但有时它会从单独的字符串对象中混合出来。例如,我传递words数组:@[@"ME AND YOU",@"YOU",@"ME"],输出可以是:"YOU ME ME ME AND"。我不希望它只识别一个短语的一部分。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID上,你可以在显示之前检查假设是否在你的单词数组中。

- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID {
            if ([words containsObject:hypothesis]) {
                  //show hypothesis
            }           
}

答案 1 :(得分:1)

OpenEars开发人员在这里。要使用OpenEars检测固定短语,请使用LanguageModelGenerator的新动态语法生成器方法动态创建基于规则的语法,而不是统计语言模型:http://www.politepix.com/2014/04/10/openears-1-7-introducing-dynamic-grammar-generation/