Javascript 更改音频播放器功能成为具有音高转换效果的实时网络音频输入

Javascript 更改音频播放器功能成为具有音高转换效果的实时网络音频输入,javascript,web-audio-api,pitch,pitch-shifting,Javascript,Web Audio Api,Pitch,Pitch Shifting,我发现了一个函数形式的代码片段,用于更改正在播放的音频的音调。 我想将其更改为使用麦克风网络音频时改变音高的功能 我试过了,但还是不行。我需要帮助 这是代码: 函数playSoundpitch(文件,速度=2,pitchShift=1,循环=false,自动播放=true){ if(俯仰移位){ audioCtx=new(window.AudioContext | | window.webkitadiocontext)(); source=audioCtx.createBufferSource

我发现了一个函数形式的代码片段,用于更改正在播放的音频的音调。 我想将其更改为使用麦克风网络音频时改变音高的功能

我试过了,但还是不行。我需要帮助

这是代码:

函数playSoundpitch(文件,速度=2,pitchShift=1,循环=false,自动播放=true){
if(俯仰移位){
audioCtx=new(window.AudioContext | | window.webkitadiocontext)();
source=audioCtx.createBufferSource();
var gainNodex=audioCtx.createGain();
gainNodex.gain.value=2;//将音量加倍
请求=新的XMLHttpRequest();
打开('GET',file,true);
request.responseType='arraybuffer';
request.onload=函数(){
var audioData=请求。响应;
audioCtx.decodeAudioData(音频数据,功能(缓冲区){
myBuffer=缓冲区;
songLength=buffer.duration;
source.buffer=myBuffer;
source.playbackRate.value=速度;
source.loop=循环;
//source.connect(audioCtx.destination);
source.connect(gainNodex);
gainNodex.connect(audioCtx.destination);
source.onended=函数(){};
},
职能(e){
“音频数据解码错误”+e.错误
});
}
request.send();
source.play=source.start
}否则{
source=新音频(文件)
source.playbackRate=速度
source.loop=循环
}
如果(自动播放){
来源:play()
}
返回源
}
var源;

source=播放音高('https://sampleswap.org/samples-ghost/VOCALS%20and%20SPOKEN%20WORD/Native%20American/1392[kb]sheshone-native-vox2.wav.mp3',音高=0.8)请查看此页面:

与您的问题相关的部分位于底部:

值得注意的是,首先构建“振荡器”对象,然后在代码中,可以使用上述代码在流中调整节点的间距。您已经创建了节点(您所称的
audioCtx
对象)。该对象具有必须动态更改的频率值。上述情况适用于静态变桨。您必须获取频率,然后根据所需音调的差分对其进行更改,然后使用
setValueAtTime
更新该值

或者,您可以安装此软件包,并使用它使变桨工作更轻松:


最后,这里还有一个使用AudioContext对象的解决方案(使用
detune
方法):

有使用该方法的示例吗?我找不到。。但是他们在这里有示例代码:我真的不知道如何用演示JSFIDLE/codepenThey来实现它。他们并没有真正改变基调,也不是直接改变基调。他们所做的改变是播放速度,因为读得更快确实会增加音高。但对于生活来说,你不能读得更快(这意味着你知道未来)。不幸的是,通过改变播放速率来改变音高并不是一门容易的科学。
/* The frequency (in Hz) of Bb4 is 466.16 */
oscillator
  .frequency
  .setValueAtTime(466.16, audioContext.currentTime);