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 มีพารามิเตอร์ 2-3 รายการเพื่อปรับแต่งลักษณะการทำงานและลักษณะที่ปรากฏ ดังนี้
level: ฟังก์ชันที่แสดงผลFloatซึ่งแสดงระดับอินพุตเสียง โดยมีค่าตั้งแต่0.0สำหรับความเงียบไปจนถึง1.0สำหรับเสียงที่ดังที่สุดindicatorColor: สีของแถบตัวบ่งชี้ โดยค่าเริ่มต้น ระบบจะใช้ สีหลักจากธีม Glimmer ดูGlimmerTheme.colors.primarymodifier:modifierมาตรฐานของ Compose ที่จะใช้กับตัวบ่งชี้
คอมโพเนนต์ที่เกี่ยวข้อง
หาก UI กำหนดให้ตัวบ่งชี้อยู่ในคอนเทนเนอร์พื้นหลังที่มองเห็นได้
ให้ใช้ ContainedVoiceInputIndicator ตัวเลือกนี้จะช่วยให้แถบตัวบ่งชี้โปร่งใส ทำให้คอนเทนเนอร์พื้นหลังแสดงขึ้นมาได้