Полускоростной AudioContext с микрофона при записи на сервер

Я пытаюсь написать запись микрофона на клиентском javascript, перенести ее на сервер и затем преобразовать в шелк. У меня воспроизводится звук на сервере с использованием модуля Speaker с этими настройками

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

но когда он превращается в шелк, он звучит на половину скорости. Я полагаю, что преобразование в шелк с использованием класса C, который я не написал, вызывает замедление, поскольку звучит нормально как файл 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 для записи кода на сервер как Int16array.

Я скопировал бы код здесь, но я почти скопировал его дословно из этого урока.

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

Также хотелось бы знать, что именно я получаю из audioContext с точки зрения битрейта, частоты дискретизации и как уменьшить частоту дискретизации, если мне нужно для шелкового кодека.

РЕДАКТИРОВАТЬ:

Я (вроде) решил половину скорости, изменив 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;

Тем не менее, высота звука по-прежнему наполовину.

1 ответ

Решение

У меня есть еще несколько вопросов, на которые я ответил, что это решило бы остальную часть этой проблемы, но для любого, кто интересуется, объект AudioContext действительно возвращает информацию о частоте дискретизации, которую я в конечном итоге использовал с алгоритмом понижающей дискретизации, чтобы динамически приспособиться к любой выборке браузера темп.

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
        });
Другие вопросы по тегам