如何在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




