使用 IAM API 密钥的 IBM Watson 语音转文本 WebSocket 授权

Posted

技术标签:

【中文标题】使用 IAM API 密钥的 IBM Watson 语音转文本 WebSocket 授权【英文标题】:IBM Watson speech to text WebSocket authorization with IAM API key 【发布时间】:2018-12-13 16:15:53 【问题描述】:

我正在尝试使用仅具有 IAM 授权的新帐户连接到 IBM Watson 的语音到文本 WebSocket。

我的 WS 端点是 wss://stream-fra.watsonplatform.net/text-to-speech/api/v1/recognize,我通过 https://iam.bluemix.net/identity/token 获得访问令牌。现在,当我打开带有 Authorization 标头的套接字连接,其值为 Bearer token 时,我得到一个错误的握手响应:websocket: bad handshake, Unauthorized 401。语言是 Go。

我是不是做错了什么,或者如果没有用户名/密码身份验证(即已弃用的watson-token)就无法连接到 Watson 的语音到文本 WebSocket?

编辑:

打开WebSocket的代码:

headers := http.Header
headers.Set("Authorization", "Bearer " + access_token)
conn, resp, err := websocket.DefaultDialer.Dial("wss://stream-fra.watsonplatform.net/text-to-speech/api/v1/recognize", headers)

我也尝试过使用apikey:**api_key** 进行基本授权,结果是一样的:401

编辑 2:

获取成功并返回访问和刷新令牌的访问令牌(基于 Watson Swift 和 Python SDK)的代码:

func getWatsonToken(apiKey string) (string, error) 
    // Base on the Watson Swift and Python SDKs
    // https://github.com/watson-developer-cloud/restkit/blob/master/Sources/RestKit/Authentication.swift
    // https://github.com/watson-developer-cloud/python-sdk/blob/master/watson_developer_cloud/iam_token_manager.py

    const tokenUrl = "https://iam.bluemix.net/identity/token"

    form := url.Values
    form.Set("grant_type", "urn:ibm:params:oauth:grant-type:apikey")
    form.Set("apikey", apiKey)
    form.Set("response_type", "cloud_iam")

    // Token from simple "http.PostForm" does not work either
    //resp, err := http.PostForm(tokenUrl, form)

    req, err := http.NewRequest(http.MethodPost, tokenUrl, nil)
    if err != nil 
        log.Printf("could not create HTTP request to get Watson token: %+v", err)
        return "", nil
    

    header := http.Header
    header.Set("Content-Type", "application/x-www-form-urlencoded")
    header.Set("Accept", "application/json")
    // "Yng6Yng=" is "bx:bx"
    header.Set("Authorization", "Basic Yng6Yng=")
    req.Header = header

    req.Body = ioutil.NopCloser(bytes.NewReader([]byte(form.Encode())))

    resp, err := http.DefaultClient.Do(req)
    if err != nil 
        log.Printf("problem executing HTTP request to get Watson token: %+v", err)
        return "", err
    

    defer resp.Body.Close()

    if resp.StatusCode != 200 
        return "", errors.New(fmt.Sprintf("failed to get Watson token: %d", resp.StatusCode))
    

    jsonBody, err := ioutil.ReadAll(resp.Body)
    if err != nil 
        log.Printf("problem reading Watson token from response body: %+v", err)
    

    tokenResponse := &struct 
        AccessToken  string `json:"access_token"`
        RefreshToken string `json:"refresh_token"`
        TokenType    string `json:"token_type"`
        ExpiresIn    int64  `json:"expires_in"`
        Expiration   int64  `json:"expiration"`
    

    err = json.Unmarshal(jsonBody, tokenResponse)
    if err != nil 
        log.Printf("could not parse Watson token response: %+v", err)
        return "", err
    

    return tokenResponse.AccessToken, err

【问题讨论】:

您可以在此处添加代码以确保我理解您的尝试吗? @VidyasagarMachupalli 我已经添加了代码。 【参考方案1】:

我在端点中出错并使用文本到语音而不是语音到文本。使用正确的 URL,WebSocket API 可以工作。

wss://stream-fra.watsonplatform.net/text-to-speech/api/v1/recognize 应该是wss://stream-fra.watsonplatform.net/speech-to-text/api/v1/recognize

【讨论】:

以上是关于使用 IAM API 密钥的 IBM Watson 语音转文本 WebSocket 授权的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 API 使用 IBM Watson 对话

iOS/IBM Cloud/Swift:使用 AlamoFire 发布到 Watson API

IBM Watson 语音到文本 API 中的 1006 错误代码

如何从.net核心调用ibm watson api

Bluemix 中的 IBM Watson Visual Recognition Service 总是返回空内容

由于 Rails/AJAX 应用程序上的 CORS,无法在本地访问 IBM Watson API