You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Firebase云函数中将Google Text-to-Speech返回的Base64音频字符串正确保存为可播放音频至Firebase Storage?

解决Google TTS Base64音频转Firebase Storage二进制文件的问题

我明白你现在碰到的问题:把Google Text-to-Speech返回的Base64音频字符串存到Firebase Storage后,文件变成了纯文本格式,根本没法播放。问题其实出在创建Buffer时没指定正确的编码格式,导致Base64字符串被当成普通UTF-8文本处理了。

修正后的代码

只需要给Buffer.from加上'base64'作为第二个参数,就能正确解码音频内容了:

let buffer = Buffer.from(audioResponse.data.audioContent, 'base64'); // 关键:指定base64编码解码
let file = storage.bucket("bucketname").file("audio7.mp3");
await file.save(buffer, {
  metadata: { contentType: "audio/mpeg" },
  public: true,
}).catch((errSave) => {
  response.status(500).send(errSave);
  return;
});

为什么原代码会失效?

当你调用Buffer.from(字符串)时,Node.js默认会用utf8编码解析字符串。但Google TTS返回的audioContent是Base64编码的二进制音频数据,直接用UTF-8解析的话,只会把Base64字符转换成对应的UTF-8字节,而不是解码成原始的音频二进制流——最后存到Storage的自然就是Base64文本的字节,肯定没法播放。

指定'base64'参数后,Buffer会正确把Base64字符串解码成原始的MP3二进制数据,再保存到Storage,这样文件就是正常的音频格式了。

额外验证小技巧

你可以在保存前打印一下buffer的长度:如果解码正确,buffer的长度会明显小于原Base64字符串的长度(因为Base64编码会让数据体积增加约33%)。比如原Base64字符串长度是1000,解码后的buffer长度大概在750左右,这就说明解码没问题了。

内容的提问来源于stack exchange,提问作者MSaudi

火山引擎 最新活动