IBM Watson WebSocket连接失败。 HTTP验证失败;没有可用的有效凭证

时间:2019-06-04 18:30:08

标签: javascript html reactjs ibm-watson

我正在使用IBM Watson Speech to Text API开发语音文本Web应用程序。单击按钮即可获取API。但是每当我单击按钮时。我收到上述错误。我已经将我的API密钥和URL存储在一个.env文件中。 我尝试了很多,但仍继续收到此错误。请帮助我,因为我是这一切的新手。

我从Watson Github存储库中获得了server.js

Server.js



'use strict';

/* eslint-env node, es6 */
const env = require('dotenv');
env.config();
const express = require('express');
const app = express();
const AuthorizationV1 = require('watson-developer-cloud/authorization/v1');
const SpeechToTextV1 = require('watson-developer-cloud/speech-to-text/v1');
const TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');
const vcapServices = require('vcap_services');
const cors = require('cors');

// allows environment properties to be set in a file named .env

// on bluemix, enable rate-limiting and force https
if (process.env.VCAP_SERVICES) {
  // enable rate-limiting
  const RateLimit = require('express-rate-limit');
  app.enable('trust proxy'); // required to work properly behind Bluemix's reverse proxy

  const limiter = new RateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
    delayMs: 0 // disable delaying - full speed until the max limit is reached
  });

  //  apply to /api/*
  app.use('/api/', limiter);

  // force https - microphone access requires https in Chrome and possibly other browsers
  // (*.mybluemix.net domains all have built-in https support)
  const secure = require('express-secure-only');
  app.use(secure());
}

app.use(express.static(__dirname + '/static'));
app.use(cors())


// token endpoints
// **Warning**: these endpoints should probably be guarded with additional authentication & authorization for production use

// speech to text token endpoint
var sttAuthService = new AuthorizationV1(
  Object.assign(
    {
      iam_apikey: process.env.SPEECH_TO_TEXT_IAM_APIKEY, // if using an RC service
      url: process.env.SPEECH_TO_TEXT_URL ? process.env.SPEECH_TO_TEXT_URL  : SpeechToTextV1.URL
    },
    vcapServices.getCredentials('speech_to_text') // pulls credentials from environment in bluemix, otherwise returns {}
  )
);
app.use('/api/speech-to-text/token', function(req, res) {
  sttAuthService.getToken(function(err, token) {
    if (err) {
      console.log('Error retrieving token: ', err);
      res.status(500).send('Error retrieving token');
      return;
    }
    res.send(token);
  });
});


const port = process.env.PORT || process.env.VCAP_APP_PORT || 3002;
app.listen(port, function() {
  console.log('Example IBM Watson Speech JS SDK client app & token server live at http://localhost:%s/', port);
});

// Chrome requires https to access the user's microphone unless it's a localhost url so
// this sets up a basic server on port 3001 using an included self-signed certificate
// note: this is not suitable for production use
// however bluemix automatically adds https support at https://<myapp>.mybluemix.net
if (!process.env.VCAP_SERVICES) {
  const fs = require('fs');
  const https = require('https');
  const HTTPS_PORT = 3001;

  const options = {
    key: fs.readFileSync(__dirname + '/keys/localhost.pem'),
    cert: fs.readFileSync(__dirname + '/keys/localhost.cert')
  };
  https.createServer(options, app).listen(HTTPS_PORT, function() {
    console.log('Secure server live at https://localhost:%s/', HTTPS_PORT);
  });
}

App.js

import React, {Component} from 'react';
import 'tachyons';
//import WatsonSpeech from 'ibm-watson';
var recognizeMic = require('watson-speech/speech-to-text/recognize-microphone');


class App extends Component {

onListenClick = () => {

  fetch('http://localhost:3002/api/speech-to-text/token')
  .then(function(response) {
      return response.text();
  }).then(function (token) {

    var stream = recognizeMic({
        token: token, // use `access_token` as the parameter name if using an RC service
        objectMode: true, // send objects instead of text
        extractResults: true, // convert {results: [{alternatives:[...]}], result_index: 0} to {alternatives: [...], index: 0}
        format: false // optional - performs basic formatting on the results such as capitals an periods
    });

    stream.on('data', function(data) {
      console.log('error 1')
      console.log(data);
    });
    stream.on('error', function(err) {
        console.log('error 2')
        console.log(err);
    });
    //document.querySelector('#stop').onclick = stream.stop.bind(stream);
  }).catch(function(error) {
      console.log('error 3')
      console.log(error);
  });
}


render() {


return(
   <div>
      <h2  className="tc"> Hello, and welcome to Watson Speech to text api</h2>
      <button onClick={this.onListenClick}>Listen to Microphone</button>
    </div>
  );
}
}

export default App


1 个答案:

答案 0 :(得分:0)

由于您显示的唯一代码是获取授权令牌,所以我想这就是引发身份验证失败的原因。我不确定您使用的代码有多旧,但是当STT服务凭据为userid / password时使用了您使用的机制。当开始使用IAM密钥时,该机制变得不可靠。

您的样本仍在使用watson-developer-cloud,但是已被ibm-watson取代。由于将代码迁移到ibm-watson需要大量的工作,因此您可以继续使用watson-developer-cloud。

如果您坚持使用watson-developer-cloud,并希望持有带有IAM密钥的令牌,请使用:

  AuthIAMV1 = require('ibm-cloud-sdk-core/iam-token-manager/v1'),

  ...

  tokenService = new AuthIAMV1.IamTokenManagerV1({iamApikey : apikey});

  ...

  tokenService.getToken((err, res) => {
    if (err) {
      ...
    } else {
      token = res;
      ...
    }
  });