2010-06-09 4 views
4

Je travaille sur une application qui doit effectuer des algorithmes de reconnaissance sur l'audio PCM brut capturé à partir du microphone. Sur tous les appareils Android que j'ai testés, les données PCM sont utilisables (c'est-à-dire des données audio brutes). Ce n'est pas le cas pour le nouveau Sprint EVO. Le Sprint EVO a AGC (Auto Gain Control) sur le micro, ce qui détruit les données de sorte que nos algorithmes de reconnaissance ne fonctionnent plus. Je crois que c'est une fonctionnalité que HTC a ajouté au système d'exploitation de cet appareil (et éventuellement de futurs appareils.) J'ai testé notre application sur quelques autres appareils utilisant la même version de système d'exploitation (2.1) et ces autres appareils se comportent normalement.Comment désactiver AGC sur le HTC EVO (Supersonic)?

Malheureusement, HTC n'a pas encore publié le code utilisé sur cet appareil. Je pense que je pourrais avoir à utiliser JNI afin de contourner cela pour cet appareil spécifique, et je suis prêt à le faire, mais sans accès à la source HTC, je ne sais pas par où commencer.

Il n'y a aucun moyen d'inverser les effets de AGC, donc je suis coincé à essayer de contourner ce problème.

Des informations plus spécifiques:

J'utilise AudioRecorder afin d'obtenir l'accès aux données brutes PCM. J'ai essayé quelques programmes qui utilisent MediaRecorder pour enregistrer les données AMR et ces enregistrements présentent également les mêmes propriétés AGC. Une chose que je n'ai pas encore essayé, est d'écrire mes propres routines pour utiliser MediaRecorder et utiliser setAudioSource (AudioSource.VOICE_RECOGNITION). La seule documentation que je puisse trouver sur ce drapeau provient de la référence Android, qui indique simplement "La source audio du microphone accordée pour la reconnaissance vocale si disponible, se comporte comme DEFAULT sinon." C'est peut-être ce dont j'ai besoin, mais cela nécessiterait l'étape supplémentaire de décoder les données AMR afin d'obtenir les données PCM (ce que je ferai si je le dois.)

Si quelqu'un sait quelque chose à propos de cette nouvelle fonctionnalité ", Toute information serait grandement appréciée. Plus précisément, ma vie serait beaucoup mieux si j'avais les réponses à l'une des questions suivantes:

  1. Cette nouvelle fonctionnalité est-elle spécifique à HTC?
  2. Quand HTC publiera-t-il sa base de code pour l'EVO/Supersonic?
  3. Est-ce que quelqu'un d'autre a rencontré ce problème et a trouvé un moyen de contourner le problème?
  4. Est-ce que AudioSource.VOICE_RECOGNITION empêche réellement AGC?
  5. L'existence de AudioSource.VOICE_RECOGNITION indique-t-elle que cela devrait être plus commun dans les dispositifs futurs et que ce drapeau est une disposition pour le contourner?

D'autres indices, astuces, conseils seraient grandement appréciés.

Répondre

6

Comme il se trouve, je trouve la solution tout en naviguant sur le dépôt git Android:

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...); 

Pour les appareils fonctionnant sous OS 2.1 et au-dessus, ce qui vous permet de recevoir un flux audio qui n'est pas affecté par AGC et est toujours un flux de données PCM 16 bits de haute qualité.

Je cible mon application à partir de la version 1.5, et cet indicateur VOICE_RECOGNITION n'est pas supporté jusqu'au niveau API 7 (OS 2.1). Cependant, puisque l'EVO exécute v2.1 et je suis relativement confiant que ce ne sera pas un problème pour tout appareil avant OS 2.1, une vérification de version simple fera l'affaire pour limiter la solution aux seuls appareils qui ont besoin de/support.

0

Malheureusement,

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...); 

est pas une solution générale. Certains fabricants appliquent AGC même si MediaRecorder.AudioSource.VOICE_RECOGNITION est choisi. Ils ignorent simplement la "définition de compatibilité" de Google. Voir How avoid automatic gain control with AudioRecord?

Questions connexes