Разбор HTTP-ответа Watson TTS в nodejs

Поскольку 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, который исправляет множество похожих проблем, но это тоже не сработало.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
452
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить свой результат, используя официальный узел 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 / синтезировать называется неявно.

Отлично, это сработало. Но почему пример здесь console.bluemix.net/apidocs/… дал мне Cannot read property 'on' of undefined?

Marwan 19.12.2018 16:18

Это связано с вашим tsconfig.json. Тип возврата - ReadableStream в пространстве имен NodeJS. Смотрите здесь: stackoverflow.com/questions/44416902/…

briadeus 19.12.2018 16:54

Совсем не знал об этом файле, но у нас его нет, стоит ли его добавить? или модифицируем ту, что внутри упаковки?

Marwan 19.12.2018 17:19

Нет, не пробовал Websocket API. Это зависит от настроек вашего проекта, мы используем Typescript и настраиваем транспиляцию с помощью tsconfig.json.

briadeus 19.12.2018 18:13

Прохладный. Большое спасибо за вашу помощь.

Marwan 20.12.2018 09:50

Другие вопросы по теме