Sonido-Sonar ๐ŸŽต

March 10, 2026 ยท View on GitHub

A pure Go audio fingerprinting and temporal alignment library. Originally developed during my Summer 2025 internship at TuneIn Inc. to benchmark CDN stream end-to-end latency relative to their source streams.

Calculations are performed based on content type. To optimize performance, you can pass in the content type to skip the acoustic content type detection phase.

Go Version License Documentation


๐Ÿ“– Table of Contents


โœจ Features

CategoryCapabilities
FingerprintingMulti-feature audio signatures (MFCC, spectral, chroma, speech features)
AlignmentTemporal alignment using DTW and cross-correlation (up to configurable lag offset)
Content DetectionAuto-detect music, speech, news, sports, and mixed content types
Spectral AnalysisMFCC, spectral contrast/centroid/flux, Mel/Bark scales, STFT/FFT
Windowing9 window functions: Hamming, Hann, Blackman, Kaiser, Welch & more
ComparisonSimilarity scoring tailored by content type (music vs speech optimized weights)
CDN LatencyEnd-to-end latency measurement for streaming pipeline diagnostics

๐Ÿ“ฆ Installation

go get github.com/RyanBlaney/sonido-sonar

Or add to your go.mod:

require github.com/RyanBlaney/sonido-sonar v0.1.0

๐Ÿš€ Quick Start

Basic Fingerprint Generation

package main

import (
    "fmt"
    "github.com/RyanBlaney/sonido-sonar/fingerprint"
    "github.com/RyanBlaney/sonido-sonar/transcode"
)

func main() {
    // Load audio data via the decoder
    config := &transcode.DecoderConfig{
        TargetSampleRate: 44100,
        EnableNormalization: true,
    }
    
    decoder := transcode.NewDecoder(config)
    audioData, err := decoder.DecodeFile("path/to/audio.wav")
    if err != nil {
        panic(err)
    }

    // Generate fingerprint
    fpConfig := &fingerprint.Config{
        WindowSize:  1024,
        HopSize:     256,
        ContentType: "music", // or "speech", "news", "sports"
    }
    
    generator := fingerprint.NewFingerprintGenerator(fpConfig)
    fp, err := generator.GenerateFingerprint(audioData)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Generated fingerprint with %d feature points\n", len(fp.Features))
}

Temporal Alignment (Two Streams)

package main

import (
    "fmt"
    "github.com/RyanBlaney/sonido-sonar/fingerprint"
    "github.com/RyanBlaney/sonido-sonar/fingerprint/extractors"
)

func main() {
    // Assume fp1 and fp2 are fingerprints from source & CDN streams
    fp1 := loadFingerprint("source.mp3")
    fp2 := loadFingerprint("cdn_stream.mp3")

    extractor := extractors.NewAlignmentExtractorWithMaxLag(
        fpConfig,
        alignmentConfig,
        maxOffsetSeconds: 60.0,
    )

    features, err := extractor.ExtractAlignmentFeatures(fp1.Features, fp2.Features, 
        srcPCM, cdnPCM, sampleRate)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Detected latency: %.3f seconds\n", features.TemporalOffset)
    fmt.Printf("Alignment confidence: %.2f%%\n", features.OffsetConfidence*100)
}

Stream Similarity Comparison

package main

import (
    "github.com/RyanBlaney/sonido-sonar/fingerprint"
)

func main() {
    fpConfig := fingerprint.Config{ContentType: "music"}
    
    // Generate fingerprints for both streams
    f1 := generateFingerprintForStream(sourceURL, fpConfig)
    f2 := generateFingerprintForStream(cdnURL, fpConfig)

    comparator := fingerprint.NewFingerprintComparator(&fpConfig.ComparisonSettings)
    result, err := comparator.Compare(f1, f2)

    fmt.Printf("Overall Similarity: %.2f%%\n", result.OverallSimilarity*100)
    fmt.Printf("Confidence Score:   %.2f%%\n", result.Confidence*100)
}

๐Ÿ“ Modules & Structure

โ”œโ”€โ”€ algorithms/      # DSP and feature extraction primitives
โ”‚   โ”œโ”€โ”€ chroma/     # Tonal features (HPCP, pitch class, key detection)
โ”‚   โ”œโ”€โ”€ spectral/   # STFT, MFCC, power spectrum, centroid/rolloff/etc.
โ”‚   โ”œโ”€โ”€ speech/     # LPC, voice quality metrics for spoken content
โ”‚   โ”œโ”€โ”€ rhythm/     # Tempo & meter estimation
โ”‚   โ”œโ”€โ”€ windowing/  # Window functions (Hamming, Hann, Kaiser...)
โ”‚   โ”œโ”€โ”€ stats/      # Statistical tools: DTW, correlation, clustering
โ”œโ”€โ”€ fingerprint/    # Core fingerprint module
โ”‚   โ”œโ”€โ”€ extractors/* # Content-specific feature extractors (music/speech)
โ”‚   โ””โ”€โ”€ analyzers/*  # Fingerprint comparison logic
โ”œโ”€โ”€ transcode/     # Audio decoding & format normalization
โ””โ”€โ”€ logging/       # Structured logging interfaces

๐ŸŽฏ Content Detection

The library automatically detects content type to optimize feature extraction:

Content TypeOptimal FeaturesUse Case Example
musicChroma + Spectral + MFCCMusic streaming services
speechLPC, Pitch Detection, ZCRPodcasts, Talk Radio
newsSpeech Features + EnergyNews Broadcasts
sportsMixed (energy spikes, speech)Live Sports Commentary
detector := fingerprint.NewContentDetector(&fingerprint.Config{AutoDetect: true})
contentType := detector.DetectContentType(audioData) // Returns "music"|"speech"|...

โš™ Configuration

Key configuration parameters:

ParameterDefaultDescription
WindowSize1024FFT window size
HopSize256Frame hop (for STFT)
ContentType"music"Content type for weighting
EnableSpeechFeaturesfalseEnable LPC & speech analysis
MFCCCoefficients13Number of MFCC to extract
MinSimilarity0.70Acceptable fingerprint match threshold

Example config:

config := &fingerprint.Config{
    WindowSize:   1024,
    HopSize:      256,
    ContentType:  "news",
    EnableSpeechFeatures: true,
    MFCCCoefficients: 12,
}

๐Ÿ“š Technical Reference

Algorithms Implemented

  • MFCC (Itakura 1975) โ€” mel-frequency cepstral coefficients
  • STFT / DFT (Cooley & Tukey 1965) โ€” time-frequency analysis
  • Spectral Metrics โ€” centroid, contrast, flux, rolloff (Brown 1991)
  • Chroma Features โ€” pitch class profiles & Tonalnetz
  • DTW Alignment (Dynamic Time Warping)
  • Correlation Analysis โ€” Pearson / cross-correlation
  • Window Functions โ€” Hamming, Hann, Kaiser, Welch, Bartlett...

Key Citations

Davis, S. B., & Mermelstein, P. (1980). Comparison of parametric representation...
Haitsma, J., & Kalker, T. (2002). A highly robust audio fingerprinting system.


๐Ÿ“„ License

MIT License โ€” See LICENSE for more info.


Built with โค๏ธ at TuneIn Inc. | Summer 2025 Internship Project
Author: Ryan Blaney
Repo: github.com/RyanBlaney/sonido-sonar