Node.js中的二进制文件转换为Base64

3

当我调用tts.speech.microsoft.com API时,我得到了一个二进制音频文件,现在我想将其转换为base64字符串。

我已经尝试了很多方法,例如:

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

无法正常工作。

我不确定“二进制”是否是准确的词语,但它不是一种可读的格式。

感谢您的帮助。


我从手机调用此端点,并尝试播放声音。当我尝试使用另一个base64字符串时,它可以正常工作,所以我知道此部分代码没有问题。@Dominic - GuillaumeC
它来自Google Cloud。 - GuillaumeC
1
你可以在这里看到转换代码没有任何问题 - https://repl.it/@DominicTobias/WorstUtilizedComputers (将二进制的“apple”转换为base64并再次转回)。因此,问题出现在你没有发布的代码中,很可能是你的二进制数据与工作数据不匹配。 - Dominic
是的,我可以看到这部分是正确的,但是当我尝试保存文件并从我的计算机本地读取时,该文件无法读取: const content = Buffer.from(body, "binary").toString("base64"); require("fs").writeFile("out.wav", content, "base64", function(err) { console.log(err); }); 也许响应不是二进制的? - GuillaumeC
1
body 是什么格式?它只是作为缓冲区/字节数组传入吗? - Alex
显示剩余5条评论
1个回答

6

我猜您是在按照官方文档 Quickstart: Convert text-to-speech using Node.js 中的Make a request and save the response部分编写代码,如下所示。

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的函数,使用Base64对body进行编码。

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-streamget-streambody获取Base64字符串。

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);
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接