mirror of
https://github.com/cgzirim/seek-tune.git
synced 2025-12-18 09:24:19 +00:00
feat: enhance generateFingerprint function to handle stereo input audio
This commit is contained in:
parent
95d51b0ff5
commit
14df5b3845
1 changed files with 52 additions and 11 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue