What is SourceDrop?
// // ARDictationViewController.m // Autoradio // // Created by Michael Hohl on 03.09.12. // Copyright (c) 2012 Michael Hohl. All rights reserved. // #import "ARDictationViewController.h" #import "OpenEars/PocketsphinxController.h" #import "OpenEars/LanguageModelGenerator.h" #import "OpenEars/OpenEarsEventsObserver.h" @interface ARDictationViewController () @end @implementation ARDictationViewController { PocketsphinxController *pocketsphinxController; LanguageModelGenerator *languageModelGenerator; OpenEarsEventsObserver *openEarsEventsObserver; } @synthesize parentModuleController; @dynamic pocketsphinxController; - (PocketsphinxController *)pocketsphinxController { if (pocketsphinxController == nil) { pocketsphinxController = [[PocketsphinxController alloc] init]; } return pocketsphinxController; } @dynamic languageModelGenerator; - (LanguageModelGenerator *)languageModelGenerator { if (languageModelGenerator == nil) { languageModelGenerator = [[LanguageModelGenerator alloc] init]; } return languageModelGenerator; } - (OpenEarsEventsObserver *)openEarsEventsObserver { if (openEarsEventsObserver == nil) { openEarsEventsObserver = [[OpenEarsEventsObserver alloc] init]; } return openEarsEventsObserver; } - (void)viewDidLoad { [self.openEarsEventsObserver setDelegate:self]; [super viewDidLoad]; } - (void)viewDidUnload { [self.openEarsEventsObserver setDelegate:nil]; } - (void)generateLanguageModel:(id)sender { NSError *error = [self.languageModelGenerator generateLanguageModelFromArray:@[ @"PLAY", @"PAUSE", @"RESUME", @"FORWARD", @"BACKWARD", @"STOP", @"NEXT TRACK", @"LAST TRACK", @"PREVIOUS TRACK", @"SKIP TRACK", @"YES", @"NO" ] withFilesNamed:@"DynamicLanguageModel"]; NSDictionary *dynamicLanguageGenerationResultsDictionary = nil; if([error code] != noErr) { NSLog(@"Dynamic language generator reported error %@", [error description]); } else { dynamicLanguageGenerationResultsDictionary = [error userInfo]; // A useful feature of the fact that generateLanguageModelFromArray:withFilesNamed: always returns an NSError is that when it returns noErr (meaning there was // no error, or an [NSError code] of zero), the NSError also contains a userInfo dictionary which contains the path locations of your new files. // What follows demonstrates how to get the paths for your created dynamic language models out of that userInfo dictionary. NSString *lmFile = [dynamicLanguageGenerationResultsDictionary objectForKey:@"LMFile"]; NSString *dictionaryFile = [dynamicLanguageGenerationResultsDictionary objectForKey:@"DictionaryFile"]; NSString *lmPath = [dynamicLanguageGenerationResultsDictionary objectForKey:@"LMPath"]; NSString *dictionaryPath = [dynamicLanguageGenerationResultsDictionary objectForKey:@"DictionaryPath"]; NSLog(@"Dynamic language generator completed successfully, you can find your new files %@\n and \n%@\n at the paths \n%@ \nand \n%@", lmFile,dictionaryFile,lmPath,dictionaryPath); // pathToDynamicallyGeneratedGrammar/Dictionary aren't OpenEars things, they are just the way I'm controlling being able to switch between the grammars in this sample app. self.pathToDynamicallyGeneratedGrammar = lmPath; // We'll set our new .languagemodel file to be the one to get switched to when the words "CHANGE MODEL" are recognized. self.pathToDynamicallyGeneratedDictionary = dictionaryPath; // We'll set our new dictionary to be the one to get switched to when the words "CHANGE MODEL" are recognized. } } - (void)startListening:(id)sender { [self.pocketsphinxController startListeningWithLanguageModelAtPath:self.pathToDynamicallyGeneratedGrammar dictionaryAtPath:self.pathToDynamicallyGeneratedDictionary languageModelIsJSGF:FALSE]; } - (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID { NSLog(@"Pocketsphinx recognized the following phrase:%@ score:%@", hypothesis, recognitionScore); } // An optional delegate method of OpenEarsEventsObserver which informs that there was an interruption to the audio session (e.g. an incoming phone call). - (void) audioSessionInterruptionDidBegin { NSLog(@"AudioSession interruption began."); // Log it. LOG(@"Status: AudioSession interruption began."); // Show it in the status box. [self.pocketsphinxController stopListening]; // React to it by telling Pocketsphinx to stop listening since it will need to restart its loop after an interruption. } // An optional delegate method of OpenEarsEventsObserver which informs that the interruption to the audio session ended. - (void) audioSessionInterruptionDidEnd { NSLog(@"AudioSession interruption ended."); // Log it. LOG(@"Status: AudioSession interruption ended."); // Show it in the status box. // We're restarting the previously-stopped listening loop. [self.pocketsphinxController startListeningWithLanguageModelAtPath:self.pathToDynamicallyGeneratedGrammar dictionaryAtPath:self.pathToDynamicallyGeneratedDictionary languageModelIsJSGF:FALSE]; } // An optional delegate method of OpenEarsEventsObserver which informs that the audio input became unavailable. - (void) audioInputDidBecomeUnavailable { NSLog(@"The audio input has become unavailable"); // Log it. LOG(@"Status: The audio input has become unavailable"); // Show it in the status box. [self.pocketsphinxController stopListening]; // React to it by telling Pocketsphinx to stop listening since there is no available input } // An optional delegate method of OpenEarsEventsObserver which informs that the unavailable audio input became available again. - (void) audioInputDidBecomeAvailable { NSLog(@"The audio input is available"); // Log it. LOG(@"Status: The audio input is available"); // Show it in the status box. [self.pocketsphinxController startListeningWithLanguageModelAtPath:self.pathToDynamicallyGeneratedGrammar dictionaryAtPath:self.pathToDynamicallyGeneratedDictionary languageModelIsJSGF:FALSE]; } @end