2015-10-05 203 views
2

目前getUserMedia正在从48Khz获得音频(从麦克风)。但是我的语音识别服务器只能使用16Khz的音频(可能是48Khz,但它会进行下采样)。我的目标是节省带宽,在客户端进行下采样。降采样48khz到16khz - Javascript

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

enter image description here

Matlab的阴谋 - 48K

48khz

+3

既然你没有真正的问题,但你正在寻求确认,我会说你的帖子属于codereview,而不是stackoverflow。投票结束在这里。 (http://codereview.stackexchange.com/) – GameAlchemist

回答

2

它看起来对我来说,被写入到立体声文件中的数据,对不对?这可以解释起伏波形,因为您只有左侧通道的数据,右侧通道填充了零。

此外,您创建Int16Array()为原始缓冲区的长度,但它应该只是长度的三分之一,因为您只使用每个第三个样本。这可能可以解释为什么他们已经提交了相同的大小。

我不知道如何解释matlab的情节,但这就是它对我来说。

+1

而且你不能只取第三个样本。你需要做一些过滤,否则最终的音频听起来很奇怪。除非您已经知道输入频带限制为16 kHz。您可以使用WebAudio为您进行过滤。 –

+0

是的,我知道那个@RaymondToy ......我想要这样做,一个“粗暴”的下采样。因为在matlab中完成并使用它的语音识别器,它会正常工作。 – jdscardoso

+0

@OskarEriksson感谢您的提示......我错过了这个尺寸问题 – jdscardoso

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 
} 

Matlab的情节: 48K enter image description here

16K

enter image description here

注意:我拼写的单词完全相同,但您可以看到由于浏览器切换造成一些延迟,并按下开始\停止按钮。