mirror of
https://github.com/cgzirim/seek-tune.git
synced 2025-12-17 08:54:19 +00:00
feat: add WASM support for audio fingerprint generation
This commit is contained in:
parent
495163ebb4
commit
af6319147c
1 changed files with 64 additions and 0 deletions
64
wasm/wasm_main.go
Normal file
64
wasm/wasm_main.go
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
//go:build js && wasm
|
||||
// +build js,wasm
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"song-recognition/shazam"
|
||||
"song-recognition/utils"
|
||||
"syscall/js"
|
||||
)
|
||||
|
||||
func generateFingerprint(this js.Value, args []js.Value) interface{} {
|
||||
if len(args) < 2 {
|
||||
return js.ValueOf(map[string]interface{}{
|
||||
"error": 1,
|
||||
"data": "Expected audio array and sample rate",
|
||||
})
|
||||
}
|
||||
|
||||
if args[0].Type() != js.TypeObject || args[1].Type() != js.TypeNumber {
|
||||
return js.ValueOf(map[string]interface{}{
|
||||
"error": 2,
|
||||
"data": "Invalid argument types; Expected audio array and samplerate (type: int)",
|
||||
})
|
||||
}
|
||||
|
||||
inputArray := args[0]
|
||||
sampleRate := args[1].Int()
|
||||
|
||||
audioData := make([]float64, inputArray.Length())
|
||||
for i := 0; i < inputArray.Length(); i++ {
|
||||
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(),
|
||||
})
|
||||
}
|
||||
|
||||
peaks := shazam.ExtractPeaks(spectrogram, float64(len(audioData)/sampleRate))
|
||||
fingerprint := shazam.Fingerprint(peaks, utils.GenerateUniqueID())
|
||||
|
||||
fingerprintArray := []interface{}{}
|
||||
for address, couple := range fingerprint {
|
||||
entry := map[string]interface{}{
|
||||
"address": address,
|
||||
"anchorTime": couple.AnchorTimeMs,
|
||||
}
|
||||
fingerprintArray = append(fingerprintArray, entry)
|
||||
}
|
||||
|
||||
return js.ValueOf(map[string]interface{}{
|
||||
"error": 0,
|
||||
"data": fingerprintArray,
|
||||
})
|
||||
}
|
||||
|
||||
func main() {
|
||||
js.Global().Set("generateFingerprint", js.FuncOf(generateFingerprint))
|
||||
select {}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue