filtre de bruit de parole humaine

17

Quelqu'un connaît-il un filtre pour atténuer la non-parole? J'écris un logiciel de reconnaissance vocale et je voudrais filtrer tout sauf la parole humaine. Cela inclut le bruit de fond, le bruit produit par un microphone de merde ou même la musique de fond. J'ai déjà mis en œuvre un filtre de premier ordre qui compense le décroissement de 6 dB du spectre de puissance, mais j'entends toujours du bruit (bien que le discours sonne beaucoup plus clair). J'ai pensé à utiliser un filtre passe-bas, mais je suis incertain de le faire pour deux raisons:

  1. Je ne sais pas si un pré-filtre passe-bas va interférer avec le reste du traitement de la parole. Même si l'oreille humaine ne peut détecter que des sons inférieurs à 20 kHz, je ne veux pas risquer d'éliminer les harmoniques d'ordre supérieur qui pourraient être nécessaires pour traiter la parole (même si je ne sais pas si c'est le cas ou non. Mais Je ne veux prendre aucun risque).

  2. Je comprends que l'excitation de certaines consonnes (telles que f, h et s) est presque entièrement un bruit blanc. Je ne veux pas implémenter un filtre de bruit qui éliminera le bon bruit, pour ainsi dire.

Idéalement, je souhaiterais me retrouver avec seulement le discours de la personne qui parle dans le microphone. Si vous avez des idées ou s'il me manque quelque chose, faites-le moi savoir. Très appréciée!

Zetta Suro
la source
Je suppose. Je vais le laisser ouvert, tout simplement parce que j'ai vu des questions similaires (filtres et traitement acoustique) ici auxquelles on a bien répondu.
Zetta Suro
Tels que celui-ci: stackoverflow.com/questions/6452926/…
Zetta Suro
Règle générale: si vous voulez savoir comment implémenter un algorithme DSP donné, par exemple dans un langage particulier ou sur une plate-forme particulière, alors c'est un sujet pour SO. Si c'est une question sur les algorithmes / techniques DSP sans angle de programmation spécifique, alors il appartient presque certainement à DSP.SE (où il aura également tendance à obtenir des réponses de meilleure qualité).
Paul R
Je t'ai eu. L'avez-vous migré ici? Si oui merci. Je ne pouvais pas comprendre comment le migrer, alors j'ai fini par le redemander ici.
Zetta Suro
Pas moi - je l'ai signalé et demandé si un modérateur pouvait le déplacer, donc je suppose que l'un des TPTB l'a fait (merci à qui que ce soit!).
Paul R

Réponses:

8

Un canal de communication vocale tel qu'il est utilisé en téléphonie a généralement une réponse en fréquence de 300 Hz à 3 kHz. Bien que cela rejette beaucoup d'énergie dans la parole normale, l'intelligibilité est encore assez bonne - le principal problème semble être que certaines consonnes plosives , par exemple "p" et "t", peuvent être un peu difficiles à discriminer sans les composantes de fréquence plus élevées .

Vous recherchez donc probablement un «point idéal» quelque part entre l'utilisation de la bande passante complète de 20 Hz - 20 kHz que l'on trouve généralement dans l'audio grand public et le filtrage le plus agressif utilisé pour les communications vocales (voir ci-dessus). Je suggère de commencer par un filtre passe-bande de 50 Hz à 8 kHz, par exemple. Cela n'améliorera probablement le SNR que de quelques dB au mieux, mais cela peut aider, en particulier si vous avez beaucoup de bruit de fond à haute fréquence.

Paul R
la source
Merci! Un de mes amis a en fait suggéré le canal vocal, mais je soupçonnais que cela atténuerait trop d'énergie dans certaines consonnes. Je vais essayer de 50 Hz à 8 kHz et voir comment ça marche!
Zetta Suro
2
Choisir cette réponse simplement parce que c'est la solution "rapide" que je cherchais. Le reste des réponses nécessitera beaucoup plus de recherches que j'examinerai certainement, car elles seront utiles à long terme, mais c'est une solution de filtre simple que je cherchais à l'origine.
Zetta Suro
5

