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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете получить свой результат, используя официальный узел 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.info('failure');
return;
}
fs.writeFileSync('result-audio.wav', audio);
console.info('scuccess');
});
Обратите внимание, что упаковка его в TextToSpeechV1 изменяет ссылку, поскольку / v1 / синтезировать называется неявно.
Это связано с вашим tsconfig.json. Тип возврата - ReadableStream в пространстве имен NodeJS. Смотрите здесь: stackoverflow.com/questions/44416902/…
Совсем не знал об этом файле, но у нас его нет, стоит ли его добавить? или модифицируем ту, что внутри упаковки?
Нет, не пробовал Websocket API. Это зависит от настроек вашего проекта, мы используем Typescript и настраиваем транспиляцию с помощью tsconfig.json.
Прохладный. Большое спасибо за вашу помощь.
Отлично, это сработало. Но почему пример здесь console.bluemix.net/apidocs/… дал мне
Cannot read property 'on' of undefined?