I’m building an audio frequency detector using Web Audio API that needs to identify high frequency sounds above 18kHz. The application works great on Chrome, Firefox and Edge but Safari has major problems detecting anything over 19kHz.
When I test with ultrasonic frequencies, Safari always shows the peak amplitude in lower frequency bins around 18-19kHz instead of the actual frequency being played. Other browsers handle this perfectly.
Here’s my audio setup code:
async setupAudioCapture() {
try {
const audioSettings = {
echoCancellation: false,
noiseSuppression: false,
autoGainControl: false
};
let mediaStream = await navigator.mediaDevices.getUserMedia({
audio: audioSettings
});
mediaStream.getAudioTracks()[0].applyConstraints(audioSettings);
this.micStream = mediaStream;
const Context = window.AudioContext || window.webkitAudioContext;
const ctx = new Context();
this.samplingRate = ctx.sampleRate;
const freqAnalyzer = ctx.createAnalyser();
freqAnalyzer.fftSize = CONFIG.FFT_BINS;
freqAnalyzer.smoothingTimeConstant = 0;
const micInput = ctx.createMediaStreamSource(mediaStream);
micInput.connect(freqAnalyzer);
const bufferProcessor = ctx.createScriptProcessor(CONFIG.BUFFER_LENGTH, 1, 1);
bufferProcessor.connect(ctx.destination);
this.analyzer = freqAnalyzer;
this.scriptNode = bufferProcessor;
} catch (err) {
console.error('Audio setup failed:', err);
}
}
And here’s how I analyze the frequency data:
this.scriptNode.onaudioprocess = () => {
let spectrumData = new Float32Array(analyzer.frequencyBinCount);
analyzer.getFloatFrequencyData(spectrumData);
let filteredSpectrum = filterLowFreqs(spectrumData, this.samplingRate);
let dominantFreq = getPeakFrequency(filteredSpectrum, this.samplingRate);
console.log('detected frequency:', dominantFreq);
};
Has anyone encountered similar issues with Safari’s Web Audio implementation for high frequency detection? Any workarounds would be really helpful.