Полускоростной 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.
Я скопировал бы код здесь, но я почти скопировал его дословно из этого урока.
Также хотелось бы знать, что именно я получаю из 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
});