אינדיקטור של קלט קולי ב-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 מספק כמה פרמטרים להתאמה אישית של ההתנהגות והמראה שלו:

  • level: פונקציה שמחזירה Float שמייצג את הרמה של קלט קולי, בטווח שבין 0.0 לשקט לבין 1.0 לצליל הכי חזק.
  • indicatorColor: הצבע של פסי האינדיקטור. כברירת מחדל, המערכת משתמשת בצבע הראשי של עיצוב Glimmer. מידע נוסף זמין במאמר GlimmerTheme.colors.primary.
  • modifier: קומפוזיציית ברירת המחדל modifier שתחול על האינדיקטור.

אם בממשק המשתמש נדרש שהאינדיקטור יהיה בתוך מאגר רקע גלוי, צריך להשתמש ב-ContainedVoiceInputIndicator. החלופה הזו מבטיחה שסרגלי האינדיקטור יהיו שקופים, כך שהקונטיינר ברקע ייראה דרכם.