问题描述
我是用js实现了简单的采集录音数据进行改造,把采样的数据的偶数位挤压在一起作为输出数据,这样就会导致时长减少了一半。
问题出现的环境背景及自己尝试过哪些方法
找了网上的文章都是说不同的场景有不同的补码算法,但没有说过一个,我根本不知道怎样才能补码成功啊。
我尝试了各种补码方式,可是我搞不懂为什么补上之后又会没有声音了,搞不懂outputData[sample] 与inputData[sample*2]到底是一个怎样的对应关系才能达到我想要的效果呢。
相关代码
var scriptNode = audioctx.createScriptProcessor(4096, 1, 1);
scriptNode.onaudioprocess = function(audioProcessingEvent) {
var inputBuffer = audioProcessingEvent.inputBuffer;
var outputBuffer = audioProcessingEvent.outputBuffer;
for (var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
// Loop through the 4096 samples
for (var sample = 0; sample < inputBuffer.length; sample++) {
if(sample%2==0){
outputData[sample] = inputData[sample*2];}
else{
outputData[sample] = inputData[(sample-1)*2];
}
}
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
希望大佬们能解释一下outputData到底该填什么样的数据才能达到效果呢,只要能听到小黄人声音保证同样的音频时长就行,感谢🙏
看了你的问题和评论之后,你的实际需求在音频处理被叫做声音基频的修改。
基频的修改在音频处理里是一个很基本的问题,但是没有太简单的方法。常用的比如 PSOLA ,但是需要先做基频的提取,实现起来并不那么简单。
另外插一句,我以前看过汤姆猫的变声结果,它其实没有改基频,而只是将声音通过了一个滤波器。这个实现起来就简单多了,前提是你得知道怎么设计滤波器。