ตัวบ่งชี้การป้อนข้อมูลด้วยเสียงใน Jetpack Compose Glimmer

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทต่างๆ
แว่นตาแสดงผล

VoiceInputIndicator เป็นคอมโพเนนต์ Jetpack Compose Glimmer ที่ แสดงกิจกรรมเสียงแก่ผู้ใช้ คุณสามารถใช้คอมโพเนนต์นี้เพื่อรับอินพุตเสียงหรือเสียงอื่นๆ และแสดงความคิดเห็นด้วยภาพเพื่อแสดงว่าแอปกำลังบันทึกเสียง

คอมโพเนนต์นี้เป็นองค์ประกอบภาพอย่างเคร่งครัด โดยจะไม่บันทึกเสียงหรือประมวลผลข้อมูลไมโครโฟนด้วยตัวเอง แต่จะตอบสนองต่อเสียงlevelที่แอปของคุณให้มา ซึ่งแสดงภาพความเข้มของเสียง

รูปที่ 1 ตัวอย่าง VoiceInputIndicator

ขอสิทธิ์ที่คาดการณ์ไว้

หากต้องการบันทึกข้อมูลเสียงเพื่อขับเคลื่อนตัวบ่งชี้ แอปของคุณต้องมีสิทธิ์ 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.primary
  • modifier: modifier มาตรฐานของ Compose ที่จะใช้กับตัวบ่งชี้

หาก UI กำหนดให้ตัวบ่งชี้อยู่ในคอนเทนเนอร์พื้นหลังที่มองเห็นได้ ให้ใช้ ContainedVoiceInputIndicator ตัวเลือกนี้จะช่วยให้แถบตัวบ่งชี้โปร่งใส ทำให้คอนเทนเนอร์พื้นหลังแสดงขึ้นมาได้