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
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 {