如何降低nodejs服务器端音频文件的音高?

Posted

技术标签:

【中文标题】如何降低nodejs服务器端音频文件的音高?【英文标题】:How to decrease pitch of audio file in nodejs server side? 【发布时间】:2017-01-24 23:52:31 【问题描述】:

我的服务器上存储了一个 .MP3 文件,我想将其修改为音调低一点。我知道这可以通过增加音频的长度来实现,但是,我不知道 node 中有任何库可以做到这一点。

我尝试过使用node web audio api和soundbank-pitch-shift,但前者似乎没有变音(AFAIK)的功能,而后者似乎是为客户端设计的

我只需要节点范围内的解决方案——这意味着没有外部程序等,而且它也需要自动化,所以我不能手动调整音调。

理想的解决方案是一个函数,它将文件/文件路径作为输入,然后创建(或覆盖)另一个 MP3 文件,但音高移动了 x 数量,但实际上,任何产生以下内容的解决方案比原来的音调低,有效。

我完全迷路了。请帮忙。

【问题讨论】:

this one 呢? @moonwave99 我认为这是另一个基于网络的,考虑到它使用 WebAudio :( 在无头浏览器中运行它然后^^ 您有 PCM 格式的音频吗?哪个是原始音频曲线?这是此类工具更改音频的规范格式 【参考方案1】:

音频文件基本上是一个数字列表。这些数字以称为“采样率”的特定速度一次读取一个。采样率被定义为每秒读取的音频样本数,例如如果音频文件的采样率为 44100,则每秒读取 44100 个样本(或数字)。

到目前为止,如果您和我在一起,降低音频文件音高的最简单方法是以较低的采样率(通常固定到位)播放文件。在大多数情况下,您将无法做到这一点,因此您需要通过重新采样文件来达到相同的效果,即将新样本添加到旧样本之间的文件中以使其字面上更长。为此,您需要了解插值。

在任何一种情况下,这种技术的缺点是声音也会以较慢的速度和较低的音高播放。如果您的处理导致声音变慢以及音调降低是一个问题,那么您还必须使用时间拉伸算法来修复播放速度。

您在使用 MP3 文件时也可能遇到问题。在这种情况下,您可能必须先解压缩 MP3 文件中的数据,然后才能以改变文件音高的方式对其进行操作。 WAV 文件在音频处理中更为理想。无论如何,您基本上需要将文件转换为浮点数列表,并将这些数字更改为以较慢的速度有效地读回。

其他音高转换方法可能需要使用 fft,至少可以说是一件更复杂的事情。

恐怕我不熟悉nodejs。

【讨论】:

【参考方案2】:

在Ollie M's answer 和node-lame 的帮助下,我设法让它工作了。

我之前不知道采样率会影响速度,但是感谢 Ollie,这个问题突然变得简单了很多。

使用 node-lame,我所做的只是取其中一个示例(mp32wav.js),并使其更改format 对象的参数sampleRate,使其低于基数采样率,在我的应用程序中始终是静态的 24,000。我也可以让它动态化,因为 node-lame 可以在 format 对象中获取输入文件的参数。

Ollie,但是完美地描述了这种方法的缺点

在这两种情况下,这种技术的缺点是声音会 也可以以较慢的速度和较低的音高播放。如果它 是声音变慢和降低的问题 由于您的处理,音高,那么您还必须使用 时间拉伸算法来固定播放速度。

目前我没有特别需要实现时间拉伸算法(谢天谢地,因为那是完全不同的蠕虫),因为我有能力改变文件的初始速度,但其他人可能未来。

【讨论】:

【参考方案3】:

请参阅音频缓冲区自述文件底部的https://www.npmjs.com/package/audio-decode、https://github.com/audiojs/audio-buffer 和相关链接。

【讨论】:

以上是关于如何降低nodejs服务器端音频文件的音高?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 增加或减少音频文件的音高

更改“发声器”的音频音高

如何使用 AVFoundation 以正确的音高播放不同采样率的音频文件?

使用以下 java 中的代码修改文件中特定位置的音频文件的音高

音频处理Melodyne 音高调整 ( 打开音频文件 | 选择音高编辑工具 | 样本音高信息 | 音高自动调整 )

如何更改录制音频的音高并在后台保存?