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

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

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

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

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

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

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

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

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

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

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

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

از آنجا که این مقدار خام معمولاً بین ۰ تا ۱۰ قرار می‌گیرد، شما باید خروجی را به محدوده مورد نیاز 0.0f تا 1.0f نرمال‌سازی کنید. می‌توانید این سطح نرمال‌سازی شده را در یک متغیر حالت نگه دارید تا شاخص به طور مداوم به‌روزرسانی شود.

در اینجا مثالی از استفاده از RecognitionListener برای به‌روزرسانی یک متغیر state آورده شده است:

// 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 : modifier استاندارد Compose که قرار است روی اندیکاتور اعمال شود.

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