当前位置:首页 > JavaScript

js实现变声

2026-02-01 18:07:12JavaScript

使用Web Audio API实现变声

Web Audio API提供了音频处理能力,可以通过调整音频参数实现变声效果。以下是一个基础实现示例:

// 获取用户麦克风输入
navigator.mediaDevices.getUserMedia({ audio: true })
  .then(function(stream) {
    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
    const source = audioContext.createMediaStreamSource(stream);

    // 创建变声效果节点
    const pitchShift = audioContext.createScriptProcessor(4096, 1, 1);
    pitchShift.onaudioprocess = function(e) {
      const input = e.inputBuffer.getChannelData(0);
      const output = e.outputBuffer.getChannelData(0);

      // 调整音高(示例:提高一个八度)
      for (let i = 0; i < input.length; i++) {
        output[i] = input[Math.floor(i/2)]; // 简单降采样
      }
    };

    source.connect(pitchShift);
    pitchShift.connect(audioContext.destination);
  })
  .catch(console.error);

使用PitchShift算法

更专业的变声需要实现PitchShift算法。以下是使用Tuna.js库的示例:

// 引入Tuna.js库后
const audioContext = new AudioContext();
const tuna = new Tuna(audioContext);

const pitchShifter = new tuna.PitchShift({
  pitch: 0.5,  // 0.5=降八度, 1=原音, 2=升八度
  windowSize: 1024,
  overlapRatio: 0.5
});

// 连接音频源
source.connect(pitchShifter);
pitchShifter.connect(audioContext.destination);

使用现成的音频处理库

soundtouchjs是一个专门处理音频变调的库:

import { SoundTouch, SimpleFilter } from 'soundtouchjs';

const audioContext = new AudioContext();
const processor = audioContext.createScriptProcessor(4096, 1, 1);
const soundTouch = new SoundTouch();
const filter = new SimpleFilter(source, soundTouch);

// 设置变调参数
soundTouch.pitch = 1.2; // 1.0为原音

processor.onaudioprocess = function(e) {
  filter.extract(e.outputBuffer, 4096);
};

source.connect(processor);
processor.connect(audioContext.destination);

调整音频参数实现不同效果

通过组合不同的音频节点可以创造多种变声效果:

// 机器人效果
const robotEffect = audioContext.createWaveShaper();
const distortionCurve = new Float32Array(44100);
for (let i = 0; i < 44100; i++) {
  distortionCurve[i] = Math.sin(i / 100);
}
robotEffect.curve = distortionCurve;

// 低沉效果
const lowPass = audioContext.createBiquadFilter();
lowPass.type = "lowpass";
lowPass.frequency.value = 400;

// 连接效果链
source.connect(robotEffect);
robotEffect.connect(lowPass);
lowPass.connect(audioContext.destination);

实时变声录音实现

以下代码演示如何录制变声后的音频:

js实现变声

let mediaRecorder;
const chunks = [];

// 创建变声处理链后
const dest = audioContext.createMediaStreamDestination();
pitchShifter.connect(dest);

mediaRecorder = new MediaRecorder(dest.stream);
mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
mediaRecorder.onstop = () => {
  const blob = new Blob(chunks, { type: 'audio/webm' });
  const url = URL.createObjectURL(blob);
  // 处理录制结果
};

// 开始录制
mediaRecorder.start();

以上方法可以根据需要组合使用,通过调整参数值可以获得不同的变声效果。实际应用中可能需要考虑性能优化和更复杂的音频处理算法。

标签: js
分享给朋友:

相关文章

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…