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

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

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

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

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

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

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

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

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

ضبط و نرمال‌سازی صدا

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: رنگ نوارهای نشانگر. به‌طور پیش‌فرض، این از رنگ اصلی زمینه Glimmer استفاده می‌کند؛ GlimmerTheme.colors.primary را ببینید.
  • ‫modifier: Compose استاندارد modifier که باید برای نشانگر اعمال شود.

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