Как использовать интенсивность микрофона в Android? (Голос) - PullRequest
2 голосов
/ 27 июня 2011

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

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

1 Ответ

2 голосов
/ 27 июня 2011

Класс 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();

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

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

После того, как вы все это заработаете, вы можете решить, что вы хотите поместить телефон в 'Speaker Phone', чтобы получить лучший эффект через микрофон:

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

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

...