Ibm cloud IBM云语音到文本SDK身份验证失败,带有承载令牌

Ibm cloud IBM云语音到文本SDK身份验证失败,带有承载令牌,ibm-cloud,ibm-cloud-speech,Ibm Cloud,Ibm Cloud Speech,我正在学习使用这个工具。我特别喜欢。我正在用Firebase云函数生成我的令牌。我使用的是AngularJS,不是JQuery。我遇到的第一个问题是 var stream=watsonspeechtotext.recognizeMicrophone(Object.assign(token){ objectMode:true, 格式:false, 自信:真的 })); 我收到了以下错误消息: WatsonSpeechToText: missing required parameter: opts

我正在学习使用这个工具。我特别喜欢。我正在用Firebase云函数生成我的令牌。我使用的是AngularJS,不是JQuery。我遇到的第一个问题是

var stream=watsonspeechtotext.recognizeMicrophone(Object.assign(token){
objectMode:true,
格式:false,
自信:真的
}));
我收到了以下错误消息:

WatsonSpeechToText: missing required parameter: opts.token
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
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
(使用
$scope.token
token
没有区别。)

在中查找此错误:

module.exports=功能识别微型电话(选项){
如果(!options | |!options.token){
抛出新错误('WatsonSpeechToText:缺少必需参数:opts.token');
}
好的,它正在寻找一个
options
对象。我用以下代码修复了错误:

const选项={
令牌:$scope.token,
objectMode:true,
格式:false,
自信:真的
};
console.log(选项);
var stream=WatsonSpeech.SpeechToText.RecognitizeMicrophone(选项);
现在我得到了这个错误:

WebSocket连接到'wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=en-US_BroadbandModel&watson令牌=[object%20Object]”失败:HTTP身份验证失败;没有可用的有效凭据
选项
对象记录以下内容:

令牌:
访问令牌:“eyjrawqioiymdiwmdiynte4mjgilcjhbgcioijsuzi1nij9.eyJpYW1faWQiOiJp0tU2…”
有效期:1585332575
在:3600
刷新令牌:“OKC8Z8EBLMZZCRAT6YGINJJN0UIX1P3NTEDVEC3KJQIQ7YN9J9IU6 DF…”
范围:“ibm openid”
令牌类型:“承载者”
objectMode:true
格式:false
自信:真的
智能格式化:false
令牌是一个JSON对象,其中包括
access\u令牌
。这是SDK想要的吗?它没有说明是想要JSON令牌还是只想要裸
access\u令牌

000
添加到
expiration
字段显示我还有53分钟的时间使用此令牌

我正在使用特定于语音到文本服务的API密钥

还有其他建议吗?

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 Foundry服务转向使用IAM身份验证和api密钥的服务有关

如果使用api键,
选项
对象如下所示:

const选项={
accessToken:$scope.token,
objectMode:true,
格式:false,
自信:真的
};
如果省略令牌属性,则会收到以下错误消息:

WatsonSpeechToText: missing required parameter: opts.token
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
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
这意味着,如果您从Cloud Foundry(CF)获取令牌,则属性必须是
opts.token
(或
options.token
);但如果您从IAM auth获取令牌和api密钥(我不知道为什么称为
RC
),则属性必须是
opts.accessToken
(或
options.accessToken

让人困惑的是,
access\u token
是属性名称:

WatsonSpeechToText: missing required parameter: opts.token
var stream=watsonspeechtotext.recognizeMicrophone(Object.assign(token){
objectMode:true,
格式:false,
自信:真的
}));
Object.assign
是将来自IBM的
target
令牌对象作为对象,然后添加或替换
source
对象中的属性和值。由于属性是IAM令牌中的
access\u token
,您可能会认为,由于演示运行,
access\u token
是属性。但是该演示在Cloud Foundry令牌上运行,该令牌可以使用
令牌
访问令牌
作为属性名称

如果您收到此错误消息:

WatsonSpeechToText: missing required parameter: opts.token
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
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
也不使用
accessToken
作为属性名

如果您收到此错误消息:

WatsonSpeechToText: missing required parameter: opts.token
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
WatsonSpeechToText: missing required parameter: opts.token (CF) or opts.accessToken (RC)
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
然后,您正在使用带有IAM api密钥生成的令牌的
token
。或者您的令牌已过期。您可以通过将此代码放入应用程序中来轻松检查,以告知您的令牌还剩多少分钟:

//显示令牌过期的时间
var到期=新日期($scope.token.expiration*1000);
var now=Date.now();
风险值持续时间=-(现在-到期);
函数msToTime(持续时间){
var毫秒=parseInt((持续时间%1000)/100),
秒=数学楼层((持续时间/1000)%60),
分钟=数学楼层((持续时间/(1000*60))%60),
小时=数学楼层((持续时间/(1000*60*60))%24);
小时数=(小时数<10)?“0”+小时数:小时数;
分钟=(分钟<10)?“0”+分钟:分钟;
秒=(秒<10)?“0”+秒:秒;
return“令牌在“+分钟+”内过期:“+秒+”分钟:秒”;
}
console.log(msToTime(持续时间))
您可以从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...."
我的代码中还有一个问题。我正在更新,但我的代码链接到三年前随bower一起安装的旧SDK。当0.38.0是最新版本时,我没有意识到我使用的是0.33.1。请将此添加到代码中以解决此问题:

console.log(WatsonSpeech.version);
使用旧SDK时,我收到一条旧的错误消息,甚至没有提到新的属性名称:

WatsonSpeechToText: missing required parameter: opts.token
My提供了有关IBM云语音到文本的更多信息。

版本的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 Foundry服务转向使用IAM身份验证和api密钥的服务有关

如果使用api键,
选项
对象如下所示:

const选项={
accessToken:$scope.token,
objectMode:true,
格式:false,
自信:真的
};
如果你遗漏了正确的代币