Как я могу использовать OpenEars в твике?
Я пытаюсь включить OpenEars в проект, который я создаю, настройку для взломанных iDevices, так как мне нужно распознавание речи для моей настройки. Я смог связать фреймворк OpenEars, поместив его в ту же папку, что и мои частные фреймворки, и сейчас я пытаюсь заставить учебный код работать. Вот мой текущий код:
#import <OpenEars/LanguageModelGenerator.h>
#import <OpenEars/PocketsphinxController.h>
#import <OpenEars/AcousticModel.h>
%hook SBLockScreenView
-(void)setCustomSlideToUnlockText:(id)arg1 {
LanguageModelGenerator *lmGenerator = [[LanguageModelGenerator alloc] init];
NSArray *words = [NSArray arrayWithObjects:@"WORD", @"STATEMENT", @"OTHER WORD", @"A PHRASE", nil];
NSString *name = @"NameIWantForMyLanguageModelFiles";
NSError *err = [lmGenerator generateLanguageModelFromArray:words withFilesNamed:name forAcousticModelAtPath:[AcousticModel pathToModel:@"AcousticModelEnglish"]];
//NSError* err = [lmGenerator generateLanguageModelFromArray:words withFilesNamed:name forAcousticModelAtPath:imagePath];
//NSError* err = [[NSError alloc] init];
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]);
}
%orig;
}
%end
Это компилируется нормально, но когда он запускается, я получаю следующие сообщения об ошибках, и мое устройство вылетает: "При попытке сослаться на запрошенный комплект акустической модели, который, как ожидается, будет находиться на пути (ноль), комплект не был найден. Это означает, что когда цикл прослушивания начинается, он завершается сбоем из-за отсутствия необходимых ресурсов. Проблема с нахождением комплекта акустической модели может быть из-за того, что имя комплекта не было дано этому методу способом, который он может использовать, например, если вы пытаетесь чтобы использовать английскую акустическую модель, и вы добавили этот пакет в проект приложения, вы бы вызвали этот метод, передав [AcousticModel pathToAcousticModel:@"AcousticModelEnglish"]
(или же [AcousticModel pathToAcousticModel:@"AcousticModelSpanish"]
для испанского пакета), не добавляя в конец ".bundle" и следя за тем, чтобы имя пакета было написано точно так, как оно указано в фактическом имени пакета (пакет можно увидеть в папке данного дистрибутива "Framework").
Если это не решит проблему, скорее всего, это связано с тем, что комплект акустической модели не был успешно импортирован на корневой уровень проекта приложения и его mainBundle. Это обычно происходит либо потому, что комплект акустических моделей никогда не перетаскивался в проект приложения, когда изначально предполагалось перетаскивать папку "Framework", либо потому, что он перетаскивался, но вместо использования параметра "Создать группы для любых добавленных папок". в диалоговом окне "Добавить файлы" XCode была выбрана опция "Создать ссылки на папки для любых добавленных папок". Чтобы это исправить, просто удалите комплект акустической модели или папку "Framework" из своего приложения и снова добавьте его в проект приложения с правильной настройкой "Создать группы для любых добавленных папок" в диалоговом окне "Добавление файлов" XCode ".
Я также получаю эти сообщения в моем системном журнале:
May 27 00:54:49 Phillips-iPhone SpringBoard[17785] <Warning>: acousticModelPath is (null)
May 27 00:54:49 Phillips-iPhone SpringBoard[17785] <Warning>: Error: the default phonetic dictionary (null)/LanguageModelGeneratorLookupList.text can't be found in the app bundle but the app is attempting to access it, most likely there will be a crash now.
May 27 00:54:49 Phillips-iPhone SpringBoard[17785] <Warning>: Error while trying to load the pronunciation dictionary: Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0x1883cbb0 {NSFilePath=(null)/LanguageModelGeneratorLookupList.text, NSUnderlyingError=0x1883cb40 "The operation couldn’t be completed. No such file or directory"}
May 27 00:54:49 Phillips-iPhone SpringBoard[17785] <Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid domain=nil in -[NSError initWithDomain:code:userInfo:]'
Любая помощь в получении этой работы очень ценится. Спасибо!
2 ответа
Недавно я сделал iOS-твик на основе OpenEars и столкнулся с той же проблемой. Поскольку ваш твик не является нормальным приложением, местоположение, которое pathToAcousticModel
дает не будет правильно. Самое простое решение - поместить комплект акустической модели в известное место и жестко закодировать его.
Например, если вы используете theos, вы можете поместить AcousticModelEnglish.bundle в папку "layout/Library/OpenEars/". Затем заменить
[AcousticModel pathToAcousticModel:@"AcousticModelEnglish"]
с
@"/Library/OpenEars/AcousticModelEnglish.bundle"
Самым простым решением, которое я нашел, было перетаскивание папки "Framework" из библиотеки OpenEars, содержащей файлы комплектов, в папку "Frameworks" внутри проекта Xcode. После перетаскивания отметьте опцию "Копировать элементы при необходимости".
На первый взгляд это звучит странно, но это решение работает, и вы не измените код.
Вы получите такую структуру файла:
Вы также можете удалить самые старые ссылки на эти библиотеки в папке "Framework", чтобы сохранить ваш проект в чистоте.
Ура,
Дэвид