在 nodejs 中解析 Watson TTS HTTP 响应
Parsing Watson TTS HTTP response in nodejs
由于 IBM 更改了 Watson 的身份验证方法,我们试图在我们的代码中实现它,但我们无法使用他们的 SDK 或原始 websockets 从 TTS 服务接收任何数据。
唯一有效的是 HTTP API,它 returns 类似于 this 的响应。它不是有效的 json,也不是缓冲区。
我们已经在 nodejs SDK 中打开了一个 issue,但我们现在想使用 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
会更改 link,因为 /v1/synthesize 被称为 implicitly。
由于 IBM 更改了 Watson 的身份验证方法,我们试图在我们的代码中实现它,但我们无法使用他们的 SDK 或原始 websockets 从 TTS 服务接收任何数据。
唯一有效的是 HTTP API,它 returns 类似于 this 的响应。它不是有效的 json,也不是缓冲区。
我们已经在 nodejs SDK 中打开了一个 issue,但我们现在想使用 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
会更改 link,因为 /v1/synthesize 被称为 implicitly。