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?
audio
signal-detection
Mike Hogan
la source
la source
Réponses:
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)
la source
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.
la source
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.
la source
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.
la source
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.
la source