javascript - 在 nodejs 中解析 Watson TTS HTTP 响应

标签 javascript node.js text-to-speech ibm-watson watson-text-to-speech

由于 IBM 更改了 Watson 的身份验证方法,我们试图在我们的代码中实现它,但我们无法使用他们的 SDK 或原始 websockets 从 TTS 服务接收任何数据。

唯一有效的是 HTTP API,它返回类似 this 的响应.它不是有效的 json,也不是缓冲区。

我们已经开了一个issue在 nodejs SDK 中,但我们现在想使用 HTTP API。

以下是获得类似响应的方法:

let requestPromise = require('request-promise-native');
let fs = require("fs")

let postData = {
    "grant_type":"urn:ibm:params:oauth:grant-type:apikey",
    "apikey":"<api_key>"
};

let opts = {
    uri : "https://iam.bluemix.net/identity/token",
    headers : {
        "Content-Type": "application/x-www-form-urlencoded",
        "Accept": "application/json"
    },
    method: "POST",
    form: postData
}

requestPromise(opts).then((body)=>{
    let token = JSON.parse(body).access_token;

    let postData = {
        "text": 'Hello world',
        "accept": 'audio/mp3',
        "voice": 'en-US_AllisonVoice'
    };

    let opts = {
        uri : "https://gateway-syd.watsonplatform.net/text-to-speech/api/v1/synthesize",
        headers : {
            "Content-Type": "application/json",
            "Accept": "application/json",
            // "Accept": "audio/mp3",
            'Content-Length' : Buffer.byteLength(JSON.stringify(postData)),
            "Authorization": "Bearer "+token
        },
        method: "POST",
        json: postData
    }

    requestPromise(opts).then((body)=>{
        let chunkStream = fs.createWriteStream('./audio.mp3')
        let buf = Buffer.from(body, 'base64')
        chunkStream.write(buf)
    }).catch((err)=>{
        if (err) throw err;
    })
}).catch((err)=>{
    if (err) throw err;
})

我们不知道如何处理该响应,将其作为 base64 缓冲区保存到 mp3,生成损坏的音频文件,如果您将响应直接保存到文件,或更改Accept header 到 audio/mp3。我们甚至尝试通过 mp3val 运行音频文件它解决了很多类似的问题,但也没有用。

最佳答案

您可以使用官方 node api 获得您的结果:

npm install --save watson-developer-cloud

之后

var TextToSpeechV1 = require('watson-developer-cloud/text-to-speech/v1');
var fs = require('fs');

var textToSpeech = new TextToSpeechV1({
  iam_apikey: 'API_KEY',
  url: 'https://gateway-syd.watsonplatform.net/text-to-speech/api/'
});

var synthesizeParams = {
  text: 'How are you doing?',
  accept: 'audio/wav',
  voice: 'en-US_AllisonVoice'
};


textToSpeech.synthesize(synthesizeParams, function (err, audio) {
  if (err) {
    // do something
    console.log('failure');
    return;
  }

  fs.writeFileSync('result-audio.wav', audio);
  console.log('scuccess');
  });

请注意,将其包装到 TextToSpeechV1 会更改链接,因为 /v1/synthesize 称为 implicitly .

关于javascript - 在 nodejs 中解析 Watson TTS HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851076/

相关文章:

c++ - stdafx.h 和 sapi.h 在 C++ 中无法正常工作(使用 Code::Blocks)

python - Pyttsx,我无法更改代码中的性别...,我做错了什么?

javascript - 当被内存的功能接受功能时,Lodash 内存键?

javascript - 已选择选项的 HTML 选择元素 onchange 触发器

javascript - 当带有数据目标而不是 href 的选项卡时,Bootstrap Tab 不起作用

javascript - 从客户端调用 node.js 服务时的竞争条件

c# - 如何在 SAPI 5 上使用 x-sampa 音标

javascript - 鼠标悬停时突出显示文本行

javascript - 是否可以强制 Node VM 上下文停止运行?

node.js - 使用 Q/promises 与回调