Identifica dove inizia il canto in una registrazione solo vocale


14

Ho una piccola app in stile karaoke in cui un utente canta 4 righe di una canzone, con un intervallo di un secondo tra ogni riga. Non c'è musica di supporto, quindi è solo voce, si spera che renda il problema più facile da risolvere.

Sto cercando il modo più robusto per rilevare esattamente dove nella mia registrazione l'utente inizia e finisce di cantare la linea 1, inizia e finisce di cantare la linea 2, ecc.

Ho messo insieme un algoritmo semplice che funziona quando c'è molto poco rumore di fondo nella registrazione (come quando succede?), Ma cade a pezzi in presenza del rumore più piccolo.

Qualcuno può indicarmi qualcosa di più robusto?


La mia risposta potrebbe aiutarti - dsp.stackexchange.com/a/1543/440
Dipan Mehta

In alcune registrazioni la voce è l'unico strumento che viene suonato con la stessa ampiezza in entrambi i canali. È possibile utilizzare queste informazioni per estrarre la voce da una registrazione stereo.
Jader Dias,

Risposte:


4

Se il rumore di fondo è bianco-ish, è possibile misurare la planarità spettrale e considerarla come voce quando l'ampiezza è al di sopra di una soglia e la piattezza spettrale è al di sotto di una soglia.

Fondamentalmente basta prendere una FFT di una porzione del segnale, quindi dividere la media geometrica della grandezza dello spettro per la media aritmetica.

È inoltre possibile utilizzare un filtro passa-banda per enfatizzare solo le regioni di frequenza in cui si trova di solito la voce umana (semplice come impostare le regioni indesiderate di FFT su 0 prima di misurare la planarità spettrale)


Endolith, nella tua esperienza, fa una grande differenza se prendi la grandezza quadrata VS solo la grandezza prima di misurare la planarità spettrale?
Spacey,

@Mohammad: non ho alcuna esperienza con esso. :) Ho fatto una domanda precedente perché non avevo capito le specifiche e non sono ancora sicuro di quale sia il modo corretto. Tuttavia, non penso che la quadratura faccia alcuna differenza pratica. Se stai solo innescando quando supera una soglia, dovrebbe reagire in modo identico al quadrato o meno (supponendo che tu modifichi la soglia in modo che corrisponda), quindi la sola grandezza è più computazionalmente più economica.
endolito

@Endolith, questo è un po 'un colpo lungo: sai come implementare questo approccio in MATLAB? Voglio testare tutti gli approcci menzionati qui in matlab (in realtà l'ottava) per vedere qual è il migliore?
Mike Hogan,

@MikeHogan: No, non uso matlab da molto tempo. : / Inoltre ciò richiederebbe un vero lavoro. :) Non ho nulla di pre-scritto. Suddividi il segnale in piccoli pezzi, esegui la FFT di ciascuno e, per ogni FFT, dividi la media geometrica della magnitudine per la media aritmetica della magnitudine. i numeri più alti sono rumorosi, i numeri più bassi sono tonali.
endolith

3

Ho usato il flusso spettrale in passato e sembra funzionare bene. L'idea di base è, creare uno spettrogramma del segnale, attraverso le bande a cui tieni. Supponiamo che la tua frequenza sia sull'asse y e che il tuo tempo sia sull'asse x, in questo modo .

Ciò significa che il tuo spettrogramma è una matrice. Ogni colonna rappresenta il valore assoluto della FFT di uno snap-shot nel tempo del segnale e ogni riga rappresenta il modo in cui l'energia di una banda cambia nel tempo.

Ora, prendi semplicemente la differenza di colonne. Cioè, prendere una colonna e sottrarre da sé la colonna prima di essa, e fare per tutte le colonne. (Lasciando da solo le colonne iniziali ovviamente). Quindi somma in tutte le bande. Cioè, basta sommare tutte le righe insieme.

Ti ritroverai con un segnale 1-D che codifica i tuoi insiemi di segnali . Questo ti dirà dove inizia la tua voce.

MODIFICARE:

Ora che hai rilevato insorgenze, se vuoi rilevare il contrario (cioè quando un segnale passa dall'avere attività a nessuna), il flusso spettrale ti fornisce effettivamente tali informazioni. Ovunque tu abbia un esordio, avrai un picco positivo e ovunque avrai un 'deset' (per mancanza di una parola migliore), avrai un picco negativo.

Vorrei semplicemente prendere il primo picco positivo e l'ultimo picco negativo per contrassegnare i tempi di inizio e fine totali del mio segnale.


Mohammad, cosa intendi con "fila"?
Mike Hogan,

@MikeHogan Per favore, vedi le mie modifiche, ho riscritto la risposta.
Spacey,

Tuttavia, questo non troverebbe insorgenze di nulla? Anche i colpi di batteria o altri rumori impulsivi verrebbero rilevati. Non fa distinzione tra suoni tonali e suoni rumorosi.
endolito

@endolith Hai sollevato un buon punto, tuttavia credo che potrebbe ancora funzionare. Il mio ragionamento è che in questo scenario, ci si trova nello stato di voce + musica o semplicemente nello stato di musica. Quindi, quando si calcola il flusso spettrale, si sta semplicemente calcolando il delta tra voce + musica e solo musica. (Ovviamente avrei bisogno di analizzarlo molto di più, ma è così che penso ora) :-P
Spacey,

1
@endolith Ho appena riletto e l'OP sta dicendo che c'è solo la voce, (apparentemente è una semplice app), quindi in questo caso sarebbe solo la voce VS niente.
Spacey,

2

Dalla mia esperienza, proverei a esaminare i coefficienti di cepstrum-frequenza-mel (MFCC) . Gli MFCC sono abbastanza facili da implementare se si dispone di una FFT e vengono utilizzati abbastanza comunemente nell'elaborazione vocale.

Con gli MFCC, dovresti essere in grado di distinguere i dati vocali effettivi dal rumore.


@endolith, quel link è completamente al di là di me! Conosci un'implementazione open source che posso vedere o una ricetta più dettagliata di come funziona?
Mike Hogan,

2

" Flusso spettrale " (noto anche come "differenza spettrale") è un metodo comune per il "rilevamento dell'insorgenza". Fondamentalmente si prendono FFT sequenziali del segnale e si sommano le dimensioni delle differenze dei bucket FFT da un campione all'altro. "Onset" sarà generalmente rappresentato da un "salto" sostanziale in questo valore.

Google "rilevamento insorgenza" per altre idee.


2

L'uso del solo flusso spettrale può produrre falsi positivi per determinati rumori e rilevare una voce che canta.

Il canto di solito implica un contenuto di segnale contenente un tono, quindi è possibile utilizzare un rilevatore di tono o uno stimatore (ceppo, ecc.). È possibile controllare la sanità mentale della frazione di energia rilevata come intonata rispetto all'energia totale del segnale e che l'intonazione stimata rientra nell'intervallo della voce umana. Ciò ridurrebbe il tasso di falsi positivi per il rumore non acuto e per i suoni musicali al di fuori della normale gamma vocale.

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.