From 14df5b3845649258e43c8733717eda864b4d88d2 Mon Sep 17 00:00:00 2001 From: Chigozirim Igweamaka Date: Wed, 16 Jul 2025 05:08:05 +0100 Subject: [PATCH] feat: enhance generateFingerprint function to handle stereo input audio --- server/wasm/wasm_main.go | 63 +++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/server/wasm/wasm_main.go b/server/wasm/wasm_main.go index 2afb489..030da71 100644 --- a/server/wasm/wasm_main.go +++ b/server/wasm/wasm_main.go @@ -4,16 +4,17 @@ package main import ( + "song-recognition/models" "song-recognition/shazam" "song-recognition/utils" "syscall/js" ) func generateFingerprint(this js.Value, args []js.Value) interface{} { - if len(args) < 2 { + if len(args) < 3 { return js.ValueOf(map[string]interface{}{ "error": 1, - "data": "Expected audio array and sample rate", + "data": "Expected audio array, sample rate, and number of channels", }) } @@ -24,6 +25,14 @@ func generateFingerprint(this js.Value, args []js.Value) interface{} { }) } + channels := args[2].Int() + if args[2].Type() != js.TypeNumber || (channels != 1 && channels != 2) { + return js.ValueOf(map[string]interface{}{ + "error": 2, + "data": "Invalid number of channels; expected 1 or 2", + }) + } + inputArray := args[0] sampleRate := args[1].Int() @@ -32,16 +41,48 @@ func generateFingerprint(this js.Value, args []js.Value) interface{} { audioData[i] = inputArray.Index(i).Float() } - spectrogram, err := shazam.Spectrogram(audioData, sampleRate) - if err != nil { - return js.ValueOf(map[string]interface{}{ - "error": 3, - "data": "Error generating spectrogram: " + err.Error(), - }) - } + fingerprint := make(map[uint32]models.Couple) + var leftChannel, rightChannel []float64 - peaks := shazam.ExtractPeaks(spectrogram, float64(len(audioData)/sampleRate)) - fingerprint := shazam.Fingerprint(peaks, utils.GenerateUniqueID()) + if channels == 1 { + leftChannel = audioData + spectrogram, err := shazam.Spectrogram(audioData, sampleRate) + if err != nil { + return js.ValueOf(map[string]interface{}{ + "error": 3, + "data": "Error generating spectrogram: " + err.Error(), + }) + } + peaks := shazam.ExtractPeaks(spectrogram, float64(len(audioData))/float64(sampleRate)) + fingerprint = shazam.Fingerprint(peaks, utils.GenerateUniqueID()) + } else { + for i := 0; i < len(audioData); i += 2 { + leftChannel = append(leftChannel, audioData[i]) + rightChannel = append(rightChannel, audioData[i+1]) + } + + // LEFT + spectrogram, err := shazam.Spectrogram(leftChannel, sampleRate) + if err != nil { + return js.ValueOf(map[string]interface{}{ + "error": 3, + "data": "Error generating spectrogram: " + err.Error(), + }) + } + peaks := shazam.ExtractPeaks(spectrogram, float64(len(leftChannel))/float64(sampleRate)) + utils.ExtendMap(fingerprint, shazam.Fingerprint(peaks, utils.GenerateUniqueID())) + + // RIGHT + spectrogram, err = shazam.Spectrogram(rightChannel, sampleRate) + if err != nil { + return js.ValueOf(map[string]interface{}{ + "error": 3, + "data": "Error generating spectrogram: " + err.Error(), + }) + } + peaks = shazam.ExtractPeaks(spectrogram, float64(len(rightChannel))/float64(sampleRate)) + utils.ExtendMap(fingerprint, shazam.Fingerprint(peaks, utils.GenerateUniqueID())) + } fingerprintArray := []interface{}{} for address, couple := range fingerprint {