Comment extraire une partie vocale d'un signal audio stéréo?


15

Je suis en train de traiter un fichier MP3 et je rencontre ce problème. Mon MP3 est encodé en stéréo. Ce que je veux faire est d'extraire la partie vocale pour un traitement ultérieur (quel que soit le mode des signaux de sortie, mono ou stéréo, les deux sont OK).

Pour autant que je sache, l'audio est codé en différentes bandes de fréquences secondaires disjointes en MP3. Je pense que je peux limiter les signaux à la gamme vocale à travers un filtre passe-haut / passe-bas avec une fréquence de coupure réglée correctement. Cependant, le résultat doit contenir des parties de signal musical pur dans ce cas. Ou après avoir googlé, je pense que je peux d'abord calculer les signaux de fond (en inversant un canal en ajoutant des signaux de l'autre canal en supposant que la partie vocale est centrée dans l'audio stéréo appelée annulation de phase). Après cette transformation, le signal est mono. Ensuite, je devrais fusionner la stéréo d'origine en mono d'où extraire le signal de fond.

Compte tenu de l'efficacité, laquelle est préférée (ou toute autre solution :)? Si le 2ème, laissez deux canaux A et B, (BA) ou (AB) seront-ils utilisés lors du calcul de l'arrière-plan? Comme pour la fusion de deux canaux, la moyenne arithmétique est-elle suffisamment précise? Ou puis-je sous-échantillonner chaque canal par un facteur de deux et entrelacer les signaux sous-échantillonnés comme résultat mono?

Merci et meilleures salutations.

Réponses:


21

Tout d'abord, la façon dont les données sont encodées dans un fichier mp3 est sans importance à moins que vous ne cherchiez à effectuer un traitement de domaine compressé (ce qui serait assez stupide). Vous pouvez donc supposer que votre algorithme fonctionnera avec des données de domaine temporel décompressées.

La somme / différence est un truc très, très basique pour la suppression vocale (pas l'extraction). Il est basé sur l'hypothèse que les voix sont mixées au centre du champ stéréo, tandis que d'autres instruments sont panoramisés latéralement. C'est rarement vrai. LR et RL sonneront de la même manière (l'oreille humaine est insensible à un déphasage global) et vous donnera un mixage mono sans les instruments mixés au centre. Le problème est, une fois que vous aurez récupéré l'arrière-plan, qu'en ferez-vous? Essayez de le supprimer du signal central (moyen)? Cela ne fonctionnera pas, vous ferez (L + R) / 2 - (L - R), ce n'est pas très intéressant ... Vous pouvez essayer n'importe quelle combinaison linéaire de celles-ci (moyenne et "centre supprimé"), rien en sortira!

Concernant les approches de filtrage: le f0 de la voix dépasse rarement 1000 Hz mais ses harmoniques peuvent dépasser cela. La suppression de la fréquence la plus élevée rendra les consonnes (en particulier sss, chhh) désagréables. Certaines voix masculines descendent en dessous de 100 Hz. Vous pouvez couper en toute sécurité tout ce qui est inférieur à 50 ou 60 Hz (basse, kick), bien que

Quelques développements récents dans la séparation vocale méritent d'être explorés:

  • Fond de Jean Louis Durrieu NMF + peigne harmonique> modèle de filtre . Code Python ici .
  • L' approche d'extraction de fond de Rafii . Simple à coder et fonctionne bien sur la musique produite par ordinateur avec des motifs très répétitifs comme l'électro, le hip-hop ...
  • L'approche de Hsu est basée sur la détection, le suivi et le masquage de f0. "Un algorithme tandem pour l'extraction de la hauteur de chant et la séparation de la voix de l'accompagnement musical" (impossible de trouver le PDF accessible).

4

Merci pour la référence! Vous avez oublié de mentionner votre travail sur l' amélioration de la batterie , qui peut également être intéressante pour l'application Summer_More_More_Tea. Eh bien, tout dépend vraiment de ce que vous voulez en faire. Avez-vous une "application finale" en tête?

Je suis entièrement d'accord avec les déclarations ci-dessus de pichenettes. Pour être complet, je dois cependant dire que l'amélioration vocale que vous avez mentionnée a également été utilisée dans certaines œuvres de Matti Ryynänen, sur la génération de pistes de karaoké, pour améliorer les résultats.

Pour répondre à vos questions:

Compte tenu de l'efficacité, laquelle est préférée (ou toute autre solution :)?

Comme le disent les pichenettes, ni l'un ni l'autre ne semble répondre à votre besoin: le filtrage passe-bas / passe-haut est voué à l'échec en raison de la structure harmonique de la voix humaine (et plus généralement de tout son "intéressant" - c'est-à-dire au-delà des sinusoïdes ... ).

Si le 2ème, laissez deux canaux A et B, (BA) ou (AB) seront-ils utilisés lors du calcul de l'arrière-plan? Comme pour la fusion de deux canaux, la moyenne arithmétique est-elle suffisamment précise?

Encore une fois, la deuxième méthode que vous mentionnez ne fonctionnera pas car vous ne pouvez supprimer que le signal qui est au centre, pas le récupérer. En d'autres termes, même les voix sont au "centre", il n'y a pas de calcul simple pour obtenir un signal uniquement vocal.

Ou puis-je sous-échantillonner chaque canal par un facteur de deux et entrelacer les signaux sous-échantillonnés comme résultat mono?

euh ... la moyenne des canaux pour obtenir un signal mono-canal, comme suggéré ci-dessus, a du sens et ne cassera pas les caractéristiques spectrales de votre signal (en supposant que le signal stéréo ne soit pas dégénéré). Vous obtenez donc un signal mono dans lequel vous avez, fondamentalement, le même contenu musical qu'auparavant.

Un sous-échantillonnage correct de chaque canal signifie que vous appliquez d'abord un filtre passe-bas (avec une fréquence de coupure de sampling_rate / 4 dans votre cas), puis vous pouvez prendre en toute sécurité tous les 2 échantillons. Il n'y a cependant pas grand-chose à dire sur l'entrelacement des canaux ainsi sous-échantillonnés: dans la plupart des cas généraux, cela rompt les caractéristiques spectrales de votre signal. Vous ne voulez probablement pas cela.

En effet, l'opération de filtrage passe-bas suivie de la mise à 0 tous les 2 échantillons, et le maintien de ces 0 conduit, dans le domaine de Fourier, à "mettre en miroir" les composantes basse fréquence qui ont été conservées sur celles haute fréquence. Rappelez-vous que vous apprenez les cours de traitement du signal sur la théorie de l'échantillonnage: la multiplication par une séquence d'impulsions (ou diracs) entraîne une convolution avec une autre séquence de diracs dans le domaine de Fourier, c'est-à-dire que dans ce cas, le spectre de fréquence du signal est répété (périodisé) le long de l'axe des fréquences, avec une période égale à la fréquence d'échantillonnage.

Normalement, lors du sous-échantillonnage, vous supprimez les 0 (car vous supposez une nouvelle fréquence d'échantillonnage). Mais ici, les conserver entraîne des composants haute fréquence supplémentaires très ennuyeux. L'entrelacement de ces signaux ne va pas corriger cela.

Eh bien, dans l'ensemble, la réponse courte: ne faites pas cela . :-)

Enfin, je pourrais également vous suggérer d'utiliser l'interface graphique que j'ai développée pour la conférence LVAICA 2012: il y a un dépôt git pour cela. Je suis toujours en train de le déboguer et de l'améliorer, donc les commentaires sont les bienvenus: D

J'espère que cela pourra aider!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.