目前getUserMedia
正在获得48Khz的音频(来自麦克风)。但我的语音识别服务器只能使用16Khz的音频(可能是48Khz但它会进行下采样)。我的目标是节省带宽,在客户端进行下采样。
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
答案 0 :(得分:2)
我认为数据正在写入立体声文件,对吗?这可以解释波形波形,因为您只有左声道的数据而右声道充满了零。
此外,您将Int16Array()创建为原始缓冲区的长度,但它实际上应该只是长度的三分之一,因为您只使用每三个样本。这可能解释了为什么一旦你渲染它们就会变成相同的尺寸。
我不确定如何解释matlab图,但这就是我的样子。
答案 1 :(得分:1)
解决方案(感谢@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
}
16K
注意:我拼写的单词完全相同,但由于浏览器切换,您可以看到一些延迟,然后按开始\停止按钮。