web-dev-qa-db-fra.com

Détecter la voix humaine de l'entrée de fichier audio

J'essaie d'implémenter une fonctionnalité d'enregistrement automatique de la voix, similaire à l'application Talking Tom. J'utilise le code suivant pour lire les entrées de l'enregistreur audio et analyser le tampon:

 float totalAbsValue = 0.0f;
 short sample = 0;

 numberOfReadBytes = audioRecorder.read( audioBuffer, 0, bufferSizeInBytes);

 // Analyze Sound.
 for( int i=0; i<bufferSizeInBytes; i+=2 )
 {
     sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 );
     totalAbsValue += Math.abs( sample ) / (numberOfReadBytes/2);
 }

 // Analyze temp buffer.
 tempFloatBuffer[tempIndex%3] = totalAbsValue;
 float temp = 0.0f; 

 for( int i=0; i<3; ++i )
 temp += tempFloatBuffer[i];

Maintenant, je suis capable de détecter les entrées vocales provenant de l'enregistreur audio et d'analyser le tampon audio. 

La mémoire tampon est convertie en une valeur flottante et si elle augmente d'une certaine valeur, on suppose qu'il y a du son en arrière-plan et l'enregistrement est démarré. Mais le problème est que l'application commence à enregistrer tous les bruits de fond, y compris les sons de ventilateur/conduit.

Quelqu'un peut-il m'aider à analyser le tampon pour détecter uniquement la voix humaine? Ou existe-t-il d'autres moyens de détecter la voix humaine à partir de l'entrée de l'enregistreur audio?

Merci d'avance,

28
Timson

La détection vocale n'est pas si simple. Il existe plusieurs algorithmes, certains d'entre eux sont publiés, par exemple GSM VAD . Plusieurs bibliothèques VAD open source sont disponibles, certaines d'entre elles sont discutées ici

9
msh

Si vous voulez avoir un enregistrement vierge, vous pouvez

  1. Pour filtrer le bruit de la voix, vous pouvez utiliserFFTet appliquer des filtres tels que les filtres passe-bas, passe-haut et passe-bande Filtrage avec FFT et Filtres

2.Après la filtration, le bruit serait diminué et vous pouvez utiliser les API de reconnaissance vocale

API's

Plus le nombre de filtres est élevé, moins il y a de bruit. Plus de reconnaissance, mais méfiez-vous du filtrage, car il peut également supprimer la voix en même temps que le bruit.

En savoir plus sur FFt

Transformation rapide de Fourier de la voix humaine

J'espère que cela t'aides :)

4
Albert Laure

Pour détecter la voix, essayez l’algorithme ftt.

Pour le bruit, essayez la bibliothèque speex.

3
afpro

Que recherchez vous exactement? Voulez-vous simplement filtrer le discours humain dans l'audio ou voulez-vous réellement savoir ce que la personne a dit?

Le filtrage de la parole humaine est effectué par presque tous les smartphones en enregistrant le bruit de fond avec un second microphone à l'arrière de l'appareil et en soustrayant les deux signaux. Mais pour être honnête, je n'ai jamais vu d'API Android, car vous pouvez accéder directement aux deux signaux.

Si vous souhaitez convertir parole en texte, jetez un œil à Sphinx4 et Praat. Les deux font ce travail mais encore une fois, je n'ai pas vu d'implémentation pour Android. Sphinx4 prétend être entièrement écrit en Java, il devrait donc être possible de l'intégrer dans une application Android.

2
jboi

La manière de traiter l'entrée est d'utiliser une bibliothèque spécialisée qui supprime le bruit.

Par exemple, http://audacity.sourceforge.net , supprime le bruit.

Tant que vous avez caractérisé les principaux types de bruit, il ne vous reste que la parole.

