Riconoscimento musicale e elaborazione del segnale

Voglio build qualcosa di simile a Tunatic o Midomi (provalo se non sei sicuro di quello che fanno) e mi chiedo quali algoritmi dovrei usare; L'idea che ho del funzionamento di tali applicazioni è qualcosa del genere:

  1. avere un grande database con diverse canzoni
  2. per each brano in 1. ridurre la qualità / bit rate (a 64kbps per esempio) e calcolare il suono "hash"
  3. avere il suono / estratto della musica che vuoi identificare
  4. per la canzone in 3. ridurre la qualità / bit-rate (di nuovo a 64kbps) e calcolare il suono "hash"
  5. se 4. l'hash del suono è in uno qualsiasi dei 2. suoni di hash restituiscono la musica abbinata

Ho pensato di ridurre la qualità / bit rate a causa dei rumori dell'ambiente e delle differenze di codifica.

Sono nella giusta direzione qui? Qualcuno può fornirmi documentazione o esempi specifici ? Midori sembra addirittura riconoscere hum's , è incredibilmente impressionante! Come lo fanno?

Esistono gli effetti sonori o è qualcosa che ho appena inventato? Se lo fanno, come posso calcolarli? E, ancora più importnte, come posso verificare se child-hash è in father-hash ?

Come potrei fare per build un sistema simile con Python (forse un module integrato) o PHP ?

Alcuni esempi (preferibilmente in Python o PHP) saranno molto apprezzati. Grazie in anticipo!

Ho lavorato alla periferia di un quadro freddo che implementa diverse tecniche di recupero di informazioni musicali. Non sono un esperto (edit: in realtà non sono da nessuna parte vicino a un esperto, solo per chiarire), ma posso dire che la Fast Fourier Transform è usata dappertutto con questa roba. L'analisi di Fourier è stravagante ma la sua applicazione è piuttosto semplice. Fondamentalmente puoi get molte informazioni sull'audio quando lo si analizza nel dominio della frequenza piuttosto che nel dominio del tempo. Questo è ciò che ti offre l'analisi di Fourier.

Potrebbe essere un po 'fuori tema da quello che vuoi fare. In each caso, ci sono alcuni strumenti interessanti nel progetto con cui giocare, oltre a visualizzare il codice sorgente per la libreria principale stessa: http://marsyas.sness.net

Faccio ricerche nel reperimento di informazioni musicali (MIR). Il documento fondamentale sul fingerprinting musicale è quello di Haitsma e Kalker intorno al 2002-03. Google dovrebbe farvelo.

Ho letto un libro bianco (molto presto, prima del 2000) sul metodo di Shazam. A quel punto, hanno rilevato fondamentalmente picchi spettrotemporali e poi hanno cancellato i picchi. Sono sicuro che la procedura si è evoluta.

Entrambi questi methods affrontano la somiglianza musicale a livello del segnale, cioè, è robusto alle distorsioni dell'ambiente. Non penso che funzioni bene per query-by-humming (QBH). Tuttavia, questo è un problema diverso (ma correlato) con soluzioni diverse (ma correlate), quindi puoi trovare soluzioni in letteratura. (Troppi per nominare qui.)

I procedimenti ISMIR sono disponibili gratuitamente online. Puoi trovare cose preziose lì: http://www.ismir.net/

Sono d'accordo con l'utilizzo di una libreria esistente come Marsyas. Dipende da cosa vuoi. Numpy / Scipy è indispensabile qui, penso. Le cose semplici possono essere scritte in Python da solo. Diamine, se hai bisogno di cose come STFT, MFCC, posso mandarti il ​​tuo codice via email.

MFCC estratto dalla musica è molto utile per trovare la somiglianza timbrel tra le canzoni .. questo è più spesso usato per trovare canzoni simili. Come sottolineato da darren, Marsyas è uno strumento che può essere utilizzato per estrarre MFCC e trovare canzoni simili convertendo l'MFCC in una singola rappresentazione vettoriale.

Oltre a MFCC, Rhythm viene anche utilizzato per trovare la somiglianza tra le canzoni. Ci sono alcuni documenti presentati nel Mirex 2009

ciò ti darà una buona panoramica dei diversi algoritmi e funzionalità che sono più utili nel rilevare la somiglianza musicale.

Recentemente ho portto su Python il mio sistema di fingerprinting basato su landmark audio:

https://github.com/dpwe/audfprint