L'utilisation d'un filtre passe-bande correspondant à la bande passante de la parole vous aidera.

Si vous avez plusieurs microphones (comme c'est le cas actuellement sur les téléphones portables), il existe une multitude de méthodes de type ICA qui peuvent en profiter - mais votre question me laisse entendre que vous n'avez qu'une seule entrée.

Ce que vous voulez faire, c'est une "séparation de source à un microphone" (nom tiré du document révolutionnaire de Roweis), également appelé "capteur unique". Attention: c'est loin d'être un problème résolu, et toutes les recherches dans ce domaine sont très récentes, aucun algorithme ou approche n'étant un "gagnant clair" (contrairement aux modèles de mélange gaussiens + FST pour la reconnaissance vocale).

Un bon cadre pour le faire est le filtrage de Wiener. Voir Benaroya et al. "Séparation de source de capteur unique basée sur le filtrage de Wiener et STFT à fenêtres multiples" (lisez les sections 1 et 2, ne vous embêtez pas avec la solution multirésolution, sauf si vous en avez vraiment besoin). En bref, vous calculez le STFT de votre signal, et pour chaque trame STFT, vous essayez d'obtenir des estimations du spectre vocal et du spectre de bruit, et vous utilisez le filtrage de Wiener pour récupérer la meilleure estimation du spectre vocal à partir de cela (ce s'apparente à un "masquage doux" du spectre).

Votre problème est maintenant le suivant: étant donné une trame STFT, estimez la parole et la composante de bruit à partir de celle-ci. L'approche la plus simple décrite dans l'article de Benaroya passe par la quantification vectorielle - prenez plusieurs heures de parole par de nombreux locuteurs, calculez le STFT, exécutez LBG dessus pour trouver un livre de codes de 512 ou 1024 trames vocales typiques; faites la même chose pour le bruit. Maintenant, étant donné une trame de votre signal d'entrée, projetez-le de manière non négative (une procédure de mise à jour du gradient multiplicatif est décrite dans l'article) sur les bases de la parole et du bruit, et vous obtenez vos estimations de la parole et du bruit. Si vous ne voulez pas vous occuper de la projection non négative, utilisez simplement le voisin le plus proche. C'est vraiment la chose la plus simple qui pourrait éventuellement fonctionner dans le département "séparation de source à capteur unique".

Notez qu'un système de reconnaissance vocale pourrait en effet fournir une entrée pour un système de séparation. Faites un premier décodage à l'aide de votre système de reconnaissance vocale. Pour chaque image, prenez le vecteur MFCC moyen du gaussien qui a obtenu le meilleur score. Inversez cela dans un spectre. Boom, vous avez un masque vous donnant l'emplacement spectral le plus probable des bits de type vocal, et vous pouvez l'utiliser comme entrée pour le filtrage de Wiener. Cela ressemble un peu à un geste de la main, mais le géiste est que pour séparer une source, vous avez besoin d'un bon modèle pour elle, et un système de reconnaissance vocale repris à l'envers est un enfer d'un bon modèle génératif pour les signaux vocaux.

pichenettes
la source
1

Vous devriez probablement envisager de faire une analyse indépendante des composants (ICA) car votre problème est très similaire au problème des «cocktails» qui est souvent utilisé pour décrire l'ICA. En bref, l'ICA trouve les composants de votre signal qui sont indépendants les uns des autres. Cela suppose que les autres bruits de l'environnement (lave-vaisselle, bruit blanc, vrombissement du ventilateur) seront indépendants de la source du signal de la voix et peuvent être séparés.

L'ICA est similaire à l'ACP (analyse en composantes principales) mais au lieu de maximiser la variance sur les axes principaux, il maximise l'indépendance. Il existe de nombreuses implémentations d'ICA qui devraient se connecter à l'environnement de codage que vous utilisez.

gallamine
la source
4
ICA nécessite autant de signaux d'entrée qu'il y a de sources à séparer. Dans le débruitage de la parole, il ne nous reste qu'un seul signal et l'ICA n'est donc d'aucune utilité.
pichenettes