写入服务器时来自麦克风的半速 AudioContext

Half speed AudioContext from microphone when written to server

我正在尝试在客户端 javascript 上编写麦克风录音,将其传输到服务器,然后将其转换为 silk。我使用扬声器模块使用这些设置在服务器上播放音频

var speaker = new Speaker({
  channels: 1,   
  bitDepth: 16,         
  sampleRate: 44000,     
  signed: true
});

但是当它转换为丝绸时,听起来速度只有一半。我相信它使用我没有写的 C class 转换为丝绸会导致速度变慢,因为它作为 pcm 文件听起来不错。 C 文件具有这些设置

#define FRAME_LENGTH_MS 20
#define SAMPLE_RATE_KHZ 16
#define SILK_BITRATE    14000
#define FRAME_SAMPLES   (FRAME_LENGTH_MS * SAMPLE_RATE_KHZ)

我正在使用 BinaryJS 将代码作为 Int16 数组写入服务器。

我会在这里复制代码,但我几乎是从本教程中逐字复制的。

http://blog.groupbuddies.com/posts/39-tutorial-html-audio-capture-streaming-to-node-js-no-browser-extensions

也很想知道我从 audioContext 中得到的比特率、采样率以及如果我必须使用 silk 编解码器如何降低采样率。

编辑:

我确实(有点)通过修改 onaudioprocess 解决了一半的速度,我通过删除一半的样本将 float32 转换为 Int16。

l = buffer.length;
        point = Math.floor(l/2);
        buf = new Int16Array(Math.floor(l/2));
        for (var x = l; x > 0;) {
            var average = (buffer[x] + buffer[x-1]) / 2;
            buf[point] = Math.min(1, average)*0xFFFF;
            point -= 1;
            x -= 2;
        }

        return buf.buffer;

但是,音频音调仍然是一半。

我已经回答了一些其他问题,这些问题可以回答这个问题的其余部分,但是对于任何想知道 AudioContext 对象 return 我最终使用的采样率信息的人来说下采样算法动态调整到任何浏览器的采样率。

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

        var session = {
            audio: true
        };

        navigator.getUserMedia(session, function(stream){
            audioContext = window.AudioContext;
            context = new audioContext();
            sampleRate = context.sampleRate;
            // Pass sample rate to downsample function with my arraybuffer
        },function(e){
           // error
        });