È in grado di riconoscere piccoli (5-10 secondi) estratti da un database di riferimento di 10 s di migliaia di tracce, ed è abbastanza robusto per il rumore e le distorsioni del canale. Usa combinazioni di picchi spettrali locali, simili al sistema Shazam.

Questo può solo corrispondere esattamente alla stessa traccia, dal momento che si basa su dettagli precisi di frequenze e differenze di tempo – non corrisponderebbe nemless a take diversi, certamente non a cover o hums. Per quel che ne so, Midomi / SoundHound funziona abbinando i ronzii l'un l'altro (ad esempio tramite il dynamic time warping ), quindi ha una serie di collegamenti curati dall'uomo tra insiemi di ronzii e la traccia musicale desiderata.

Abbinare un ronzio direttamente a una traccia musicale ("Query canticchiando") è un problema di ricerca in corso nel reperimento di informazioni musicali, ma è ancora piuttosto difficile. È ansible vedere gli abstract di un insieme di sisthemes valutati l'anno scorso ai risultati QBSH MIREX 2013 .

È passato un po 'di tempo dall'ultima volta che ho elaborato il segnale, ma anziché eseguire il downsampling dovresti esaminare le rappresentazioni del dominio della frequenza (ad esempio FFT o DCT). Quindi è ansible creare un hash di sorta e cercare la canzone del database con quella sequenza in.

La parte difficile è rendere questa ricerca veloce (forse alcuni documenti sulla ricerca dei geni potrebbero essere di interesse). Sospetto che iTunes rilevi anche alcuni strumenti per restringere la ricerca.

Ho letto un articolo sul metodo in cui un certo servizio di recupero di informazioni sulla musica (nessun nome menzionato) lo fa, calcolando la trasformata di Fourier Short Time sul campione di audio. L'algorithm quindi preleva i "picchi" nel dominio della frequenza, cioè le posizioni temporali e le frequenze che hanno un'ampiezza particolarmente elevata, e utilizza il tempo e la frequenza di questi picchi per generare un hash. Si scopre che l'hash ha sorprendenti collisioni tra diversi campioni e resiste anche a circa il 50% della perdita di dati delle informazioni di picco …..

Attualmente sto sviluppando un motore di ricerca musicale utilizzando ActionScript 3. L'idea sta analizzando prima gli accordi e contrassegnando i frame (è limitato ai file mp3 al momento) in cui la frequenza cambia drasticamente (la melodia cambia e ignorano i rumori). Dopodiché faccio la stessa cosa con il suono in ingresso e abbiniamo i risultati con i file invertiti. Quello corrispondente determina la canzone corrispondente.

Per il metodo di Axel, penso che non dovresti preoccuparti della domanda se si tratta di un canto o di un canticchiare, dato che non implementi un programma di riconoscimento vocale. Ma sono curioso del tuo metodo che usa le funzioni hash. Potresti spiegarmelo?

Il progetto MusicBrainz mantiene un tale database. È ansible eseguire query in base a un'impronta digitale.

Il progetto esiste già da un po 'e ha utilizzato diverse impronte digitali in passato. Vedi qui per un elenco.

L'ultima impronta digitale che stanno utilizzando è AcoustId . Esiste la libreria Chromaprint (anch'essa con collegamenti Python) in cui è ansible creare tali impronte digitali. Devi nutrirlo con dati PCM grezzi.

Recentemente ho scritto una libreria in Python che esegue la decodifica (usando FFmpeg) e fornisce funzioni come generare l'impronta digitale di AcoustId (usando Chromaprint) e altre cose (anche per riprodurre il stream tramite PortAudio). Vedi qui

Per la function query humming, è più complicato della soluzione di fingerprinting audio, il difficile deriva da:

  • come raccogliere in modo efficiente il database della melodia nell'applicazione del mondo reale? molti sisthemes dimostrativi utilizzano midi per la creazione, ma il costo della soluzione midi è estremamente poco costoso per un'azienda.
  • come gestire la varianza del tempo, ad esempio, il ronzio dell'utente può essere veloce o lento. usare DTW? sì, DTW è un'ottima soluzione per gestire le serie temporali con variazioni di tempo, ma costa troppo carico della CPU.
  • come creare l'indice delle serie temporali?

Ecco una query demo canticchiando il progetto open source, https://github.com/EmilioMolina/QueryBySingingHumming , potrebbe essere un riferimento.