Версия 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.