如何使用Node.js将音频样本数组写入wav文件?

7

我正在使用JavaScript编写一个振荡器,它可以在正弦波频率之间创建扫频(即啁啾)效果。为了测试,我想将样本(浮点数)写入到wav文件中。在Node.js中该怎么做呢?我看到了很多关于浏览器端的信息,但没有任何特定于Node的内容或依赖于浏览器API的内容。


audiorecorder.js 中有一个例程可以实现这个功能。您并不需要整个库,因为它是用于浏览器的,但它确实具有制作 wav 的例程... - dandavis
2个回答

4

可以使用最小化的node-wav包及以下相似的代码片段来完成此操作:

首先,安装依赖项:

npm i node-wav

然后,使用类似于以下的工具

let fs = require('fs');
let wav = require('node-wav');

// Parameters for the below data
const size =  5000
const amplitude = 128
const sampleRate = 20

// Generate some random data for testing
const data = (new Array(3)).fill((new Array(size)).fill(Math.random() * amplitude))

let buffer = wav.encode(data, { sampleRate: sampleRate, float: true, bitDepth: 32 });

fs.writeFile("test.wav", buffer, (err) => {
  if (err) return console.log(err);

  console.log("test.wav written");
});

如果您已经了解了数据应用程序,那么您应该知道所有“固定”的参数(输出大小、比特率、要写入的实际数据、位深度)。


1
这并不是答案中真正重要的部分,因为它只用于生成测试数据,但我想提一下 Math.random 不接受任何参数。 - Justin Taddei
@JustinTaddei,的确不行。我修复了这个“bug”。 - vanntile
1
我无法让node-wav正常工作。我找到了一个替代品:wav-encoder,它具有类似的语法。 - ATutorMe
尽管在撰写本文时已经有4年没有维护了,但“wav-encoder”仍然可以正常工作。考虑到过去十年中WAV格式规范并没有太大变化(请参见数字格式的可持续性:为国会图书馆收藏做计划:WAVE音频文件格式),这些模块可能仍然能够胜任工作(当然,除非核心节点或JS更改导致它们无法使用)。 - ATutorMe

-3

您可以使用内置的Node.js fs.writeFile() API来写入文件。

按照我的理解,您只需要循环遍历音频样本,将它们添加到迭代中的字符串中,并将该字符串放入文件中即可:

const fs = require("fs");

// Code to generate audio

let audio = "";

samples.forEach((sample) => {
  audio += sample;
});

fs.writeFile("path/to/file.wav or .mp3", audio, (err) => {
  if (err) return console.error(err);

  console.log("File successfully saved!");
});

如果我理解你的问题正确,那么这个应该可以工作。


1
不好意思,这并没有创建一个 wav 文件。 - WestCoastProjects
你可以在文件路径的末尾添加.wav或.mp3,任选其一即可。 - GoodStuffing123
1
真的吗?那么如果我创建一个文本文件并将扩展名更改为“.xls”,它现在就是一个Excel电子表格了吗? - WestCoastProjects
嗯...好的...我的回答假设你的数据已经是.wav或.mp3格式的。如果不是.wav或.mp3,它是什么格式?此外,我不知道如何将文本转换为Excel电子表格,但我知道你可以将.jpg转换为.png,然后再转回来没有任何问题。 - GoodStuffing123

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