1

我一直在尝试向 Google Video Intelligence API 发送 SAFE_SEARCH_DETECTION(在 node.js 中)的请求,但我一直遇到同样的错误:

错误:{ 错误:请求包含无效参数。在/Users/paulsteenkiste/node_modules/grpc/src/node/src/client.js:569:15 代码:3,元数据:元数据{_internal_repr:{}​​},注意:'重试方法发生异常,未归类为短暂的' }

我试图深入研究错误中列出的那个 client.js 文件,但它不是很有启发性。这是产生此错误的代码:

const firebase = require('firebase');

firebase.initializeApp({
    serviceAccount: "./service-account.json",
    apiKey: "<API key>",
    databaseURL: "<My Database>"
});

// Imports the Google Cloud Video Intelligence library
const Video = require('@google-cloud/video-intelligence');

// Instantiates a client
const video = Video();

firebase.auth().signInWithEmailAndPassword("<My email>", "<My password>")
    .then(function(user) {

    // The GCS filepath of the video to analyze
    const gcsUri = '<File location>';

    const request = {
      inputUri: gcsUri,
      features: ["SAFE_SEARCH_DETECTION"]
    };

    // Human-readable likelihoods
    const likelihoods = ['UNKNOWN', 'VERY_UNLIKELY', 'UNLIKELY', 'POSSIBLE', 'LIKELY', 'VERY_LIKELY'];

    // Detects unsafe content
    video.annotateVideo(request)
      .then((results) => {
        const operation = results[0];
        console.log('Waiting for operation to complete...');
        return operation.promise();
      })
      .then((results) => {
        // Gets unsafe content
        const safeSearchResults = results[0].annotationResults[0].safeSearchAnnotations;
        console.log('Safe search results:');
        safeSearchResults.forEach((result) => {
          console.log(`Time: ${result.timeOffset / 1e6}s`);
          console.log(`\tAdult: ${likelihoods[result.adult]}`);
          console.log(`\tSpoof: ${likelihoods[result.spoof]}`);
          console.log(`\tMedical: ${likelihoods[result.medical]}`);
          console.log(`\tViolent: ${likelihoods[result.violent]}`);
          console.log(`\tRacy: ${likelihoods[result.racy]}`);
        });
      })
      .catch((err) => {
        console.error('ERROR:', err);
      });
    })
    .catch(function(error) {
        var errorCode = error.code;
        var errorMessage = error.message;
        console.log(errorMessage);
    });

(请注意,这实际上是从 Google 的文档中复制和粘贴的,网址为https://cloud.google.com/video-intelligence/docs/analyze-safesearch)。service-account.json 是我创建服务帐号时下载的文件,和上面的文件在同一个文件夹下。我认为没有必要进行 firebase 身份验证,但我想确保这不是问题。我已经启用了 API 并且可以完全访问该项目,所以这些都不是问题。

我相信问题出在服务帐户上,但无论我尝试什么,都会出现相同的错误。我尝试过的一些事情:

  1. 从终端设置 GOOGLE_APPLICATION_CREDENTIALS
  2. 为该服务帐户提供“套件域范围委派”
  3. 公开文件
  4. 执行此处答案推荐的“gsutil”命令:向 GCP Video Intelligence API 发出请求时权限被拒绝

关于问题是什么的任何想法?

4

1 回答 1

0

我在最近的一个项目中遇到了同样的问题,发现这是由于https://在 Google Cloud Services 需要一个 URI 时提交了一个gs://URI。这Error: Request contains an invalid argument.让我很确定这是问题所在。

最简单的解决方法是直接修改您传递给 API 调用的 url。

const gcsUri = '<File location>'.replace('https://storage.googleapis.com/', 'gs://')

是的,他们的大多数 API 都要求文件在他们自己的云存储中。如果您尝试处理位于其他地方的视频,您可能首先需要将其复制到他们的云存储中。

于 2018-02-19T21:20:12.783 回答