Какой источник звука использовать: MIC, VOICE_RECOGNITION, VOICE_COMMUNICATION и другие
Короткий ответ: для обычной записи голоса — VOICE_RECOGNITION (лучше шумоподавление), для VoIP — VOICE_COMMUNICATION (AEC/NS и низкая задержка), для съёмки видео — CAMCORDER, для простых диктофонов — MIC; VOICE_CALL доступен только системным приложениям.
Краткий обзор основных AudioSource
- MIC — стандартный микрофон, совместим, но чувствителен к фону. Подходит для диктофонов и подкастов в тихой обстановке.
- VOICE_RECOGNITION — микрофон с преднастроенным шумоподавлением и эхоподавлением, оптимизирован для распознавания речи и ассистентов.
- VOICE_COMMUNICATION — для VoIP: минимальная задержка, автоматически включает AEC/NS на поддерживаемых устройствах.
- CAMCORDER — сбалансирован для записи аудио вместе с видео, снижает рассинхрон.
- VOICE_CALL — доступен только для системных/предустановленных приложений; большинству сторонних программ недоступен из-за ограничений безопасности.
- DEFAULT, REMOTE_SUBMIX, FM_RADIO и т.п. — либо общие, либо устаревшие; избегайте REMOTE_SUBMIX и FM_RADIO в обычных приложениях.
Тестируйте на реальных устройствах и с разными микрофонами (встроенный, гарнитура, USB). Эмулятор не отражает реальную акустику.
Как выбрать источник — практическая инструкция
- Определите задачу: распознавание речи, звонки, запись видео или простая запись.
- Начните с рекомендуемого источника:
- Распознавание и голосовые ассистенты — VOICE_RECOGNITION.
- VoIP/конференции — VOICE_COMMUNICATION.
- Синхронная запись с камерой — CAMCORDER.
- Универсальная простая запись — MIC.
- Проверьте поддержку на устройстве:
- Используйте AudioManager.getDevices() и AudioRecord.getActiveRecordingConfigurations().
- Обратите внимание на Android-версию: VOICE_CALL и некоторые низкоуровневые источники ограничены с Android 9/10+.
- Настройка параметров:
- Частота 16 kHz достаточна для речи; для музыки используйте 44.1/48 kHz.
- Формат PCM_16BIT и CHANNEL_IN_MONO для речи — экономия батареи и привычный стандарт.
- Обработка:
- Включайте AcousticEchoCanceler и NoiseSuppressor, если они доступны на устройстве.
- Для фоновых записей используйте foreground service (ограничения Android 10+).
VOICE_CALL и REMOTE_SUBMIX часто недоступны для сторонних приложений. Не полагайтесь на них — это приведёт к ошибкам и нулевому звуку на большинстве устройств.
Примеры кода (Kotlin)
Простой AudioRecord для распознавания речи:
val audioSource = MediaRecorder.AudioSource.VOICE_RECOGNITION
val sampleRate = 16000
val channelConfig = AudioFormat.CHANNEL_IN_MONO
val audioFormat = AudioFormat.ENCODING_PCM_16BIT
val bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat)
val recorder = AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize)
Не забудьте REQUEST_PERMISSION RECORD_AUDIO и проверку PackageManager.PERMISSION_GRANTED перед стартом.
Частые ошибки
- Выбор VOICE_CALL для стороннего приложения — запись не начнётся на большинстве устройств.
- Использование высокой частоты дискретизации без необходимости — тратит батарею и увеличивает задержку.
- Тестирование только в эмуляторе — реальная акустика и доступные эффекты могут отличаться.
- Отсутствие проверки наличия AcousticEchoCanceler/NoiseSuppressor — попытка включить их без проверки вызовет ошибки.
FAQ
-
Нужно ли всегда включать шумоподавление?
Да, если задача — распознавание речи или звонки; но проверяйте доступность эффекта на устройстве перед включением. -
Какой AudioSource выбрать для подкаста?
MIC или EXTERNAL_MIC (если есть внешнее оборудование). Для лучшего качества применяйте внешние микрофоны + обработку на стороне сервера/редактора. -
Что делать, если запись идёт в тишине на некоторых устройствах?
Проверьте разрешения, AudioSource (VOICE_CALL/REMOTE_SUBMIX часто недоступны), и используйте AudioManager для определения активных устройств и ролей аудио.
Выбирайте источник под конкретную задачу, тестируйте на целевых устройствах и комбинируйте аппаратные эффекты и программную обработку для надёжного качества записи.