Компонент VoiceInputIndicator из Jetpack Compose Glimmer отображает пользователю информацию о звуковой активности. Вы можете использовать этот компонент для приема голосового ввода или другого аудио и предоставления визуальной обратной связи, показывающей, что ваше приложение захватывает звук.
Этот компонент является исключительно визуальным элементом. Он не записывает звук и не обрабатывает данные с микрофона самостоятельно. Вместо этого он реагирует на level звука, предоставляемый вашим приложением, которое отображает визуальное представление интенсивности звука. 
Запрос на предполагаемые разрешения
Для захвата аудиоданных, используемых для управления индикатором, вашему приложению необходимо разрешение Manifest.permission.RECORD_AUDIO .
При создании дополненной реальности для очков-дисплеев убедитесь, что вы корректно запрашиваете разрешения как на устройстве, так и на очках. Используйте ProjectedPermissionsResultContract и ProjectedPermissionsRequestParams для запроса разрешений у пользователя.
Для получения дополнительной информации о запросе разрешений в проектируемых средах см. раздел «Запрос разрешений на оборудование» .
Захват и нормализация звука
Индикатор VoiceInputIndicator требует Float от 0.0f до 1.0f для визуального отображения интенсивности звука. Поскольку он работает исключительно как визуальный компонент и не захватывает звук, ваше приложение должно активно отслеживать микрофон и передавать сигнал громкости на параметр level индикатора.
Хотя существует несколько способов захвата аудиоданных, один из подходов — использование API SpeechRecognizer . При использовании SpeechRecognizer вы можете захватывать обновления громкости в реальном времени с помощью функции обратного вызова RecognitionListener.onRmsChanged , которая предоставляет уровень звука в децибелах, rmsdB .
Поскольку это исходное значение обычно находится в диапазоне от 0 до 10, необходимо нормализовать выходные данные до требуемого диапазона 0.0f до 1.0f . Нормализованный уровень можно хранить в переменной состояния для непрерывного обновления индикатора.
Вот пример использования RecognitionListener для обновления переменной состояния:
// Example state variable to hold the normalized level (0.0 to 1.0) // that the VoiceInputIndicator component expects. val audioLevel = MutableStateFlow(0f) // Initialize the Android SpeechRecognizer val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context) // Listener to capture speech events and audio level changes val listener = object : RecognitionListener { override fun onRmsChanged(rmsdB: Float) { // Normalize raw dB level to a 0.0-1.0 range. // Android SpeechRecognizer's rmsdB typically ranges from 0 to ~10. audioLevel.value = ((rmsdB - 1f) / 9f).coerceIn(0f, 1f) } // ... Implement other required RecognitionListener methods ... override fun onReadyForSpeech(params: Bundle?) {} override fun onBeginningOfSpeech() {} override fun onEndOfSpeech() {} override fun onError(error: Int) {} override fun onResults(results: Bundle?) {} override fun onPartialResults(partialResults: Bundle?) {} override fun onEvent(eventType: Int, params: Bundle?) {} override fun onBufferReceived(buffer: ByteArray?) {} } // Attach the listener to the recognizer speechRecognizer.setRecognitionListener(listener) // Create an intent to specify the recognition model and behavior val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) } // Begin listening for audio input speechRecognizer.startListening(intent)
Встроить индикатор голосового ввода
После того как ваш аудиопоток будет должным образом нормализован и представлен в качестве состояния, вы можете передать его непосредственно в VoiceInputIndicator .
@Composable fun VoiceInputExample(modifier: Modifier) { // Collect the flow as Compose State so the UI reacts to changes in real-time. val currentLevel by audioLevel.collectAsState() VoiceInputIndicator( // The VoiceInputIndicator component provides a visual "pulse" or indicator // that changes based on the 'level' lambda, which returns a Float between 0.0 and 1.0. level = { currentLevel }, modifier = modifier ) }
Параметры настройки
Индикатор VoiceInputIndicator предоставляет несколько параметров для настройки его поведения и внешнего вида:
-
level: Функция, возвращающаяFloat, представляющее уровень входного голосового сигнала, от0.0(тишина) до1.0(самый громкий звук). -
indicatorColor: Цвет индикаторных полос. По умолчанию используется основной цвет темы Glimmer; см.GlimmerTheme.colors.primary. -
modifier: СтандартныйmodifierCompose, применяемый к индикатору.
Сопутствующие компоненты
Если для вашего пользовательского интерфейса индикатор должен располагаться внутри видимого фонового контейнера, используйте ContainedVoiceInputIndicator . Этот вариант гарантирует прозрачность полос индикатора, позволяя фоновому контейнеру просвечивать.