Двоичный файл для base64 nodejs - PullRequest
0 голосов
/ 29 января 2019

Когда я вызываю api tts.speech.microsoft.com, я получаю двоичный аудиофайл и хочу преобразовать этот двоичный файл в строку base64.

Я много пробовалвещи, например:

Buffer.from(body, "binary").toString("base64");

не работает.

Я не уверен, что «двоичный» является точным словом, но это не читаемый формат.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 января 2019

Полагаю, вы следовали разделу Make a request and save the response официального документа Quickstart: Convert text-to-speech using Node.js, чтобы написать свой код, как показано ниже.

var request = require('request');

let options = {
    method: 'POST',
    baseUrl: 'https://westus.tts.speech.microsoft.com/',
    url: 'cognitiveservices/v1',
    headers: {
        'Authorization': 'Bearer ' + accessToken,
        'cache-control': 'no-cache',
        'User-Agent': 'YOUR_RESOURCE_NAME',
        'X-Microsoft-OutputFormat': 'riff-24khz-16bit-mono-pcm',
        'Content-Type': 'application/ssml+xml'
    },
    body: body
};

function convertText(error, response, body){
  if (!error && response.statusCode == 200) {
    console.log("Converting text-to-speech. Please hold...\n")
  }
  else {
    throw new Error(error);
  }
  console.log("Your file is ready.\n")
}
// Pipe the response to file.
request(options, convertText).pipe(fs.createWriteStream('sample.wav'));

ИтакЯ изменяю приведенный выше официальный код, чтобы создать функцию encodeWithBase64 для кодирования body с Base64.

function encodeWithBase64(error, response, body){
  if (!error && response.statusCode == 200) {
    var strBase64 = Buffer.from(body).toString('base64');
    console.log(strBase64);
  }
  else {
    throw new Error(error);
  }
  console.log("Your file is encoded with Base64.\n")
}
// Pipe the response to file.
request(options, convertText);

Или вы можете использовать пакеты npm base64-stream и get-stream, чтобы получить строку с Base64 из body.

var base64 = require('base64-stream');
const getStream = require('get-stream');
(async () => {
    var encoder = new base64.Base64Encode();
    var b64s = request(options).pipe(encoder);
    var strBase64 = await getStream(b64s);
    console.log(strBase64);
})();

В противном случае stream-string также может это сделать.

var base64 = require('base64-stream');
const ss = require('stream-string');
var encoder = new base64.Base64Encode();
var b64s = request(options).pipe(encoder);
ss(b64s).then(data => {
  console.log(data);
})
...