Identifier où commence le chant dans un enregistrement vocal uniquement

14

J'ai une petite application de style karaoké où un utilisateur chante 4 lignes d'une chanson, avec un écart d'une seconde entre chaque ligne. Il n'y a pas de musique d'accompagnement, donc c'est uniquement de la voix, ce qui rend le problème plus facile à résoudre.

Je cherche le moyen le plus robuste pour détecter exactement où dans mon enregistrement l'utilisateur commence et termine la ligne de chant 1, commence et se termine la ligne de chant 2, etc.

J'ai bricolé un algorithme simple qui fonctionne quand il y a très peu de bruit de fond dans l'enregistrement (comme quand cela se produit-il?), Mais il tombe en morceaux en présence du plus petit bruit.

Quelqu'un peut-il m'orienter vers quelque chose de plus robuste?

Mike Hogan
la source
Ma réponse pourrait vous aider - dsp.stackexchange.com/a/1543/440
Dipan Mehta
Dans certains enregistrements, la voix est le seul instrument joué avec la même amplitude sur les deux canaux. Vous pouvez utiliser ces informations pour extraire la voix d'un enregistrement stéréo.
Jader Dias

Réponses:

4

Si le bruit de fond est blanc, vous pouvez mesurer la planéité spectrale et le considérer comme de la voix lorsque l'amplitude est supérieure à un certain seuil et que la planéité spectrale est inférieure à un certain seuil.

Fondamentalement, vous prenez simplement une FFT d'un morceau du signal, puis divisez la moyenne géométrique de l'amplitude du spectre par la moyenne arithmétique.

Vous pouvez également utiliser un filtre passe-bande pour souligner uniquement les régions de fréquence où la voix humaine se trouve habituellement (aussi simple que de définir les régions indésirables de la FFT à 0 avant de mesurer la planéité spectrale)

endolith
la source
Endolith, selon votre expérience, cela fait-il une grande différence si vous prenez la magnitude au carré VS juste la magnitude avant de mesurer la planéité spectrale?
Spacey
@Mohammad: Je n'en ai aucune expérience. :) J'ai posé une question précédente parce que je ne comprenais pas la spécification, et je ne sais toujours pas quel chemin est correct. Je ne pense pas que la quadrature fasse une différence pratique, cependant. Si vous déclenchez simplement quand il franchit un seuil, il devrait réagir de manière identique, qu'il soit carré ou non (en supposant que vous ajustez le seuil pour qu'il corresponde), de sorte que la magnitude seule est moins coûteuse en termes de calcul.
endolith
@Endolith, c'est un peu loin: savez-vous comment implémenter cette approche dans matlab? Je veux tester toutes les approches mentionnées ici dans matlab (octave en fait) pour voir laquelle est la meilleure?
Mike Hogan
@MikeHogan: Non, je n'ai pas utilisé matlab depuis longtemps. : / Cela nécessiterait également un vrai travail. :) Je n'ai rien de pré-écrit. Divisez le signal en petits morceaux, effectuez la FFT de chacun et, pour chaque FFT, divisez la moyenne géométrique de la magnitude par la moyenne arithmétique de la magnitude. les nombres plus élevés sont bruyants, les nombres inférieurs sont tonaux.
endolith
3

J'ai utilisé le flux spectral dans le passé et cela semble bien fonctionner. L'idée de base est de créer un spectrogramme de votre signal, à travers les bandes qui vous intéressent. Supposons que votre fréquence se trouve sur l'axe des y et votre temps sur l'axe des x, comme ça .

Cela signifie que votre spectrogramme est une matrice. Chaque colonne représente la valeur absolue de la FFT d'un instantané dans le temps de votre signal, et chaque ligne représente comment l'énergie d'une bande change au fil du temps.

Maintenant, prenez simplement la différence des colonnes. C'est-à-dire, prenez une colonne et soustrayez d'elle la colonne qui la précède, et faites pour toutes les colonnes. (Laissant les colonnes de départ seules évidemment). Additionnez ensuite toutes les bandes. Autrement dit, additionnez simplement toutes les lignes ensemble.

Vous vous retrouverez avec un signal 1-D qui codifie vos débuts de signal . Cela vous indiquera où commence votre voix.

ÉDITER:

Maintenant que vous avez détecté des débuts, si vous voulez détecter le contraire (c'est-à-dire lorsqu'un signal passe d'une activité à aucune), le flux spectral vous donne en fait cette information. Partout où vous avez un début, vous aurez un pic positif, et partout où vous aurez un «déset» (faute d'un meilleur mot), vous aurez un pic négatif.

Je prendrais simplement le premier pic positif et le dernier pic négatif pour marquer les heures totales de démarrage et d'arrêt de mon signal.

Spacey
la source
Mohammad, que voulez-vous dire par «rangée»?
Mike Hogan
@MikeHogan S'il vous plaît voir mes modifications, j'ai réécrit la réponse.
Spacey
Cependant, cela ne trouverait-il rien? Des coups de tambour ou d'autres bruits impulsifs seraient également détectés. Il ne fait pas de différence entre les sons tonaux et les sons bruyants.
endolith
@endolith Vous soulevez un bon point - mais je pense que cela pourrait encore fonctionner. Mon raisonnement est que dans ce scénario, vous êtes dans l'état voix + musique, ou simplement dans l'état musique. Ainsi, lorsque vous calculez le flux spectral, vous calculez vraiment le delta entre la voix + la musique et la musique uniquement. (Bien sûr, j'aurais besoin de l'analyser beaucoup plus mais c'est comme ça que j'y pense maintenant) :-P
Spacey
1
@endolith Je viens de relire et l'OP dit qu'il n'y a que de la voix, (apparemment c'est une application simple), donc dans ce cas ce serait juste de la voix VS rien.
Spacey
2

D'après mon expérience, j'essaierais d' étudier les coefficients Mel-Frequency-Cepstrum (MFCC) . Les MFCC sont assez faciles à implémenter si vous disposez d'une FFT et sont utilisés assez fréquemment dans le traitement de la voix.

Avec les MFCC, vous devriez pouvoir distinguer les données vocales réelles du bruit.

endolith
la source
@endolith, ce lien me dépasse complètement! Connaissez-vous une implémentation open source que je peux consulter, ou une recette plus détaillée de son fonctionnement?
Mike Hogan
2

Le " flux spectral " (également appelé "différence spectrale") est une méthode courante de "détection de début". Fondamentalement, vous prenez des FFT séquentielles du signal et additionnez les amplitudes des différences des compartiments FFT d'un échantillon à l'autre. "Début" sera généralement représenté par un "saut" substantiel dans cette valeur.

Google "détection de début" pour d'autres idées.

Daniel R Hicks
la source
2

L'utilisation du flux spectral seul peut produire des faux positifs pour certains bruits ainsi que détecter une voix chantante.

Le chant implique généralement un contenu de signal contenant un pitch, vous pouvez donc utiliser un détecteur de pitch ou un estimateur (cepstrum, etc.). Vous pouvez vérifier la fraction d'énergie détectée comme étant tonique par rapport à l'énergie totale du signal, et que la hauteur estimée est dans la plage de la voix humaine. Cela réduirait le taux de faux positifs pour le bruit non accordé ainsi que les sons musicaux en dehors de la plage vocale normale.

hotpaw2
la source