SFSpeechRecognizer на MacOS недоступен, несмотря на успешную авторизацию - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь получить неуклюжий пример проверки Objective- C для запуска с SFSpeechRecognizer на Catalina, транскрибируя локальный аудиофайл.

После некоторого поиска мне удалось получить разрешение на добавив Info.plist с помощью NSSpeechRecognitionUsageDescription, я получу диалоговое окно авторизации и правильный SFSpeechRecognizerAuthorizationStatus (SFSpeechRecognizerAuthorizationStatusAuthorized).

Однако мой экземпляр SFSpeechRecognizer все еще недоступен. Я подозреваю, что, должно быть, я делаю глупую ошибку из-за отсутствия базовых c Объективных - C знаний.

Любые подсказки очень ценятся.

Вот мой код:

//
//  main.m
//  SpeechTestCatalina
//

#import <Foundation/Foundation.h>
#import <Speech/Speech.h>

void transcribeTestFile(){
    NSLocale *locale =[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];
    SFSpeechRecognizer *speechRecognizer = [[SFSpeechRecognizer alloc] initWithLocale:locale];

    NSLog(@"Locale %@, %@", speechRecognizer.locale.languageCode, speechRecognizer.locale.countryCode);
    NSLog(@"Available %hhd", speechRecognizer.available);
    NSLog(@"Auth status %ld", [SFSpeechRecognizer authorizationStatus]);
    NSLog(@"Supports on device %hhd", speechRecognizer.supportsOnDeviceRecognition);
    if(speechRecognizer.isAvailable && speechRecognizer.supportsOnDeviceRecognition){
        NSString *audioFilePath = @"/Users/doe/speech-detection/speech_sample.wav";
        NSURL *url = [[NSURL alloc] initFileURLWithPath:audioFilePath];
        NSLog(@"Analyzing %@ in language %@", url, locale.languageCode);
        SFSpeechURLRecognitionRequest *urlRequest = [[SFSpeechURLRecognitionRequest alloc] initWithURL:url];
        urlRequest.requiresOnDeviceRecognition = true;
        urlRequest.shouldReportPartialResults = YES; // YES if animate writting
        [speechRecognizer recognitionTaskWithRequest: urlRequest resultHandler:  ^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error){
            NSString *transcriptText = result.bestTranscription.formattedString;
            if(!error){
                NSLog(@"Transcript: %@", transcriptText);
            } else {
                NSLog(@"Error: %@", error);
            }
        }];
    } else {
        NSLog(@"speechRecognizer is not available on this device");
    }
}


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus authStatus) {
            NSLog(@"Status: %ld", (long)authStatus);
            switch (authStatus) {
                case SFSpeechRecognizerAuthorizationStatusAuthorized:
                    //User gave access to speech recognition
                    NSLog(@"Authorized");

                    transcribeTestFile();

                    break;

                case SFSpeechRecognizerAuthorizationStatusDenied:
                    //User denied access to speech recognition
                    NSLog(@"SFSpeechRecognizerAuthorizationStatusDenied");
                    break;

                case SFSpeechRecognizerAuthorizationStatusRestricted:
                    //Speech recognition restricted on this device
                    NSLog(@"SFSpeechRecognizerAuthorizationStatusRestricted");
                    break;

                case SFSpeechRecognizerAuthorizationStatusNotDetermined:
                    //Speech recognition not yet authorized

                    break;

                default:
                    NSLog(@"Default");
                    break;
            }
        }];

        NSLog(@"Sleeping");
        [NSThread sleepForTimeInterval:20.0f];

    }
    return 0;
}

Выход при запуске:

2020-01-26 17:48:39.454809+0100 SpeechTestCatalina[3623:82404] Sleeping
2020-01-26 17:48:41.182459+0100 SpeechTestCatalina[3623:82811] Status: 3
2020-01-26 17:48:41.182562+0100 SpeechTestCatalina[3623:82811] Authorized
2020-01-26 17:48:41.186933+0100 SpeechTestCatalina[3623:82811] Locale en, US
2020-01-26 17:48:41.190973+0100 SpeechTestCatalina[3623:82811] Available 0
2020-01-26 17:48:41.191269+0100 SpeechTestCatalina[3623:82811] Auth status 3
2020-01-26 17:48:41.197965+0100 SpeechTestCatalina[3623:82811] Supports on device 0
2020-01-26 17:48:41.198065+0100 SpeechTestCatalina[3623:82811] speechRecognizer is not available on this device
Program ended with exit code: 0

1 Ответ

0 голосов
/ 30 января 2020

Вы не получаете обратный вызов, потому что ваш двоичный файл не имеет runl oop. Я возьму ответ на этот другой вопрос, но с тем же ответом :

Обратные вызовы в большинстве каркасов Apple доставляются через основной прогон вашего приложения l oop. Если ваш инструмент командной строки не имеет запуска l oop, он не может получить обратные вызовы, отправленные таким образом.

Без runl oop, единственный способ для платформы вызвать ваш обратный вызов запускать его в другом потоке, что может привести к странному поведению в приложении, которое этого не ожидало.

Вы можете вручную запустить runl oop, вставив этот код до конца main:

NSRunLoop* runloop = [NSRunLoop currentRunLoop];
[runloop runUntilDate:[NSDate distantFuture]];

Это предотвратит выход вашего приложения; вам нужно обновить свою логику c, чтобы знать, когда распознавание речи закончилось, и реструктурировать ее с помощью while l oop или чего-то еще - но я предполагаю, что logi c внутри вашего "реального" приложения отличается от этот образец игрушки.


Сообщение:

AddInstanceForFactory: Завод не зарегистрирован для идентификатора F8BB1C28-BAE8-11D6-9C31-00039315CD46 HALC_ShellDriverPlugIn :: Open: Не удается получить указатель на подпрограмму Open

, которая появляется в вашей консоли бессмысленно; это какой-то оператор журнала, просачивающийся из системных платформ, и вы можете его игнорировать.


Наконец, для пояснения по паре других моментов:

  • «Включить Ask Siri» было требуется включить в Системных настройках> Siri, чтобы было доступно распознавание речи
  • Существует потенциальная проблема, из-за которой устройство может сообщить, что «при распознавании устройства» недоступно при первой проверке, несмотря на то, что оно поддерживается для выбранный язык
...