Il serait utile de collecter des données d'échantillonnage avant la capture de l'utilisateur, et après que l'utilisateur ait terminé la capture, car cela fournirait des échantillons de bruit à la fois dans l'environnement. Ceci est utile si chaque utilisateur est confronté à des défis uniques liés au bruit de fond.

2
Faisal Memon

Avez-vous envisagé d'utiliser l'API de reconnaissance vocale de Microsoft? Vous pouvez utiliser un énoncé de touche vocale pour commencer l’enregistrement, par exemple, comment on dit «ordinateur» avant de demander à l’ordinateur quelque chose dans Star Trek. Utilisez ISpRecognizer :: CreateRecoContext pour charger votre grammaire de reconnaissance et démarrer la reconnaissance. Puis implémentez une vérification avec ISpPhrase pour voir si vous devez commencer à enregistrer ou non. 

1
Okuma.Scott

J'ai essayé de résoudre un problème similaire sous Windows. Une chose que j’ai apprise rapidement: une simple analyse de fréquence avec une transformée de Fourier rapide ne suffit pas. De nombreux bruits frappent les fréquences humaines - des simples pressions sur le microphone aux applaudissements des mains. Même un certain niveau de filtrage sophistiqué ne le fera pas. J'ai trouvé le moyen le plus simple consiste à utiliser le bruit d'une API de cloud et à lui demander de transcrire le discours. Si l'API cloud peut transcrire une chaîne de longueur raisonnable, je peux continuer l'enregistrement, sinon arrêter l'enregistrement. Cela nécessite que vous échantillonniez du bruit et l'envoyiez à un fournisseur de cloud.

1
HelloNoggy

Dans le cas tout à fait général, il s'agit d'un problème non résolu. Dans le sens pratique ...

La première étape consiste à obtenir un enregistrement aussi silencieux que possible. Comme d'autres l'ont noté, cela commence par un microphone directionnel aussi concentré que possible sur le son que vous souhaitez conserver.

La deuxième étape est le filtrage. Comme indiqué précédemment, la compagnie de téléphone a beaucoup travaillé sur les gammes de fréquences dont les humains ont réellement besoin pour la compréhension de la parole. Filtrer les fréquences en dehors de cette plage donnera à la voix un son ... bon, un téléphone ... mais éliminera davantage de bruit de fond.

Si vous voulez aller plus loin, les choses peuvent devenir vraiment compliquées. Il existe certains algorithmes qui, si vous pouvez leur montrer un échantillon de ce que vous considérez comme du bruit sur cet enregistrement particulier, l’analyseront et essaieront de le soustraire sans endommager le son que vous souhaitez conserver trop. Ce n'est pas une simple programmation; si j'étais vous, je penserais sérieusement à l'acheter à quelqu'un qui l'a déjà bien compris plutôt que d'essayer de le réinventer/le réimplémenter. Je ne sais pas si l'un d'entre eux est disponible pour Android ou si le système Android typique dispose de suffisamment de puissance de calcul pour les exécuter en temps réel. (J'ai utilisé SoundSoap en studio pour supprimer les bruits de climatisation, et cela fonctionne très bien.)

En fait, ma propre inclincation serait de simplifier le problème pour le résoudre: utilisez le micro le plus directionnel et le plus proche possible, laissez Android enregistrer ... mais faites ensuite le traitement du signal pour le nettoyer plus tard, en utilisant -les outils d'étagère. Mais j'avoue que je suis partial parce que j'ai déjà investi dans ce dernier.

1
Xaknp

La plupart d'entre eux ont mal compris la question et leurs réponses résolvent des problèmes différents des vôtres.

Vous devriez analyser le son dans votre tampon à la recherche de fréquences dans la plage voix humaine. Dès que vous les détectez, cela signifie que quelqu'un a commencé à parler et que vous pouvez commencer à enregistrer (n'oubliez pas d'inclure le tampon aussi car il contient la première partie du discours).

Rechercher des routines qui impriment la liste des fréquences dans un flux audio brut

0
Marco Marsala