Javascript 使用Web Audio API为已录制的声音添加效果

Javascript 使用Web Audio API为已录制的声音添加效果,javascript,html,html5-audio,web-audio-api,getusermedia,Javascript,Html,Html5 Audio,Web Audio Api,Getusermedia,我的任务是给录制的文件添加一些效果 这是我正在使用的一个脚本 这是一个代码 我想增加一个音高 我试着查找其他代码,这些代码为音频添加了一些效果。 但recorder.js处理缓冲区的方式似乎有所不同 编辑 下面是我的代码现在的样子,使用这个函数,我请求已经录制的音频并播放 我可以模拟一些效果来接近这一点吗: 这是格鲁吉亚语,但我希望你能理解。它更像是氦沥青。(注意,我不想改变音速) 当我试图研究氦效应时,我发现: 它说声音应该比空气快2.5倍 能给我拿点接近这个的吗 编辑 从@cwilso

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

这是我正在使用的一个脚本

这是一个代码

我想增加一个音高

我试着查找其他代码,这些代码为音频添加了一些效果。 但recorder.js处理缓冲区的方式似乎有所不同


编辑

下面是我的代码现在的样子,使用这个函数,我请求已经录制的音频并播放

我可以模拟一些效果来接近这一点吗: 这是格鲁吉亚语,但我希望你能理解。它更像是氦沥青。(注意,我不想改变音速)

当我试图研究氦效应时,我发现: 它说声音应该比空气快2.5倍

能给我拿点接近这个的吗


编辑

从@cwilso的建议来看,这是迄今为止我见过的最接近的一次。但我无法修改它,无法使用我的
playbackRecorderAudio()
。 这就是为什么我要用我所有的一切开始悬赏


编辑

以下是我的代码:

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

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


现在的问题是,我不知道在哪里连接我的
playbackRecorderAudio
函数。使用它作为缓冲区中的转换器。

您可能应该考虑使用OfflineAudioContext而不是Recorder.JS-OAC的工作速度比实时快


也就是说,“氦音高”看起来很难做到,因为它会改变你声音的谐波。这听起来更像是声码,语音是调制器和载波,但会移动谐波带(或类似的东西)。你所指的YouTube视频听起来像是实际的音调变化,但带有类似于速率校正的颗粒合成。看看克里斯·罗杰斯的例子——将速度设置为1.0,音高设置为大于零(至少几百美分)。这就是你想要的效果吗?如果你愿意,你可以深入到Chris的例子来看看如何做到这一点,或者在我的输入效果()中使用一个活生生的效果版本,比如“音高倍增器”(实际上可以设置为更快或更慢,并且可以控制为八度以外的东西)。

你想要的颗粒效果代码是可用的。您只需要将源节点的输出连接到GranularEffects页面代码的第一个节点。尽管这段代码有点凌乱,但我会尽量在下面解释清楚

在代码中搜索后,音频结构看起来如下所示:

source -┬-> grainWindowNode -┬-> panner -┬-> dryGain -> compressor -┬-> destination
        └-> bypass          -┘           └-> wetGain -> convolver  -┘
我为你编写了代码,看到了吗

这有点难,因为您需要自己设置所有值以满足您的需要

所有代码都在JSFIDLE中,要使其正常工作,您必须做两件事:

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

  • 如果您想对代码进行任何解释,请随意询问(我不知道您目前对音频api的了解,是否需要解释所有内容?

    基音偏移是使用FFT(快速傅立叶变换)实现的,FFT(快速傅立叶变换)在Web音频api中实现。O'Reilly有一本书《Web音频api》这很好地涵盖了API。你可以看到关于音高和频域的章节。

    Hello@cwilso,很高兴你回答了。我看过你的示例,但从未有幸深入研究过。在我的chrome浏览器中,我有一个错误(可能是因为我的linux驱动程序中有WebGL)最大顶点纹理图像单位。我尝试禁用可视化,但挖掘越多,错误就越多。我的firefox(可以显示webGL,它只会重新启动整个浏览器(崩溃)。我喜欢granular,并将深入研究它。它并不完美,但我想已经足够接近了。关于OfflineAudoContext-我不是舒尔,因为我希望得到尽可能广泛的支持。Recorder.js应该可以在5分钟内播放音频。您好@MarijnS95,很抱歉回答太晚。我已经阅读了您的JSFIDLE大约100次了。这几天我正在尝试o阅读一些文档,但确实很难)我更新了我的问题,你能再帮我一点吗?P.S.我知道这将如何工作,我只是不知道连接到哪里。是的,代码做了很多。我不知道效果是如何产生的,但我知道输入和输出点在哪里。代码在顶部。顶部有一条注释解释了重新连接(我刚刚添加了一个输入和输出节点以方便连接。小提琴在某处丢失了,因此。这是effectsInput,输出effectsOutput。最上面的注释已经消失了…要通过这个效果生成器循环声音,最好将它放在
    音频输入
    输入点
    之间,方法是更改以下行:
     audioInput.connect(inputPoint);
    audioInput.connect(effectsInput);effectsOutput.connect(inputPoint);
    我无法应用此功能,但我放弃了。这并不重要。无论如何,我接受您的答案,因为这提供了使用webAudio API的小技巧所需的一切
    source -┬-> grainWindowNode -┬-> panner -┬-> dryGain -> compressor -┬-> destination
            └-> bypass          -┘           └-> wetGain -> convolver  -┘