Поскольку IBM изменила метод аутентификации для Watson, мы пытались реализовать это в нашем коде, но мы не можем получить какие-либо данные от службы TTS, используя их SDK или необработанные веб-сокеты.
Единственное, что работает, это HTTP API, который возвращает ответ типа this .Это не действительный json и тоже не буфер.
Мы уже открыли проблему в SDK nodejs, но сейчас мы хотим перейти с 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
на audio/mp3
.Мы даже пытались запустить аудиофайлы через mp3val , который исправляет множество подобных проблем, но это тоже не сработало.