下采样 48khz 到 16khz - Javascript
Downsampling 48khz to 16khz - Javascript
目前 getUserMedia
正在获取 48Khz 的音频(来自麦克风)。但是我的语音识别服务器只能使用 16Khz 的音频(可能是 48Khz,但它会进行下采样)。我的 objective 是为了在客户端进行下采样来节省带宽。
recorder.onaudioprocess = function(e){
if(!recording) return;
console.log ('recording');
left = e.inputBuffer.getChannelData(0);
Stream.write(convertoFloat32ToInt16(left));//write to server
}
function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l)
while (l--) {
if(l%3==0){
buf[l/3] = buffer[l]*0xFFFF;
}
}
return buf.buffer
}
您还有其他实现吗?
编辑:
我把录制相同音频的nodejs服务器放到一个文件中,然后用matlab打开它。这些文件具有相同的大小。而且不应该,对吧?
Matlab 图 - 16k
Matlab 图 - 48k
在我看来,数据正在写入立体声文件,对吧?这可以解释起伏不定的波形,因为您只有左通道的数据,而右通道充满了零。
另外,您创建的 Int16Array() 是原始缓冲区的长度,但它实际上应该只是长度的三分之一,因为您只使用每三个样本。这可能可以解释为什么渲染后它们的大小相同。
我不确定如何解释 matlab 图,但这就是我的样子。
解决方案(感谢@OskarEriksson,这是你的提示,现在我没有问题了):
recorder.onaudioprocess = function(e){
if(!recording) return;
console.log ('recording');
left = e.inputBuffer.getChannelData(0);
Stream.write(convertoFloat32ToInt16(left));//write to server
}
function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l/3); //<-----Only change here
while (l--) {
if(l%3==0){
buf[l/3] = buffer[l]*0xFFFF;
}
}
return buf.buffer
}
Matlab 绘图:
48k
16k
注意:我拼的字是完全一样的,但是你可以看到因为浏览器切换有一些延迟,然后按Start\Stop按钮。
目前 getUserMedia
正在获取 48Khz 的音频(来自麦克风)。但是我的语音识别服务器只能使用 16Khz 的音频(可能是 48Khz,但它会进行下采样)。我的 objective 是为了在客户端进行下采样来节省带宽。
recorder.onaudioprocess = function(e){
if(!recording) return;
console.log ('recording');
left = e.inputBuffer.getChannelData(0);
Stream.write(convertoFloat32ToInt16(left));//write to server
}
function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l)
while (l--) {
if(l%3==0){
buf[l/3] = buffer[l]*0xFFFF;
}
}
return buf.buffer
}
您还有其他实现吗? 编辑: 我把录制相同音频的nodejs服务器放到一个文件中,然后用matlab打开它。这些文件具有相同的大小。而且不应该,对吧?
Matlab 图 - 16k
Matlab 图 - 48k
在我看来,数据正在写入立体声文件,对吧?这可以解释起伏不定的波形,因为您只有左通道的数据,而右通道充满了零。
另外,您创建的 Int16Array() 是原始缓冲区的长度,但它实际上应该只是长度的三分之一,因为您只使用每三个样本。这可能可以解释为什么渲染后它们的大小相同。
我不确定如何解释 matlab 图,但这就是我的样子。
解决方案(感谢@OskarEriksson,这是你的提示,现在我没有问题了):
recorder.onaudioprocess = function(e){
if(!recording) return;
console.log ('recording');
left = e.inputBuffer.getChannelData(0);
Stream.write(convertoFloat32ToInt16(left));//write to server
}
function convertoFloat32ToInt16(buffer) {
var l = buffer.length;
var buf = new Int16Array(l/3); //<-----Only change here
while (l--) {
if(l%3==0){
buf[l/3] = buffer[l]*0xFFFF;
}
}
return buf.buffer
}
Matlab 绘图:
48k
16k
注意:我拼的字是完全一样的,但是你可以看到因为浏览器切换有一些延迟,然后按Start\Stop按钮。