feat: enhance generateFingerprint function to handle stereo input audio

This commit is contained in:
Chigozirim Igweamaka 2025-07-16 05:08:05 +01:00
parent 95d51b0ff5
commit 14df5b3845

View file

@ -4,16 +4,17 @@
package main package main
import ( import (
"song-recognition/models"
"song-recognition/shazam" "song-recognition/shazam"
"song-recognition/utils" "song-recognition/utils"
"syscall/js" "syscall/js"
) )
func generateFingerprint(this js.Value, args []js.Value) interface{} { func generateFingerprint(this js.Value, args []js.Value) interface{} {
if len(args) < 2 { if len(args) < 3 {
return js.ValueOf(map[string]interface{}{ return js.ValueOf(map[string]interface{}{
"error": 1, "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] inputArray := args[0]
sampleRate := args[1].Int() sampleRate := args[1].Int()
@ -32,16 +41,48 @@ func generateFingerprint(this js.Value, args []js.Value) interface{} {
audioData[i] = inputArray.Index(i).Float() audioData[i] = inputArray.Index(i).Float()
} }
spectrogram, err := shazam.Spectrogram(audioData, sampleRate) fingerprint := make(map[uint32]models.Couple)
if err != nil { var leftChannel, rightChannel []float64
return js.ValueOf(map[string]interface{}{
"error": 3,
"data": "Error generating spectrogram: " + err.Error(),
})
}
peaks := shazam.ExtractPeaks(spectrogram, float64(len(audioData)/sampleRate)) if channels == 1 {
fingerprint := shazam.Fingerprint(peaks, utils.GenerateUniqueID()) 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{}{} fingerprintArray := []interface{}{}
for address, couple := range fingerprint { for address, couple := range fingerprint {