Добрый день.
В качестве домашнего хобби разрабатываю робота, управляемого по WiFi приложением на iOS (iPad iOS 8.1).
Узнав, что Яндекс разработал речевые технологии и предлагает библиотеки для iOS (SpeechKit), решил приделать управление фиксированными голосовыми командами (голосовая активация). Получил API-ключ, модель нескольких голосовых команд и советы специалистов службы поддержки API Yandex SpeechKit как решать мою простую задачу. Сразу скажу, что отнюдь не являюсь асом программирования в XCode (ver. 6.2) для iOS.
Написал, учел все советы (в т.ч. и те, которых нет в документации: установка флага -ObjC в Project->Build Settings-> Linking->Other Linker Flags). Не распознает! Не распознает ни в iOSimulator'e, ни на iPad'e (управление не передается в phraseSpotterDidSpotPhrase). Отправил свой XCod'овский проект целиком в службу поддержки API Yandex SpeechKit - у них распознает!
Вот мой код (errorView, ypsStatus, resultView - UI TextField'ы; файлы голосовой модели находятся в папке activation; микрофон на Маке работает, микрофон на iPad'e работает и доступен приложению; структура файлов проекта прилагается). Со службой поддержки API Yandex SpeechKit обменялись кучей писем - нет результата. Они как-бы отвалили.
// ViewController.m
#import "ViewController.h"
#import <YandexSpeechKit/SpeechKit.h>
#import <YandexSpeechKit/YSKPhraseSpotter.h>
#import <YandexSpeechKit/YSKPhraseSpotterDelegate.h>
@interface ViewController () <YSKPhraseSpotterDelegate>
@end
@implementation ViewController
- (void)viewDidLoad
{ [super viewDidLoad];
// привязка к API-ключу
[[YSKSpeechKit sharedInstance] configureWithAPIKey:@"8d67e88f-……4ca78beb7b30"];
// инициализация YSKPhraseSpotter
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *modelPath = [resourcePath stringByAppendingPathComponent:@"activation"];
NSError *error1 = [YSKPhraseSpotter initializeWithConfigDirectory:modelPath andDelegate:self];
if ([error1 code]) [self.errorView setText:@"error1"];
// запуск YSKPhraseSpotter
NSError *error2 = [YSKPhraseSpotter start];
if ([error2 code]) [self.errorView setText:@"error2"];
// проверка активности YSKPhraseSpotter
if ([YSKPhraseSpotter isRunning] ) {[self.ypsStatus setText:@" активирован"];}
else {[self.ypsStatus setText:@"неактивирован!!!"];}
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}
- (void)phraseSpotterDidSpotPhrase:(NSString *)phrase withIndex:(int)phraseIndex
{ // если хоть что-то узнал
[self.resultView setText:@"YPS uznal"]; }
@end
Сдается мне, что затык в каких-то тонких настройках XCod'a.
Люди добрые, есть ли какие мысли на этот счет? Жалко бросать, чувствую, что решение в какой-нибудь ерунде.
Спасибо.