如何获取 IBM watson STT 服务的身份验证令牌?

Posted

技术标签:

【中文标题】如何获取 IBM watson STT 服务的身份验证令牌?【英文标题】:How to get the authentication token for IBM watson STT service? 【发布时间】:2019-05-09 06:53:24 【问题描述】:

我正在尝试使用 Watson Speech To Text 服务,该服务需要按照 documentation 的 websocket 接口使用以下命令

var token = authentication-token;
var wsURI = 'wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize'
+ '?watson-token=' + token
+ '&model=es-ES_BroadbandModel';

我已经尝试在终端上使用 curl 命令获取authentication-token

curl -X GET --user "apikey:apikey" "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/text-to-speech/api"

上面的命令产生

错误:"code":401,"error":"Unauthorized","description":"ERCD250-LDAP-DN-AUTHERR"

找不到合适的文档,包括在 IBM watson 团队发布 recent changes 之后似乎超出范围的几篇帖子。

问题:如何获得authentication-token 以正确连接到 watson Web 套接字?

【问题讨论】:

【参考方案1】:

要获取authentication-token,您需要运行以下cURL 命令。这可以在连接之前包含在您的程序中(websocket 握手)。

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=your apikey" "https://iam.bluemix.net/identity/token"

点击此链接了解更多详情 - https://console.bluemix.net/docs/services/watson/getting-started-iam.html

对于 C++ 用户 - 您可以将其包括在下面

#include <curl/curl.h>

main()
    //step 1- Initialise curl library
    //step 2- Set header
              curl_slist_append(headers,"Accept: application/json");
    //step 3- Set Post request data
              curl_slist_append(postdata,"grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=my apikey");
    //step 4- setup cURL request
          curl_easy_setopt(curl, CURLOPT_URL,"https://iam.bluemix.net/identity/token");
          curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);
/*Write callbacks to use the response in your authentication*/

          res = curl_easy_perform(curl);

    curl_slist_free_all(headers);
    // always cleanup
    curl_easy_cleanup(curl);

在callback 中取一个变量token 来保存解析后的响应

token = "Bearer<space><ParsedResponse>";

此字符串应用作 websoket 握手

请求标头

【讨论】:

【参考方案2】:

Speech to Text API 文档中所述,

您不能使用 javascript 从 浏览器。可用的 watson-token 参数 /v1/recognize 方法不接受 IAM 令牌或 API 密钥。为了 有关解决此限制的信息,请参阅Release notes。

这是已知的限制,

Speech to Text 服务具有以下已知限制。

使用 IAM 身份验证的服务实例目前无法使用 JavaScript 调用 Speech to Text WebSocket 接口。这 限制适用于任何应用程序(例如服务演示) 使用 JavaScript 从浏览器进行 WebSocket 调用。网络套接字 使用其他语言进行的调用可以使用 IAM 令牌或 API 键。要解决此限制,您可以执行以下操作:

从浏览器外部调用 WebSocket 接口。你可以打电话 支持 WebSocket 的任何语言的接口。参考 WebSocket 接口中的信息,用于在使用时提供指导 另一种语言。

Watson SDK 提供了调用 WebSocket 的最简单方法 来自另一种语言的界面。 SDK 接受 API 密钥并管理 令牌的生命周期。 有关使用 WebSocket 的信息 与 Node.js、Java、Python 和 Ruby SDK 的接口,请参阅API reference。

使用同步或异步 HTTP 接口执行语音 识别。

如果您有一个旧的 Speech to Text 服务并带有云代工厂凭据(用户名和密码),您可以像这样对 watson-token 发出 Curl 请求

curl -u USERNAME:PASSWORD"https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"

即使这也记录在 API 文档中的 watson-token 参数下的 Curl

为服务提供身份验证令牌。使用的令牌是 基于 Cloud Foundry 服务凭证。不要通过 IAM 访问 带有此参数的令牌或 API 密钥。

更新:无法从 curl 调用 WebSocket 接口。使用客户端脚本语言调用接口。您可以在每个编程语言 SDK 中找到用于流式传输音频的代码示例,例如 Python SDK - https://github.com/watson-developer-cloud/python-sdk/blob/master/examples/microphone-speech-to-text.py

2019 年 2 月 9 日更新

根据发布文档,现在可以再次从浏览器向 websocket API 进行身份验证。请参阅:https://cloud.ibm.com/docs/services/speech-to-text/release-notes.html#release-notes,2019 年 1 月 28 日发布。 但是,无法从浏览器中使用您的 API 密钥获取身份验证令牌(出于安全原因,CORG 已阻止)。 因此,要使这项工作: - 获取达拉斯的 api 令牌(没有让它在其他地区工作,看起来 lib 是硬编码设置到达拉斯服务器的) - 使用后端应用程序使用您的 api 密钥获取身份验证令牌 - 使用 Speech-javascript-sdk 直接从浏览器中使用身份验证令牌

【讨论】:

嗨@VidyasagarMachupalli 感谢您的意见。 嗨@VidyasagarMachupalli 我已经阅读了上述文档,但由于“身份验证失败”,我无法让该服务为我工作。我不是老用户,从上个月开始我几乎没有开始使用这项服务。我已经使用apikey 作为curl -X POST -u "apikey:apikey" 对音频文件(保存在计算机中)进行了 STT。现在我想使用流式音频输入而不是音频文件。为此,文档说我需要使用 wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?watson-token=token 打开连接我如何获得这个 token @RohanChawhan 我用与 curl 使用相关的更多信息更新了我的答案。 我没有使用 curl 作为 websocket 接口。我正在为此使用 boost 库。但要连接到“主机”,我需要提供身份验证令牌。所以我的问题是“我如何获得我的身份验证令牌?reference 答案中明确提到,如果要使用 API 密钥,则应使用客户端编程语言代码/SDK。根据 API 文档,支持的编程语言是 Java、Node、Python 等,您还拥有 SDK 来帮助您使用 API 密钥流式传输音频。请参阅上面我更新的答案中的示例。

以上是关于如何获取 IBM watson STT 服务的身份验证令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Watson STT Java - Websockets Java 和 HTTP POST 之间的不同结果

从 IBM Watson Assistant 获取我的聊天机器人中的选项列表

我可以在没有 Bluemix 的情况下使用 IBM Watson 服务吗?

Watson机器学习(WML)身份验证问题; WML工作示例(?)

Curl 文本到语音中的 SSML 代码 IBM Watson

如何在 IBM Watson Assistant 客户端中实现“客户端”类型的操作?