VoiceInputIndicator는 사용자에게 소리 활동을 표시하는 Jetpack Compose Glimmer 구성요소입니다. 이 구성요소를 사용하여 음성 입력 또는 기타 오디오를 수락하고 앱이 오디오를 캡처하고 있음을 보여주는 시각적 의견을 제공할 수 있습니다.
이 구성요소는 엄격하게 시각적 요소입니다. 오디오를 녹음하거나 마이크 데이터를 자체적으로 처리하지 않습니다. 대신 오디오 강도를 시각적으로 나타내는 앱에서 제공하는 오디오 level에 응답합니다.
예상 권한 요청
표시기를 구동하기 위해 오디오 데이터를 캡처하려면 앱에
Manifest.permission.RECORD_AUDIO 권한이 필요합니다.
디스플레이 글라스를 위한 증강 환경을 빌드할 때는 기기와 글라스 모두에서 권한을 올바르게 요청해야 합니다.
ProjectedPermissionsResultContract 및
ProjectedPermissionsRequestParams를 사용하여 사용자에게 메시지를 표시합니다.
예상 환경에서 권한을 요청하는 방법에 관한 자세한 내용은 하드웨어 권한 요청을 참고하세요.
오디오 캡처 및 정규화
VoiceInputIndicator는 오디오 강도를 시각적으로 반영하기 위해 Float와 0.0f 사이의 1.0f가 필요합니다. 순전히 시각적 구성요소로 작동하고 오디오를 캡처하지 않으므로 앱은 마이크를 적극적으로 모니터링하고 볼륨을 표시기의 level 매개변수로 스트리밍해야 합니다.
오디오 데이터를 캡처하는 방법은 여러 가지가 있지만 한 가지 방법은
SpeechRecognizer API를 사용하는 것입니다. SpeechRecognizer를 사용하면 데시벨 단위의 오디오
수준인 rmsdB를 제공하는
RecognitionListener.onRmsChanged 콜백을 사용하여 실시간 볼륨 업데이트를 캡처할 수 있습니다.
이 원시 값은 일반적으로 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: 표시기에 적용할 표준 Composemodifier입니다.
관련 구성요소
UI에 표시기가 표시되는 배경 컨테이너 내에 있어야 하는 경우
ContainedVoiceInputIndicator를 사용합니다. 이 대안은 표시기 막대가 투명하여 배경 컨테이너가 표시되도록 합니다.