在不改变音高的情况下使用Web Audio API更改音频速度

Jar*_*lla 14 javascript audio playback web-audio-api

是否可以使用Web Audio API更改音频的速度(以加载的MP3文件的形式)而不改变音高?

我知道AudioBufferSourceNode上的playbackRate属性,但这也改变了音高.我也知道了playback<audio><video>元素的playbackRate属性,但我需要使用Web Audio API.

我是Web Audio API的新手.有什么我能做的吗?

Rac*_*len 9

有一种方法可以做到这一点 - 它称为粒度合成(链接指向pd理论链接,但理论是通用的).粒度合成的想法是以原始速度对声音进行采样,但是以与每个采样点不同的速度进行播放,但是具有不改变音高的优点.

这些Github Web Audio Granular Synthesizer链接可以帮助你(第一个更好)[ http://www.github.com/urtzurd/html-audio/ "Web-Audio-Granular-synthesis"] [ http:// zya .github.io/granular / "Github上的另一个链接"] 2

如果没有使用WebAudio取得任何成功,还有另一种选择; 将mp3带入Audacity并以此方式更改速度,然后使用新文件!;)

相信我,我理解你的痛苦,我花了好几周试图用pd扩展做同样的事情.走近我的头发.我的教授向我介绍了粒度合成的概念!

祝好运!

  • 谢谢谢谢。你太客气了。首先,我要感谢我的父母激励我做到最好,感谢我的开发人员同事不断突破技术极限,最后感谢 Chromium 团队(提前)将这一精彩功能添加到 Web Audio API 中。你是真正的 MVP。 (3认同)
  • @哈哈哈你的奥斯卡在等着!!;) (2认同)

Air*_*777 6

当前版本的 WebAudio 本身并不(容易)支持这一点,但可以使用Tone.js

let semitones = 3;
let source = new Tone.Player(AudioBuffer);
let shift = new Tone.PitchShift(semitones);
source.connect(shift);
shift.toMaster();
source.start();
Run Code Online (Sandbox Code Playgroud)

  • @FabienSnauwaert 尝试 `shiftToSemitones = shift =&gt; -12*Math.log2(1/shift)` 和 `semitonesToShift = semitones =&gt; (2 ** (1/12)) ** semitones` (4认同)