如何在JS中连接Buffer数据和writeFile?

问题描述

我使用 Azure 语音 SDK 将一组文本文件转换为语音。成功转换所有文本,并为每个文本返回一个 ArrayBuffer 实例。然后我将它们中的每一个都转换为 Buffer 并使用 Buffer.concat() 将所有缓冲区连接为一个。然后我将串联的缓冲区数据传递给 fs.writeFile() 以创建一个 mp3 文件。但是,音频文件中仅包含第一个缓冲区,而不是连接的缓冲区。 我该怎么办?

解决方法

为了提供一点背景知识,音频文件通常由一些包含音频信息的标题数据组成(例如采样率、音频的通道数等),然后是实际的音频数据。一般来说,每个音频文件应该只有一个标题。

如果您只是将音频数据连接在一起,则媒体播放器将读取第一个文件的标题。由于这不包含有关您已连接的其他音频文件的任何信息,因此您将获得一些非确定性行为。它可能只播放第一个文件中的音频,可能会给您一个错误,或者它可能会尝试将其余音频文件的标题部分作为音频数据播放(这是不正确的)。

为了使事情正常工作,您需要更新标头以反映所有音频数据,并去除剩余的标头。您还需要确保所有音频数据的字节对齐、格式等...一致。

最好的办法是使用一些了解如何读取和解析音频文件的软件来拼接您的文件。使用您选择的搜索引擎进行搜索,例如合并 mp3 文件应该会有所帮助。