I am working on Web Audio API. I tried recording an audio file using Web Audio API saved the recorded chunk and later plotted the spectrum of same chunk using python matplotlib.
The playing audio file contain increasing frequency from 2KHz to 20KHz.
The audio recording from chrome seems to be proper and i am able to see it properly with audio spectrum.
but when recording audio from safari there seems to be a cut off filter after 12 Khz.
Web Audio Code function start_rec() is called on a button click
var samplerate = 48000;
var audio_engine_var = {};
var samples = {
audio_samples: [],
samplerate: samplerate
}
function start_rec() {
audio_engine_var.context = new AudioContext({sampleRate:samplerate});
navigator.mediaDevices.getUserMedia(
{ audio: {
echoCancellation: false,
sampleRate: 48000
} }
).then( function (stream) {
audio_engine_var.stream = stream;
audio_engine_var.track = audio_engine_var.stream.getAudioTracks()[0];
audio_engine_var.track.applyConstraints(
{
echoCancellation: false,
sampleRate: 48000
}
);
audio_engine_var.scriptProcessor = audio_engine_var.context.createScriptProcessor(1024, 1, 1);
audio_engine_var.scriptProcessor.onaudioprocess = function(e) {
let aquired_samples = e.inputBuffer.getChannelData(0);
aquired_samples.forEach(element => {
samples.audio_samples.push(element);
});
}
audio_engine_var.input = audio_engine_var.context.createMediaStreamSource(audio_engine_var.stream);
audio_engine_var.scriptProcessor.connect(audio_engine_var.context.destination)
audio_engine_var.input.connect(audio_engine_var.scriptProcessor);
setTimeout(function() {
download_samples();
}, 15 * 1000) // stop recording and download audio samples.
});
}
function download_samples(){
// stop audio engine
audio_engine_var.context.close();
audio_engine_var.scriptProcessor.disconnect() ;
// download_audio
var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(samples));
var downloadAnchorNode = document.createElement('a');
downloadAnchorNode.setAttribute("href", dataStr);
downloadAnchorNode.setAttribute("download", "audio.json");
document.body.appendChild(downloadAnchorNode); // required for firefox
downloadAnchorNode.click();
downloadAnchorNode.remove();
setTimeout(function() {
window.location.reload();
}, 200 ) // stop recording and download audio samples.
}