Как настроить чувствительность микрофона при записи звука в android

8

Я работаю над приложением для записи голоса. В нем у меня есть панель поиска для изменения усиления входящего голоса. Я не мог найти способ отрегулировать усиление входящего голоса.

Я использую AudioRecordкласс для записи голоса.

 recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, bufferSize);

    recorder.startRecording();

Я видел приложение в магазине Google Play, использующее эту функцию.

17

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

Предположим, вы используете read (short [] audioData, int offsetInShorts, int sizeInShorts) для чтения потока. Итак, вам нужно сделать что-то вроде этого:

float gain = getGain(); // taken from the UI control, perhaps in range from 0.0 to 2.0
int numRead = read(audioData, 0, SIZE);
if (numRead > 0) {
    for (int i = 0; i < numRead; ++i) {
        audioData[i] = (short)Math.min((int)(audioData[i] * gain), (int)Short.MAX_VALUE);
    }
}

Math.minиспользуется для предотвращения переполнения, если gainбольше 1.

3
  • Спасибо за помощь. Я внес некоторые изменения в ваш код, и теперь моя проблема решена.
    user3472378
    29 авг.
  • 1
    вам также необходимо вызвать Math.max (intValue, Short.MIN_VALUE), поскольку Java short подписан, см. мой ответ ниже.
    Dmide
    10 июл.
  • Только этот ответ работает после большого количества поисков в сети. Мне пришлось установить gainболее 7, чтобы увидеть отличный эффект! Спасибо! 15 дек '19 в 10:05
3

Динамическая чувствительность микрофона - это не то, на что способно оборудование или операционная система, поскольку для этого требуется анализ записанного звука. Вам следует реализовать собственный алгоритм для анализа записанного звука и самостоятельно регулировать (усиливать или уменьшать) уровень звука.

Вы можете начать с анализа последних нескольких секунд и найти множитель, который «уравновесит» среднюю амплитуду. Множитель должен быть обратно пропорционален средней амплитуде, чтобы сбалансировать его.

PS: Если вы все еще хотите это сделать, уровни микрофона доступны, когда у вас есть root-доступ, но я все еще не уверен - и не думаю, что это возможно - если вы можете изменить настройки во время записи. Подсказка: файл "/ system / etc / snd_soc_msm".

0

Решение OP.

Я сделал это, используя

final int USHORT_MASK = (1 << 16) - 1;

final ByteBuffer buf = ByteBuffer.wrap(data).order(
                        ByteOrder.LITTLE_ENDIAN);
final ByteBuffer newBuf = ByteBuffer.allocate(
                        data.length).order(ByteOrder.LITTLE_ENDIAN);

int sample;
        while (buf.hasRemaining()) {
                sample = (int) buf.getShort() & USHORT_MASK;
                sample *= db_value_global;
                        newBuf.putShort((short) (sample & USHORT_MASK));
                }

                data = newBuf.array();

                os.write(data);
-1

Это рабочая реализация, основанная на ByteBuffer16-битном аудио. Важно зажать увеличенное значение с обеих сторон, так как короткий подписан. Также важно установить собственный порядок байтов, ByteBufferпоскольку audioRecord.read()возвращает исходные байты с порядком байтов.

Вы также можете выполнить audioRecord.read()код и следовать ему в цикле, вызывая его data.clear()после каждой итерации.

    double gain = 2.0;

    ByteBuffer data = ByteBuffer.allocateDirect(SAMPLES_PER_FRAME).order(ByteOrder.nativeOrder());

    int audioInputLengthBytes = audioRecord.read(data, SAMPLES_PER_FRAME);
    ShortBuffer shortBuffer = data.asShortBuffer();
    for (int i = 0; i < audioInputLengthBytes / 2; i++) { // /2 because we need the length in shorts
        short s = shortBuffer.get(i);
        int increased = (int) (s * gain);
        s = (short) Math.min(Math.max(increased, Short.MIN_VALUE), Short.MAX_VALUE);
        shortBuffer.put(i, s);
    }
1
  • так что это вообще не сработало ... статический шум вокруг
    TacB0sS
    4 фев '18 в 20:45