نشانگر ورودی گفتاری در Jetpack Compose Glimmer

دستگاه‌های XR قابل‌اعمال
این راهنمایی به شما کمک می‌کند برای این نوع دستگاه‌های واقعیت گسترده تجربه بسازید.
نمایش عینک

VoiceInputIndicator یک عنصر Jetpack Compose Glimmer است که فعالیت صدا را به کاربر نمایش می‌دهد. می‌توانید از این عنصر برای پذیرفتن ورودی گفتاری یا سایر صداها استفاده کنید و بازخورد دیداری ارائه دهید تا نشان دهید برنامه‌تان درحال ضبط صدا است.

این عنصر صرفاً یک عنصر دیداری است. این دستگاه به‌تنهایی صدا را ضبط نمی‌کند یا داده‌های میکروفون را پردازش نمی‌کند. درعوض، به صدای level ارائه‌شده توسط برنامه شما پاسخ می‌دهد که نمایش دیداری شدت صدا را نشان می‌دهد.

شکل ۱. نمونه‌ای از VoiceInputIndicator.

درخواست اجازه‌های پیش‌بینی‌شده

برای ضبط داده‌های صوتی برای هدایت نشانگر، برنامه شما به اجازه Manifest.permission.RECORD_AUDIO نیاز دارد.

وقتی تجربه‌های واقعیت افزوده برای عینک‌های نمایشگر می‌سازید، مطمئن شوید که اجازه‌ها را به‌درستی در دستگاه و عینک درخواست می‌کنید. از ProjectedPermissionsResultContract و ProjectedPermissionsRequestParams برای پیام‌واره دادن به کاربر استفاده کنید.

برای کسب اطلاعات بیشتر درباره درخواست اجازه‌ها در محیط‌های پیش‌بینی‌شده، به درخواست اجازه‌های سخت‌افزار مراجعه کنید.

ضبط و عادی‌سازی صدا

VoiceInputIndicator به Float بین 0.0f و 1.0f نیاز دارد تا شدت صدا را به‌صورت دیداری منعکس کند. ازآنجایی‌که این عنصر صرفاً به‌عنوان یک عنصر دیداری عمل می‌کند و صدا را ضبط نمی‌کند، برنامه شما باید به‌طور فعال میکروفون را پایش کند و میزان صدا را به پارامتر level نشانگر جاری‌سازی کند.

اگرچه روش‌های متعددی برای ضبط داده‌های صوتی وجود دارد، یکی از رویکردها استفاده از SpeechRecognizer API است. هنگام استفاده از SpeechRecognizer، می‌توانید به‌روزرسانی‌های هم‌زمان میزان صدا را بااستفاده از RecognitionListener.onRmsChanged بازخوانی ضبط کنید، که سطح صدا را به‌صورت دسی‌بل ارائه می‌دهد، rmsdB.

ازآنجایی‌که این مقدار خام معمولاً بین ۰ و ۱۰ است، باید برونداد را به محدوده 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: رنگ نوارهای نشانگر. به‌طور پیش‌فرض، این از رنگ اصلی زمینه «درخشش» استفاده می‌کند؛ GlimmerTheme.colors.primary را ببینید.
  • modifier: «نوشتن» استاندارد modifier که باید روی نشانگر اعمال شود.

اگر واسط کاربر شما نیاز دارد نشانگر در یک زمینه نمایان قرار بگیرد، از ContainedVoiceInputIndicator استفاده کنید. این جایگزین تضمین می‌کند که نوارهای نشانگر شفاف باشند و اجازه دهند ظرف پس‌زمینه نمایان شود.