4

我的任务是为录制的文件添加一些效果。

这是我正在使用 Recorder.JS的脚本

这是一个代码https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js

我想添加音高。

我尝试查看为音频添加一些效果的其他代码。但似乎 recorder.js 处理缓冲区的方式不同。


编辑

function playbackRecorderAudio() {
    audioRecorder.getBuffer(function(buffers) {
        var source = audioContext.createBufferSource();
        source.buffer = audioContext.createBuffer(1, buffers[0].length, 44100);
        source.buffer.getChannelData(0).set(buffers[0]);
        source.buffer.getChannelData(0).set(buffers[1]);
        source.connect(audioContext.destination);
        source.noteOn(0);
    });
}

这是我的代码现在的样子,使用这个功能,我请求已经录制的音频并播放它。

我可以模拟一些效果来接近这个:http ://www.youtube.com/watch?v=Lr80slqJ3zo 这是格鲁吉亚语,但我希望你明白。它更像是氦沥青。(注意,我不想改变音频速度)。

当我试图研究氦效应时,我发现了这个:http : //chemistry.about.com/b/2013/08/26/helium-voice-is-not-higher-in-pitch.htm 它说声音应该是比空气快 2.5。

我能得到接近这个的东西吗?


编辑

根据@cwilso 的建议,http ://chromium.googlecode.com/svn/trunk/samples/audio/granular.html 是我迄今为止看到的最接近的。但我无法修改它,无法使用我的playbackRecorderAudio(). 这就是为什么我要用我所拥有的一切开始赏金


编辑

这是我的代码的 jsFiddle:http: //jsfiddle.net/Lsvnp/1/

首先让我描述一下我想要实现的目标:我想从用户麦克风录制声音,添加这个效果。当用户按下“停止录制”按钮(stopRecording功能)时,它将预先添加 HTML 音频,这将允许用户收听他录制的内容。如果他喜欢它,他会上传到我的服务器(uploadAudio函数)

加载页面时,记录未初始化。要初始化录制,用户必须按下某个按钮,该按钮将触发recordAudio功能。

现在的问题是我不知道在哪里连接我的playbackRecorderAudio功能。将其用作缓冲区的转换器。

4

3 回答 3

1

您可能应该考虑使用 OfflineAudioContext 而不是 Recorder.JS - OAC 可以比实时更快地工作。

也就是说——“氦音调”看起来很难做到,因为它会改变你声音的谐波。这听起来更像是语音编码,语音是调制器和载波,但会改变谐波带(或类似的东西)。您指向的 YouTube 视频听起来实际上是音高偏移,但带有速率校正 - 就像颗粒合成一样。查看 Chris Rogers 的示例http://chromium.googlecode.com/svn/trunk/samples/audio/granular.html - 将速度设置为 1.0,并将音高设置为大于零(至少几百美分) . 这是你要找的效果吗?如果您愿意,您可以深入研究 Chris 的示例以了解如何做到这一点,或者在我的输入效果中使用像“pitch doubler”这样的现场效果版本(http://webaudiodemos.appspot.com/input/)(实际上可以设置为更快或更慢,并控制为八度以外的其他内容)。

于 2014-01-06T18:32:48.293 回答
1

您想要的颗粒效果的代码是可用的。您唯一需要做的就是将源节点的输出连接到精细效果页面代码的第一个节点。这段代码还是有点乱,但我会尽量在下面解释它。

在代码中搜索后,音频结构看起来像这样:

source -┬-> grainWindowNode -┬-> panner -┬-> dryGain -> compressor -┬-> destination
        └-> bypass          -┘           └-> wetGain -> convolver  -┘

我编写了代码,所以它对你有用,看看这个jsfiddle

这有点难做,因为您需要自己设置所有值以适应您想要的。

所有代码都在 jsfiddle 中,您必须做两件事才能使其工作:

  1. 阅读顶部的评论(下载该文件并将其放在与您托管它的服务器相同的服务器上,否则CORS请确保您无法获取资源。(或者您必须在服务器上指定标头)
  2. 将此代码放在代码中的某个位置,以便该函数playbackRecorderAudio()执行一些有用的操作。如果您向我提供所有代码,我可以帮助您,以确保它有效。

如果您想对代码进行任何解释,请随时询问(我不知道您目前对音频 api 的了解,并解释一切?)

于 2014-01-08T19:42:04.153 回答
1

使用在 Web Audio API 中实现的 FFT(快速傅里叶变换)实现音高转换。O'Reilly 有一本书“Web Audio API”很好地涵盖了 API。您可以在此处查看有关音高和频域的章节。

于 2014-01-10T07:57:30.857 回答