2017-02-28 13 views
0

iOSアプリからGoogle Cloud Speech Apiを使用して長いファイル(> 1分)を作成しようとしています。そのために
、私は次のようにします。Google Cloud Speech API iOSはFirebaseストレージファイルで401 UNAUTHENTICATEDを返します

1)ドキュメントに書かれたように、私は)

[[FIRAuth auth] 
signInAnonymouslyWithCompletion:^(FIRUser *_Nullable user, NSError *_Nullable error) { 
    // ... 
    if (!error){ 
     self.user = user; 

     [self.user getTokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) { 
      if (!error) { 
       self.token = token; 
       [self uploadFile]; 
      } 
     }]; 

    } 
}]; 

2をfirebaseする匿名ユーザーを認証それから私はFirebaseストレージに自分のファイルをアップロードしてURI

を取得します
- (void)uploadFile 
{ 

    FIRStorage * storage = [FIRStorage storage]; 
    FIRStorageReference *storageRef = [storage reference]; 
    FIRStorageReference *sonetRef = [storageRef child:@"transcribeTest/sonet130.mp3"]; 

    NSData *sonet = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"sonet130" ofType:@"mp3"]]; 

    FIRStorageUploadTask *uploadTask = [sonetRef putData:sonet metadata:nil completion:^(FIRStorageMetadata * _Nullable metadata, NSError * _Nullable error) { 

     if (error != nil) { 
      // Uh-oh, an error occurred! 
     } else { 
      // Metadata contains file metadata such as size, content-type, and download URL. 
      NSURL *downloadURL = metadata.downloadURL; 

      NSString *path = [NSString stringWithFormat:@"gs://%@/%@",metadata.bucket,metadata.path]; 

      NSURL * gsURL = [NSURL URLWithString:path];//@"gs://%@",downloadURL.path]]; 

      [self trnscribeFileAtURL:gsURL]; 
     } 

    }]; 
    [uploadTask resume]; 
} 

3)次の手順は、AsyncrecognizeリクエストをGoogle Cloud Speech APIに送信する必要があります。しかし、401エラーが発生します。

-(void)trnscribeFileAtURL:(NSURL*)url 
{ 
    NSString *service = @"https:/speech.googleapis.com/v1beta1/speech:asyncrecognize"; 
    service = [service stringByAppendingString:@"?key="]; 
    service = [service stringByAppendingString:API_KEY]; 

    NSData *audioData = [NSData dataWithContentsOfFile:[self soundFilePath]]; 
    NSDictionary *configRequest = @{@"encoding":@"LINEAR16", 
            @"sampleRate":@(SAMPLE_RATE), 
            @"languageCode":@"en-UK", 
            @"maxAlternatives":@30}; 
    NSDictionary *audioRequest = @{@"uri":url.absoluteString}; 
    NSDictionary *requestDictionary = @{@"config":configRequest, 
             @"audio":audioRequest}; 
    NSError *error; 
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestDictionary 
                  options:0 
                  error:&error]; 

    NSString *path = service; 
    NSURL *URL = [NSURL URLWithString:path]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
    // if your API key has a bundle ID restriction, specify the bundle ID like this: 
    [request addValue:[[NSBundle mainBundle] bundleIdentifier] forHTTPHeaderField:@"X-Ios-Bundle-Identifier"]; 
    NSString *contentType = @"application/json"; 
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:[NSString stringWithFormat:@"Bearer %@",self.token] forHTTPHeaderField:@"Authorization"]; 
    [request setHTTPBody:requestData]; 
    [request setHTTPMethod:@"POST"]; 

    NSURLSessionTask *task = 
    [[NSURLSession sharedSession] 
    dataTaskWithRequest:request 
    completionHandler: 
    ^(NSData *data, NSURLResponse *response, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), 
         ^{ 
          NSString *stringResult = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
          _textView.text = stringResult; 
          NSLog(@"RESULT: %@", stringResult); 
         }); 
    }]; 
    [task resume]; 

} 

JSON応答:

2017-02-28 19:58:05.837337 Speech[8057:2054726] RESULT: { 
    "error": { 
    "code": 401, 
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", 
    "status": "UNAUTHENTICATED" 
    } 
} 

は、問題のコード行にあるように見える:

[request addValue:[NSString stringWithFormat:@"Bearer %@",self.token] forHTTPHeaderField:@"Authorization"]; 

私はFirebase匿名認証から取得したトークンを渡すためにしようとしていますが、それは合わない。匿名ユーザーの正しい資格情報を取得する方法を見つけることができません。助けてください。

答えて

2

簡単な答えは、SpeechやVisionのようなGoogle APIにクライアントから直接アクセスするためにFirebase Authトークンを使用できないことです。エラーメッセージが言うように、これらのAPIは、のいずれかの期待:

  • GoogleのOAuth 2.0の(ユーザーが開始されるか、またはサービスアカウントのいずれかを介して)
  • ログインクッキー

the Speech docs on authenticationで詳細情報を参照してください。

これを行う最も簡単な方法は、おそらくCloud Functionsのようなものを使用して、ファイルのアップロードをリッスンし、オーディオを処理してデータベースに書き戻すことです。

+0

わかりやすく、代替手段を提供していただき、ありがとうございます。 –

0

API_KEYとは

あなたはそれについて言及していません!

関連する問題