繁体   English   中英

如何更改麦克风实时音频的播放速度(使用缓冲区)?

[英]How to change playback speed of live audio from microphone (using a buffer)?

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

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

我是网络音频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;
});

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

不过,总的来说,您可以使用网络音频API向现场麦克风输入添加效果-这是MDN文档中的示例,该示例向输入添加了过滤器: https : //developer.mozilla.org/en-US/docs/网络/ API / AudioContext / createMediaStreamSource

如果您想降低实时音频的速度, 可能需要注意一些警告。 允许您更改播放速率的Web音频节点是BufferSourceNode,它依赖于您先前加载的缓冲区。 但是,您可能可以通过使用自定义AudioWorklet将数据递增地放入缓冲区并使用BufferSourceNode进行播放来解决此问题。 要考虑的一件事是,您允许它持续多长时间–随着时间的流逝,缓冲区将变得越来越大,并且您的计算机迟早会耗尽内存!

这涉及很多,可能不适合首次尝试使用Web Audio,但是要了解音频工作集的最佳出发点是在这里: https : //developers.google.com/web/updates/2017/12 /音频worklet

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM