Chỉ báo nhập bằng giọng nói trong Jetpack Compose Glimmer

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Kính hiển thị

VoiceInputIndicator là một thành phần Jetpack Compose Glimmer hiển thị hoạt động âm thanh cho người dùng. Bạn có thể dùng thành phần này để chấp nhận đầu vào bằng giọng nói hoặc âm thanh khác và cung cấp phản hồi trực quan cho thấy ứng dụng của bạn đang ghi lại âm thanh.

Thành phần này hoàn toàn là một phần tử trực quan. Thiết bị này không tự ghi âm hoặc xử lý dữ liệu từ micrô. Thay vào đó, nó phản hồi một level âm thanh do ứng dụng của bạn cung cấp, cho thấy hình ảnh biểu thị cường độ âm thanh.

Hình 1. Ví dụ về VoiceInputIndicator.

Yêu cầu cấp quyền được chiếu

Để ghi lại dữ liệu âm thanh nhằm điều khiển chỉ báo, ứng dụng của bạn cần có quyền Manifest.permission.RECORD_AUDIO.

Khi bạn tạo trải nghiệm tăng cường cho kính hiển thị, hãy đảm bảo rằng bạn yêu cầu cấp quyền chính xác trên cả thiết bị và kính. Sử dụng ProjectedPermissionsResultContractProjectedPermissionsRequestParams để nhắc người dùng.

Để biết thêm thông tin về cách yêu cầu cấp quyền trong môi trường được chiếu, hãy xem phần Yêu cầu cấp quyền truy cập vào phần cứng.

Ghi và chuẩn hoá âm thanh

VoiceInputIndicator yêu cầu Float nằm trong khoảng từ 0.0f đến 1.0f để phản ánh trực quan cường độ âm thanh. Vì chỉ hoạt động như một thành phần trực quan và không ghi lại âm thanh, nên ứng dụng của bạn phải chủ động theo dõi micrô và truyền âm lượng đến tham số level của chỉ báo.

Mặc dù có nhiều cách để thu thập dữ liệu âm thanh, nhưng một cách tiếp cận là sử dụng API SpeechRecognizer. Khi sử dụng SpeechRecognizer, bạn có thể ghi lại thông tin cập nhật về âm lượng theo thời gian thực bằng lệnh gọi lại RecognitionListener.onRmsChanged. Lệnh gọi lại này cung cấp mức âm thanh theo đơn vị đexiben, rmsdB.

Vì giá trị thô này thường nằm trong khoảng từ 0 đến 10, nên bạn phải chuẩn hoá đầu ra thành phạm vi 0.0f đến 1.0f bắt buộc. Bạn có thể giữ mức chuẩn hoá này trong một biến trạng thái để liên tục cập nhật chỉ báo.

Sau đây là ví dụ về cách sử dụng RecognitionListener để cập nhật một biến trạng thái:

// 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)

Tích hợp chỉ báo nhập bằng giọng nói

Sau khi luồng âm thanh được chuẩn hoá đúng cách và hiển thị dưới dạng trạng thái, bạn có thể truyền trực tiếp luồng âm thanh đó vào 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
    )
}

Tham số tuỳ chỉnh

VoiceInputIndicator cung cấp một số tham số để tuỳ chỉnh hành vi và giao diện của thành phần này:

  • level: Một hàm trả về Float biểu thị mức độ của đầu vào bằng giọng nói, từ 0.0 cho sự im lặng đến 1.0 cho âm thanh lớn nhất.
  • indicatorColor: Màu của các thanh chỉ báo. Theo mặc định, thành phần này sử dụng màu chính trong giao diện Glimmer; hãy xem GlimmerTheme.colors.primary.
  • modifier: modifier Compose tiêu chuẩn sẽ được áp dụng cho chỉ báo.

Nếu giao diện người dùng của bạn yêu cầu chỉ báo nằm trong một vùng chứa nền hiển thị, hãy sử dụng ContainedVoiceInputIndicator. Phương án thay thế này đảm bảo các thanh chỉ báo trong suốt, cho phép vùng chứa nền hiển thị xuyên suốt.