我正在尝试使用新帐户(仅具有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
。语言就是去。
我是在做错什么,还是没有用户名/密码身份验证即不赞成使用Watson的语音连接到文本WebSocket watson-token
?
编辑:
打开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
}
我在端点中出错,并使用了文本到语音而不是语音到文本。使用正确的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句