Как использовать интенсивность микрофона в Android? (голос)

Мне нужно внедрить в свое приложение функцию, которая работает или должна считывать интенсивность голоса через микрофон. Но я не знаю, как это сделать, может кто-нибудь помочь мне, пожалуйста? Просто мне нужно читать интенсивность голоса, а не узнавать ни слова.

Я понимаю, что мне нужно использовать класс AudioRecord, но мне все равно какие шаги я должен записать в свой код, потому что я не знаю, действительно ли необходимо сохранить немного голоса на SD-карту, а затем преобразовать его в PCM и прочитать максимум этого сигнала.


person Julio Del Valle    schedule 27.06.2011    source источник
comment
Под интенсивностью вы имеете в виду громкость (амплитуду) или частоту или какую-то комбинацию?   -  person mjr    schedule 27.06.2011


Ответы (1)


Класс AudioRecord позволит вам записывать в буфер. Затем вы можете выбрать обработку буфера или сохранить его на SD-карту, в зависимости от ваших потребностей. То, что вы хотите сделать, полностью зависит от вашего приложения. Нужны ли вам данные после их обработки? Или вам нужен только обработанный результат? Вы собираетесь воспроизводить записи?

Ниже приведен упрощенный пример использования класса AudioRecord:

AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);

recorder.startRecording();

short buf[] = new short[buffersize];
int n = 0;
while(<some condition>) {
   n = recorder.read(buf, 0, bufferSize);
   process(buf);
}

recorder.stop();
recorder.release();

Вы, очевидно, захотите поместить приведенный выше код в поток за пределами основного потока пользовательского интерфейса.

Вы должны убедиться, что все, что вы делаете в процессе, происходит достаточно быстро, чтобы вы могли вернуться к чтению данных до того, как буфер заполнится, иначе вы потеряете данные. Частота дискретизации и размер буфера будут зависеть от того, как вы обрабатываете данные и каковы ваши требования к задержке.

После того, как вы все это заработаете, вы можете решить, что хотите перевести телефон в «громкую связь», чтобы получить лучшее усиление через микрофон:

AudioManager amAudioManager;  
amAudioManager =      (AudioManager)getSystemService(Context.AUDIO_SERVICE);
amAudioManager.setMode(AudioManager.MODE_IN_CALL);
amAudioManager.setSpeakerphoneOn(true);

Да, вы должны перевести телефон в состояние IN_CALL, чтобы включить громкую связь. Да, некоторые телефоны видимо отключают возможность записи при IN_CALL.

person mjr    schedule 27.06.2011