Jetpack Compose Glimmer-এ ভয়েস ইনপুট ইন্ডিকেটর

প্রযোজ্য XR ডিভাইস
এইসব XR ডিভাইসের জন্য অভিজ্ঞতা তৈরি করতে এই নির্দেশিকা আপনাকে সাহায্য করে।
Display Glasses

VoiceInputIndicator হল একটি Jetpack Compose Glimmer কম্পোনেন্ট যা ব্যবহারকারীকে সাউন্ড অ্যাক্টিভিটি দেখায়। ভয়েস ইনপুট বা অন্যান্য অডিও গ্রহণ করতে এবং আপনার অ্যাপ যে অডিও ক্যাপচার করছে তা দেখাতে ভিজ্যুয়াল ফিডব্যাক প্রদান করতে আপনি এই কম্পোনেন্ট ব্যবহার করতে পারেন।

এই কম্পোনেন্টটি শুধুমাত্র একটি ভিজ্যুয়াল এলিমেন্ট। এটি নিজে থেকে অডিও রেকর্ড করে না বা মাইক্রোফোন ডেটা প্রসেস করে না। এর পরিবর্তে, এটি আপনার অ্যাপের levelপ্রদান করা অডিওর উত্তর দেয়, যা অডিও ইনটেনসিটির ভিজ্যুয়াল উপস্থাপনা দেখায়।

ছবি ১. VoiceInputIndicator-এর একটি উদাহরণ।

প্রজেক্ট করা অনুমতির অনুরোধ করা

ইন্ডিকেটর চালানোর জন্য অডিও ডেটা ক্যাপচার করতে, আপনার অ্যাপের Manifest.permission.RECORD_AUDIO অনুমতি প্রয়োজন।

ডিসপ্লে গ্লাসের জন্য অগমেন্টেড অভিজ্ঞতা তৈরি করার সময়, নিশ্চিত করুন যে আপনি ডিভাইস ও গ্লাস, দু'টি জায়গাতেই সঠিকভাবে অনুমতি চেয়েছেন। ব্যবহারকারীকে প্রম্পট করতে ProjectedPermissionsResultContract এবং ProjectedPermissionsRequestParams ব্যবহার করুন।

প্রজেক্ট করা এনভায়রনমেন্টে অনুমতির অনুরোধ করা সম্পর্কে আরও জানতে, হার্ডওয়্যার সংক্রান্ত অনুমতির অনুরোধ করা দেখুন।

অডিও ক্যাপচার ও স্বাভাবিক করা

VoiceInputIndicator-এর জন্য 0.0f থেকে 1.0f-এর মধ্যে Float প্রয়োজন হয়, যাতে অডিও ইনটেনসিটি দৃশ্যমানভাবে প্রতিফলিত হয়। এটি শুধুমাত্র একটি ভিজ্যুয়াল কম্পোনেন্ট হিসেবে কাজ করে এবং অডিও ক্যাপচার করে না বলে, আপনার অ্যাপকে অবশ্যই মাইক্রোফোন অ্যাক্টিভভাবে মনিটর করতে হবে এবং ইন্ডিকেটরের 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: ইন্ডিকেটরে প্রয়োগ করার জন্য স্ট্যান্ডার্ড কম্পোজ modifier ।

আপনার UI-তে যদি এমন কোনও ইন্ডিকেটর প্রয়োজন হয় যা দৃশ্যমান ব্যাকগ্রাউন্ড কন্টেনারের মধ্যে থাকবে, তাহলে ContainedVoiceInputIndicator ব্যবহার করুন। এই বিকল্পটি নিশ্চিত করে যে ইন্ডিকেটর বারগুলি স্বচ্ছ, যার ফলে ব্যাকগ্রাউন্ড কন্টেনারটি দেখা যায়।