+
95
-

回答

通过web audio api就行实现

完整代码:

点击查看全文

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum=1.0,minimum=1.0,user-scalable=0" />
    <title>BFW NEW PAGE</title>
    <script id="bfwone" data="dep=jquery.17&err=0" type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/bfwone.js"></script>
    <script type="text/javascript">
    navigator.mediaDevices.getUserMedia({ audio: true })
  .then(function(stream) {
    let audioContext = new AudioContext();
    let microphoneStream = audioContext.createMediaStreamSource(stream);

    // 创建变声效果的处理节点
    let processor = audioContext.createScriptProcessor(4096, 1, 1);
    let pitchShift = 1.7; // 设置音调变化倍率

    processor.onaudioprocess = function(event) {
      let inputBuffer = event.inputBuffer;
      let outputBuffer = event.outputBuffer;

      for (let channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
        let inputData = inputBuffer.getChannelData(channel);
        let outputData = outputBuffer.getChannelData(channel);

        // 实现音调变换
        for (let sample = 0; sample < inputBuffer.length; sample++) {
          let shiftedSample = sample * pitchShift;

          // 简单的线性插值
          let indexBefore = Math.floor(shiftedSample);
          let indexAfter = Math.ceil(shiftedSample);
          let fraction = shiftedSample - indexBefore;

          if (indexBefore >= 0 && indexAfter < inputBuffer.length) {
            outputData[sample] = (1 - fraction) * inputData[indexBefore] + fraction * inputData[indexAfter];
          } else {
            outputData[sample] = 0; // 超出范围时静音处理
          }
        }
      }
    };

    // 连接音频处理节点
    microphoneStream.connect(processor);
    processor.connect(audioContext.destination);
  })
  .catch(function(err) {
    console.error('获取麦克风权限失败:', err);
  });

    </script>
     <style>
      </style>
</head>
<body>
    <div >
        js在浏览器中实时捕获麦克风声音并变声输出
    </div>
</body>
</html>
		

网友回复

我知道答案,我要回答