js实现变声
实现变声的基本原理
变声通常通过改变音频信号的音高(Pitch)、时间拉伸(Time Stretching)或共振峰(Formant)来实现。Web Audio API提供了处理音频的底层接口,适合用于实时变声效果。
使用Web Audio API实现变声
以下是一个简单的变声实现示例,通过改变播放速率和音高来调整声音:
// 获取用户麦克风输入
navigator.mediaDevices.getUserMedia({ audio: true })
.then(stream => {
const audioContext = new AudioContext();
const source = audioContext.createMediaStreamSource(stream);
// 创建音高变换节点
const pitchShifter = audioContext.createScriptProcessor(4096, 1, 1);
// 设置变声参数
let pitchRatio = 1.5; // 大于1提高音调,小于1降低音调
pitchShifter.onaudioprocess = function(e) {
const input = e.inputBuffer.getChannelData(0);
const output = e.outputBuffer.getChannelData(0);
for (let i = 0; i < output.length; i++) {
const index = Math.floor(i * pitchRatio);
if (index < input.length) {
output[i] = input[index];
} else {
output[i] = 0;
}
}
};
// 连接节点
source.connect(pitchShifter);
pitchShifter.connect(audioContext.destination);
})
.catch(err => console.error('麦克风访问错误:', err));
使用现成的音频处理库
对于更复杂的变声效果,可以使用专门的音频处理库:
// 使用Tone.js库实现变声
import * as Tone from 'tone';
const player = new Tone.Player().toDestination();
const pitchShift = new Tone.PitchShift({
pitch: 12, // 升高一个八度
windowSize: 0.1,
feedback: 0.5
}).toDestination();
// 获取麦克风输入并应用效果
Tone.UserMedia.open()
.then(stream => {
const mic = new Tone.UserMedia();
mic.connect(pitchShift);
mic.open();
});
变声效果参数调整
常见变声参数调整方向:
- 提高音调:增加pitchRatio值(1.2-2.0)
- 降低音调:减小pitchRatio值(0.5-0.9)
- 机器人效果:添加延迟和混响
- 恶魔效果:降低音调并添加失真
注意事项
实时音频处理对性能要求较高,过大的buffer size可能导致延迟,过小可能导致音频断裂。建议在移动设备上使用较小的buffer size(如1024),在桌面设备上可使用较大的buffer size(如4096)。

浏览器兼容性方面,Web Audio API在现代浏览器中支持良好,但在iOS上需要注意自动播放限制。






