Сбои аутентификации IBM Cloud Speech-to-Text SDK с токеном-носителем - PullRequest
0 голосов
/ 27 марта 2020

Я учусь использовать Watson Speech JS SDK . Особенно мне нравится Транскрибирование с микрофона, с альтернативами . Я генерирую свой токен с помощью облачной функции Firebase. Я использую AngularJS, а не JQuery. Первая проблема, с которой я сталкиваюсь:

var stream = WatsonSpeech.SpeechToText.recognizeMicrophone(Object.assign(token, {
          objectMode: true,
          format: false,
          wordConfidence: true
}));

Я получил это сообщение об ошибке:

WatsonSpeechToText: missing required parameter: opts.token

(Использование $scope.token или token не имеет значения.)

Поиск этой ошибки в документации :

module.exports = function recognizeMicrophone(options) {
  if (!options || !options.token) {
    throw new Error('WatsonSpeechToText: missing required parameter: opts.token');
  }

ОК, он ищет объект options. Я исправил ошибку с помощью этого кода:

const options = {
      token: $scope.token,
      objectMode: true,
      format: false,
      wordConfidence: true
};
console.log(options);
var stream = WatsonSpeech.SpeechToText.recognizeMicrophone(options);

Теперь я получаю эту ошибку:

WebSocket connection to 'wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=en-US_BroadbandModel&watson-token=[object%20Object]' failed: HTTP Authentication failed; no valid credentials available

Объект options регистрирует это:

token:
  access_token: "eyJraWQiOiIyMDIwMDIyNTE4MjgiLCJhbGciOiJSUzI1NiJ9.eyJpYW1faWQiOiJp0tU2..."
  expiration: 1585332575
  expires_in: 3600
  refresh_token: "OKC8z8ebLMzZcrAt6YgInnJJn0UIx1P3NTeDvdEC3kJqIQ7Yn9J9iu6-DF..."
  scope: "ibm openid"
  token_type: "Bearer"
objectMode: true
format: false
wordConfidence: true
smart_formatting: false

токен является JSON объектом, который включает access_token. Это то, что хочет SDK? Документация RecognizeStream не говорит, хочет ли он токен JSON или просто голый access_token.

Добавление 000 в поле expiration показывает, что у меня есть 53 на этом токене осталось минут.

Я использую ключ API, который указывает c для моей службы преобразования речи в текст.

Есть еще предложения?

1 Ответ

0 голосов
/ 31 марта 2020

Версия 0.37.0 SDK внесла критические изменения:

All options parameters for all methods are coverted to be lowerCamelCase
For example: access_token is now accessToken and content-type is now contentType

Это связано с переходом IBM из сервисов Cloud Foun dry с аутентификацией по имени пользователя и паролю в Сервисы с Ключи аутентификации IAM и API. Документация SDK гласит:

NOTE: The token parameter only works for CF instances of services. For RC services using IAM for authentication, the accessToken parameter must be used.

Объект options выглядит так, если вы используете ключ API:

const options = {
      accessToken: $scope.token,
      objectMode: true,
      format: false,
      wordConfidence: true
};

Если вы опустите маркер свойство, которое вы получаете это сообщение об ошибке:

WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)

Это означает, что если вы получаете свой токен от Cloud Foun dry (CF), свойство должно быть opts.token (или options.token) ; но если вы получаете свой токен от IAM-аутентификации и API-ключа, который называется RC, без причины, о которой я знаю, тогда это свойство должно быть opts.accessToken (или options.accessToken).

Неправильный вопрос, исходный код демо-версии подразумевает, что access_token является именем свойства:

var stream = WatsonSpeech.SpeechToText.recognizeMicrophone(Object.assign(token, {
          objectMode: true,
          format: false,
          wordConfidence: true
}));

Object.assign принимает объект токена target как это происходит от IBM, а затем добавляет или заменяет свойства и значения в объекте source. Поскольку в токене IAM свойство равно access_token, вы могли бы подумать, что из-за запуска демонстрации это свойство access_token. Но, очевидно, демоверсия работает на токене Cloud Foun dry, который может использовать либо token, либо access_token в качестве имени свойства.

Если вы получаете это сообщение об ошибке:

WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)

тогда вы не используете ни token, ни accessToken в качестве имени свойства.

Если вы получаете это сообщение об ошибке:

WebSocket connection to 'wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=en-US_BroadbandModel&watson-token=[object%20Object]' failed: HTTP Authentication failed; no valid credentials available

, тогда вы используете token с токеном, сгенерированным с помощью API-ключа IAM. Или ваш токен истек. Вы можете легко это проверить, вставив этот код в свое приложение, чтобы узнать, сколько минут осталось на вашем токене:

// shows time to token expiration
    var expiry = new Date($scope.token.expiration * 1000);
    var now = Date.now();
    var duration = -(now - expiry);

    function msToTime(duration) {
      var milliseconds = parseInt((duration % 1000) / 100),
      seconds = Math.floor((duration / 1000) % 60),
      minutes = Math.floor((duration / (1000 * 60)) % 60),
      hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

      hours = (hours < 10) ? "0" + hours : hours;
      minutes = (minutes < 10) ? "0" + minutes : minutes;
      seconds = (seconds < 10) ? "0" + seconds : seconds;

      return "Token expires in " + minutes + ":" + seconds + " minutes:seconds";
    }
    console.log(msToTime(duration))

Вы можете проверить, действителен ли ваш токен из CLI. Сначала получите новый токен:

curl -k -X POST \
  --header "Content-Type: application/x-www-form-urlencoded" \
  --header "Accept: application/json" \
  --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" \
  --data-urlencode "apikey=s00pers3cret" \
  "https://iam.cloud.ibm.com/identity/token"

, затем запросите языковые модели:

curl -X GET "https://stream.watsonplatform.net/speech-to-text/api/v1/models?access_token=eyJraWQiO...."

У меня была другая проблема в моем коде. Я обновлял IBM Speech-to-Text SDK , но мой код был связан со старым SDK, который я установил с трехлетней давностью go. Я не осознавал, что использую 0.33.1, когда 0.38.0 - последняя версия. Добавьте это к своему коду, чтобы решить эту проблему:

console.log (WatsonSpeech.version);

При использовании старого SDK я получал старое сообщение об ошибке, в котором даже не упоминалось имя нового свойства:

WatsonSpeechToText: missing required parameter: opts.token

В моем сообщении в блоге больше о IBM Cloud Speech-to-Text.

...