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

প্রযোজ্য এক্সআর ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের এক্সআর ডিভাইসগুলির জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
ডিসপ্লে গ্লাস

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

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

চিত্র ১. ভয়েসইনপুটইন্ডিকেটর-এর একটি উদাহরণ।

প্রত্যাশিত অনুমতির জন্য অনুরোধ করুন

ইন্ডিকেটরটি চালানোর জন্য অডিও ডেটা ক্যাপচার করতে, আপনার অ্যাপের 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 variables to hold the normalized level
val audioLevel = MutableStateFlow(0f)
val speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context)

val listener = object : RecognitionListener {
    override fun onRmsChanged(rmsdB: Float) {
        // Normalize raw dB (~0–10) to 0.0-1.0 for the indicator
        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 and start recognizing speech
speechRecognizer.setRecognitionListener(listener)

val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
    putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
}
speechRecognizer.startListening(intent)

ভয়েস ইনপুট সূচকটি একীভূত করুন

আপনার অডিও স্ট্রিমটি একবার সঠিকভাবে নর্মালাইজড হয়ে স্টেট হিসেবে প্রকাশিত হলে, আপনি এটিকে সরাসরি VoiceInputIndicator এ পাঠাতে পারবেন।

@Composable
fun VoiceInputExample() {
    // Collect the flow as Compose State so the UI reacts to changes
    val currentLevel by audioLevel.collectAsState()

    VoiceInputIndicator(
        // The component responds to the level provided, showing a visual representation of the audio intensity
        level = { currentLevel },
        modifier = Modifier.size(64.dp)
    )
}

কাস্টমাইজেশন প্যারামিটার

VoiceInputIndicator এর আচরণ ও চেহারা কাস্টমাইজ করার জন্য কয়েকটি প্যারামিটার রয়েছে:

  • level : একটি ফাংশন যা ভয়েস ইনপুটের লেভেল নির্দেশকারী একটি Float মান রিটার্ন করে, যার মান নীরবতার জন্য 0.0 থেকে সর্বোচ্চ শব্দের জন্য 1.0 পর্যন্ত হয়ে থাকে।
  • indicatorColor : ইন্ডিকেটর বারগুলোর রঙ। ডিফল্টরূপে, এটি গ্লিমার থিমের প্রাইমারি কালার ব্যবহার করে; GlimmerTheme.colors.primary দেখুন।
  • modifier : ইন্ডিকেটরটিতে প্রয়োগ করার জন্য স্ট্যান্ডার্ড কম্পোজ modifier

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