如何从麦克风改变现场音频的播放速度(使用缓冲区)?

问题描述 投票:0回答:1

我听说通过改变播放速度我们可以修改音频的频率。我在这里测试过:https://teropa.info/blog/2016/08/10/frequency-and-pitch.html

但问题是我需要一个录制的音频文件来做到这一点。从我发现的网络音频无法改变现场音频的播放速度。我一直在想,如果我们将音频保存在缓冲区中,我们可以改变其播放速度,从而改变频率。

我是web-audio API的新手。我找到了一篇文章,通过将实时音频保存到缓冲区来录制。 https://docs.sumerian.amazonaws.com/articles/webaudio-1/

我想要的是: -

  1. 从麦克风获取音频。
  2. 将其保存到缓冲区中。
  3. 改变播放速度。
  4. 在扬声器上播放。

演示解释如何更改缓冲区节点https://mdn.github.io/webaudio-examples/decode-audio-data/的播放速度

但是我希望使用现场麦克风音频来代替录制的声音。

这是我尝试小提琴

https://jsfiddle.net/5dza62b8/13/

var audioContext = new(window.AudioContext || window.webkitAudioContext)();
var streamSource, scriptNode, bufferSource, audioBuffer;
var playbackControl = document.querySelector('#playback-rate-control');
var playbackValue = document.querySelector('#playback-rate-value');

// define variables

window.start_audio = function() {
  navigator.mediaDevices.getUserMedia({
    audio: true
  }).then((stream) => {

    alert("Got audio stream from microphone!");
    audioContext = new AudioContext();
    // Create an AudioNode from the stream.
    streamSource = audioContext.createMediaStreamSource(stream);
    scriptNode = audioContext.createScriptProcessor(2048, 1, 1);
    bufferSource = audioContext.createBufferSource();


    // Whenever onaudioprocess event is dispatched it creates a buffer array with the length bufferLength
    scriptNode.onaudioprocess = (audioProcessingEvent) => {
      realtimeBuffer = audioProcessingEvent.inputBuffer.getChannelData(0);
      // Create an array of buffer array
      audioBuffer.push(realtimeBuffer);
    }

    bufferSource.buffer = audioBuffer;
    bufferSource.playbackRate.value = 0.8;

    streamSource.connect(scriptNode);
    bufferSource.connect(audioContext.destination);
    bufferSource.start();

  }).catch((e) => {

    alert(e.name + ". " + e.message);

  });
}


// wire up buttons to stop and play audio, and range slider control
playbackControl.addEventListener('input', function() {
  bufferSource.playbackRate.value = playbackControl.value;
  playbackValue.innerHTML = playbackControl.value;
});

javascript html5 web-audio web-audio-api
1个回答
1
投票

这可能是一个比你想象的更难的问题 - 如果播放速度大于1,你将尝试播放尚未发生的声音!

通常,您可以使用Web音频API为实时麦克风输入添加效果 - 这是MDN文档中的一个示例,它为输入添加了一个过滤器:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createMediaStreamSource

如果你想减慢现场音频的速度,可能会有一些警告。允许您更改播放速率的Web Audio节点是BufferSourceNode,它依赖于您先前已加载缓冲区。但是,您可以通过使用自定义AudioWorklet逐步将数据放入缓冲区并使用BufferSourceNode进行回放来解决此问题。要考虑的一件事是你要花多长时间 - 随着时间的推移,缓冲区会随着时间的推移变得越来越大,迟早你的计算机会耗尽内存!

这是非常复杂的,可能不是第一次涉足Web Audio的理想选择,但是学习音频工作的最佳起点是:https://developers.google.com/web/updates/2017/12/audio-worklet

使用音频工作片,您还可以研究一些更复杂的算法,这些算法可以让您在不改变声音长度的情况下改变声音的音高。 https://en.wikipedia.org/wiki/Audio_time_stretching_and_pitch_scaling

如果您刚刚开始使用网络音频,我的建议是您可以编写一些内容,让您录制声音,然后更改其播放速率。

© www.soinside.com 2019 - 2024. All rights reserved.