Come estrarre la parte vocale dal segnale audio stereo?


15

Sto elaborando file MP3 e ho riscontrato questo problema. Il mio MP3 è codificato in stereo. Quello che voglio fare è estrarre la parte vocale per ulteriori elaborazioni (qualunque sia la modalità dei segnali di uscita, mono o stereo sono entrambi OK).

Per quanto ne so, l'audio è codificato in diverse bande di sub frequenza dis-joint in MP3. Penso di poter limitare i segnali alla gamma vocale attraverso il filtro passa-alto / passa-basso con la frequenza di taglio impostata correttamente. Tuttavia, in questo caso il risultato deve contenere parti di puro segnale musicale. O dopo aver cercato su google, penso di poter calcolare prima i segnali di sottofondo (invertendo l'aggiunta di un canale con i segnali dell'altro canale assumendo che la parte vocale sia centrata nell'audio stereo chiamato cancellazione di fase). Dopo questa trasformazione, il segnale è mono. Quindi dovrei unire lo stereo originale in mono da cui estrarre il segnale di fondo.

Data l'efficacia, quale è preferito (o qualsiasi altra soluzione :)? Se il 2 °, lasciare due canali A e B, verranno utilizzati (BA) o (AB) quando si calcola lo sfondo? Come con l'unione di due canali, l'aritmetica significa abbastanza accurata? Oppure posso sottocampionare ciascun canale di un fattore due e interlacciare i segnali sottocampionati come risultato mono?

Grazie e distinti saluti.

Risposte:


21

Prima di tutto, il modo in cui i dati sono codificati in un file mp3 è irrilevante per la domanda, a meno che non si miri a eseguire l'elaborazione di dominio compresso (che sarebbe piuttosto sciocco). Quindi puoi presumere che il tuo algoritmo funzionerà con dati del dominio del tempo decompressi.

La somma / differenza è un trucco molto, molto semplice per la soppressione vocale (non estrazione). Si basa sul presupposto che le voci siano mixate al centro del campo stereo, mentre altri strumenti sono orientati lateralmente. Questo è raramente vero. LR e RL suoneranno allo stesso modo (l'orecchio umano è insensibile a uno sfasamento globale) e ti darà un mix mono senza gli strumenti miscelati al centro. Il problema è che, una volta ripristinato lo sfondo, cosa ne farai? Prova a sopprimerlo dal segnale centrale (medio)? Questo non funzionerà, lo farai (L + R) / 2 - (L - R), questo non è molto interessante ... Puoi provare qualsiasi combinazione lineare di questi (media e "centro rimosso"), niente ne uscirà!

Per quanto riguarda gli approcci di filtraggio: il f0 della voce raramente supera i 1000 Hz, ma le sue armoniche possono andare oltre. La rimozione della frequenza più alta renderà sgradevoli le consonanti (in particolare sss, chhh). Alcune voci maschili scendono al di sotto di 100 Hz. Tuttavia, puoi tagliare in sicurezza qualunque cosa sia al di sotto di 50 o 60 Hz (basso, calcio)

Alcuni recenti sviluppi nella separazione vocale che vale la pena esplorare:

  • Fondo NMF + pettine armonico> filtro modello di Jean Louis Durrieu . Codice Python qui .
  • L' approccio di estrazione di sfondo di Rafii . Semplice da programmare e funziona bene sulla musica prodotta al computer con schemi molto ripetitivi come Electro, Hip-hop ...
  • Hsu si è avvicinato in base al rilevamento, al tracciamento e al mascheramento di f0. "Un algoritmo in tandem per l'estrazione di intonazioni di canto e la separazione vocale dall'accompagnamento musicale" (impossibile trovare PDF accessibile).

4

Grazie per il riferimento! Hai dimenticato di menzionare il tuo lavoro sul potenziamento della batteria , che potrebbe anche interessare l'applicazione Summer_More_More_Tea. Bene, tutto dipende davvero da cosa vuoi farci. Hai in mente una specifica "applicazione finale"?

Sono completamente d'accordo con le affermazioni di cui sopra. Per essere completo, dovrei comunque dire che il potenziamento vocale che hai citato è stato usato anche in alcuni lavori di Matti Ryynänen, sulla generazione di brani di Karaoke, per migliorare i risultati.

Per rispondere alle tue domande:

Data l'efficacia, quale è preferito (o qualsiasi altra soluzione :)?

Come dicevano le pichenette, nessuna delle due sembra soddisfare le tue esigenze: il filtro passa-basso / passa-alto fallirà a causa della struttura armonica della voce umana (e più in generale di qualsiasi suono "interessante" - cioè qualsiasi cosa oltre i sinusoidi ... ).

Se il 2 °, lasciare due canali A e B, verranno utilizzati (BA) o (AB) quando si calcola lo sfondo? Come con l'unione di due canali, l'aritmetica significa abbastanza accurata?

Ancora una volta, il secondo metodo che menzionerai non funzionerà perché puoi solo rimuovere il segnale che si trova al centro, non recuperarlo. In altre parole, anche la voce è al "centro", non esiste una semplice matematica per ottenere un segnale solo vocale.

Oppure posso sottocampionare ciascun canale di un fattore due e interlacciare i segnali sottocampionati come risultato mono?

er ... la media dei canali per ottenere un segnale mono-canale, come suggerito sopra, ha senso e non romperà le caratteristiche spettrali del tuo segnale (supponendo che il segnale stereo non sia degenerato). Quindi ottieni un segnale mono in cui hai, fondamentalmente, lo stesso contenuto musicale di prima.

Il downsampling corretto di ciascun canale significa che si applica prima un filtro passa-basso (con frequenza di taglio di sampling_rate / 4 nel proprio caso), quindi è possibile prelevare in sicurezza ogni 2 campioni. Tuttavia, non c'è molto da dire sull'interleaving dei canali così sottocampionati: nella maggior parte dei casi, ciò rompe le caratteristiche spettrali del segnale. Probabilmente non lo vuoi.

In effetti, l'operazione di filtro passa-basso seguiva l'impostazione di 0 ogni 2 campioni e il mantenimento di questi 0 conduce, nel dominio di Fourier, al "mirroring" dei componenti a bassa frequenza che sono stati mantenuti su quelli ad alta frequenza. Ricorda che tieni lezioni di elaborazione del segnale sulla teoria del campionamento: la moltiplicazione per una sequenza di impulsi (o dirac) si traduce in una convoluzione con un'altra sequenza di dirac nel dominio di Fourier, ovvero, in tal caso, lo spettro di frequenza del segnale viene ripetuto (periodizzato) lungo l'asse della frequenza, con un periodo pari alla frequenza di campionamento.

Normalmente, quando si esegue il downsampling, si rimuovono gli 0 (poiché si presume una nuova frequenza di campionamento). Ma qui, mantenerli si traducono in fastidiosi componenti aggiuntivi ad alta frequenza. Interlacciare questi segnali non correggerà questo.

Bene, tutto sommato, la risposta breve: non farlo . :-)

Infine, potrei anche suggerirti di usare la GUI che ho sviluppato per la conferenza LVAICA 2012: c'è un repository git per questo. Sto ancora eseguendo il debug e migliorandolo, quindi i commenti sono ben accetti: D

Spero possa aiutare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.