অ্যাপ ডেভেলপমেন্ট

একটি ভয়েস ইন্টারঅ্যাকশন অ্যাপ্লিকেশন (VIA) বাস্তবায়ন করতে, আপনাকে এই ধাপগুলো সম্পন্ন করতে হবে:

  1. একটি VIA কাঠামো তৈরি করুন।
  2. ( ঐচ্ছিক ) একটি সেটআপ/সাইন-ইন প্রক্রিয়া বাস্তবায়ন করুন।
  3. ( ঐচ্ছিক ) একটি সেটিংস স্ক্রিন যুক্ত করুন।
  4. ম্যানিফেস্ট ফাইলে প্রয়োজনীয় অনুমতিগুলো ঘোষণা করুন।
  5. একটি ভয়েস প্লেট UI বাস্তবায়ন করুন।
  6. ভয়েস রিকগনিশন বাস্তবায়ন করুন (এর মধ্যে অবশ্যই RecognitionService API ইমপ্লিমেন্টেশন অন্তর্ভুক্ত থাকতে হবে)।
  7. উক্তি বাস্তবায়ন করুন (ঐচ্ছিকভাবে, আপনি TextToSpeech API বাস্তবায়ন করতে পারেন)।
  8. কমান্ড পূরণের ব্যবস্থা করুন। এই বিষয়বস্তুটি ‘কমান্ড পূরণ’ অংশে দেখুন।

নিম্নলিখিত বিভাগগুলিতে উপরে উল্লিখিত প্রতিটি ধাপ কীভাবে সম্পন্ন করতে হবে তা বর্ণনা করা হয়েছে।

একটি VIA কাঠামো তৈরি করুন

প্রকাশ

যখন ম্যানিফেস্টে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকে, তখন একটি অ্যাপকে ভয়েস ইন্টারঅ্যাকশনযুক্ত অ্যাপ হিসেবে শনাক্ত করা হয়:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myvoicecontrol">
    ...

  <application ... >
    <service android:name=".MyInteractionService"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_VOICE_INTERACTION"
        android:process=":interactor">
      <meta-data
          android:name="android.voice_interaction"
          android:resource="@xml/interaction_service" />
      <intent-filter>
        <action android:name=
          "android.service.voice.VoiceInteractionService" />
      </intent-filter>
    </service>
  </application>
</manifest>

এই উদাহরণে:

  • VIA-গুলিকে অবশ্যই VoiceInteractionService এক্সটেন্ড করে এমন একটি সার্ভিস এক্সপোজ করতে হবে, যেখানে VoiceInteractionService.SERVICE_INTERFACE ("android.service.voice.VoiceInteractionService") অ্যাকশনটির জন্য একটি ইন্টেন্ট ফিল্টার থাকবে।
  • এই পরিষেবাটির অবশ্যই BIND_VOICE_INTERACTION সিস্টেম সিগনেচার পারমিশন থাকতে হবে।
  • এই সার্ভিসে একটি android.voice_interaction মেটাডেটা ফাইল অন্তর্ভুক্ত থাকা উচিত, যাতে নিম্নলিখিত বিষয়গুলো থাকবে:

    res/xml/interaction_service.xml

    <voice-interaction-service
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:sessionService=
          "com.example.MyInteractionSessionService"
        android:recognitionService=
          "com.example.MyRecognitionService"
        android:settingsActivity=
          "com.example.MySettingsActivity"
        android:supportsAssist="true"
        android:supportsLaunchVoiceAssistFromKeyguard="true"
        android:supportsLocalInteraction="true" />

প্রতিটি ফিল্ড সম্পর্কে বিস্তারিত জানতে R.styleable#VoiceInteractionService দেখুন। যেহেতু সমস্ত VIA-ই ভয়েস রিকগনাইজার সার্ভিস, তাই আপনাকে আপনার ম্যানিফেস্টে নিম্নলিখিতগুলিও অন্তর্ভুক্ত করতে হবে:

AndroidManifest.xml

<manifest ...>
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <application ...>
    ...
    <service android:name=".RecognitionService" ...>
      <intent-filter>
        <action android:name="android.speech.RecognitionService" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
      <meta-data
        android:name="android.speech"
        android:resource="@xml/recognition_service" />
    </service>
  </application>
</manifest>

ভয়েস রিকগনিশন পরিষেবাগুলির জন্য নিম্নলিখিত মেটাডেটাও প্রয়োজন:

res/xml/recognition_service.xml

<recognition-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:settingsActivity="com.example.MyRecognizerSettingsActivity" />

VoiceInteractionService, VoiceInteractionSessionService, এবং VoiceInteractionSession

নিম্নোক্ত চিত্রটিতে এই সত্তাগুলোর প্রত্যেকটির জীবনচক্র দেখানো হয়েছে:

জীবনচক্র

চিত্র ১. জীবনচক্র

পূর্বে যেমন বলা হয়েছে, VoiceInteractionService হলো একটি VIA-এর প্রবেশপথ। এই সার্ভিসের প্রধান দায়িত্বগুলো হলো:

  • এমন যেকোনো প্রসেস চালু করুন যা এই VIA সক্রিয় থাকা পর্যন্ত চালু রাখা উচিত। উদাহরণস্বরূপ, হটওয়ার্ড ডিটেকশন।
  • রিপোর্টগুলো ভয়েস অ্যাকশন সমর্থন করে ( ভয়েস অ্যাসিস্ট্যান্ট ট্যাপ-টু-রিড দেখুন)।
  • লক স্ক্রিন (কীগার্ড) থেকে ভয়েস ইন্টারঅ্যাকশন সেশন চালু করুন।

এর সরলতম রূপে, একটি VoiceInteractionService বাস্তবায়ন দেখতে এইরকম হবে:

public class MyVoiceInteractionService extends VoiceInteractionService {
    private static final List<String> SUPPORTED_VOICE_ACTIONS =
        Arrays.asList(
            CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION,
            CarVoiceInteractionSession.VOICE_ACTION_REPLY_NOTIFICATION,
            CarVoiceInteractionSession.VOICE_ACTION_HANDLE_EXCEPTION
    );

    @Override
    public void onReady() {
        super.onReady();
        // TODO: Setup hotword detector
    }

    @NonNull
    @Override
    public Set<String> onGetSupportedVoiceActions(
            @NonNull Set<String> voiceActions) {
        Set<String> result = new HashSet<>(voiceActions);
        result.retainAll(SUPPORTED_VOICE_ACTIONS);
        return result;
    }
    ...
}

ভয়েস অ্যাসিস্ট্যান্টের ট্যাপ-টু-রিড পরিচালনা করার জন্য VoiceInteractionService#onGetSupportedVoiceActions() ফাংশনটির বাস্তবায়ন প্রয়োজন। একটি VoiceInteractionSession তৈরি এবং তার সাথে ইন্টারঅ্যাক্ট করার জন্য সিস্টেম একটি VoiceInteractionSessionService ব্যবহার করে। এর একমাত্র দায়িত্ব হলো অনুরোধ করা হলে নতুন সেশন শুরু করা।

public class MyVoiceInteractionSessionService extends VoiceInteractionSessionService {
    @Override
    public VoiceInteractionSession onNewSession(Bundle args) {
        return new MyVoiceInteractionSession(this);
    }
}

অবশেষে, একটি VoiceInteractionSession- এই বেশিরভাগ কাজ সম্পন্ন করা হয়। একাধিক ব্যবহারকারী ইন্টারঅ্যাকশন সম্পন্ন করার জন্য একটিমাত্র সেশন ইনস্ট্যান্স পুনরায় ব্যবহার করা যেতে পারে। AAOS-এ একটি সহায়ক CarVoiceInteractionSession রয়েছে, যা গাড়ির কিছু স্বতন্ত্র কার্যকারিতা বাস্তবায়নে সাহায্য করে।

public class MyVoiceInteractionSession extends CarVoiceInteractionSession {

    public InteractionSession(Context context) {
        super(context);
    }

    @Override
    protected void onShow(String action, Bundle args, int showFlags) {
        closeSystemDialogs();
        // TODO: Unhide UI and update UI state
        // TODO: Start processing audio input
    }
    ...
}

VoiceInteractionSession অনেকগুলো কলব্যাক মেথড রয়েছে, যা পরবর্তী বিভাগগুলোতে ব্যাখ্যা করা হয়েছে। সম্পূর্ণ তালিকার জন্য VoiceInteractionSession এর ডকুমেন্টেশন দেখুন।

একটি সেটআপ/সাইন-ইন প্রক্রিয়া বাস্তবায়ন করুন

সেটআপ এবং সাইন-ইন সম্পন্ন হতে পারে:

  • ডিভাইস অনবোর্ডিং চলাকালীন (সেটআপ উইজার্ড)।
  • ভয়েস ইন্টারঅ্যাকশন পরিষেবা অদলবদল করার সময় (সেটিংস)।
  • প্রথমবার চালু করার সময় অ্যাপটি নির্বাচন করা হলে।

প্রস্তাবিত ইউজার এক্সপেরিয়েন্স এবং ভিজ্যুয়াল গাইডেন্স সম্পর্কে বিস্তারিত জানতে, প্রিলোডেড অ্যাসিস্ট্যান্টস: ইউএক্স গাইডেন্স দেখুন।

ভয়েস পরিষেবা অদলবদল করার সময় সেটআপ

ব্যবহারকারীর পক্ষে এমন একটি VIA নির্বাচন করা সবসময়ই সম্ভব যা সঠিকভাবে কনফিগার করা হয়নি। এটি নিম্নলিখিত কারণে ঘটতে পারে:

  • ব্যবহারকারী সেটআপ উইজার্ডটি সম্পূর্ণভাবে এড়িয়ে গেছেন অথবা ভয়েস ইন্টারঅ্যাকশন কনফিগারেশন ধাপটি এড়িয়ে গেছেন।
  • ব্যবহারকারী ডিভাইস অনবোর্ডিংয়ের সময় কনফিগার করা VIA থেকে ভিন্ন একটি VIA নির্বাচন করেছেন।

যাইহোক, একটি VoiceInteractionService ব্যবহারকারীকে সেটআপ সম্পন্ন করতে উৎসাহিত করার বেশ কয়েকটি উপায় রয়েছে:

  • বিজ্ঞপ্তি অনুস্মারক।
  • ব্যবহারকারী যখন এটি ব্যবহার করার চেষ্টা করেন, তখন স্বয়ংক্রিয়ভাবে ভয়েস রিপ্লাই আসে।

দ্রষ্টব্য : ব্যবহারকারীর সুস্পষ্ট অনুরোধ ছাড়া VIA সেটআপ ফ্লো উপস্থাপন করা কঠোরভাবে নিরুৎসাহিত করা হয়। এর অর্থ হলো, ডিভাইস বুট করার সময় অথবা ব্যবহারকারীর সুইচ বা আনলকের ফলে VIA-গুলো যেন HU-তে স্বয়ংক্রিয়ভাবে কোনো কন্টেন্ট প্রদর্শন না করে।

বিজ্ঞপ্তি অনুস্মারক

নোটিফিকেশন রিমাইন্ডার হলো সেটআপের প্রয়োজনীয়তা জানানোর একটি সহজ উপায়, এবং এর মাধ্যমে ব্যবহারকারীরা অ্যাসিস্ট্যান্ট সেটআপ প্রক্রিয়ায় প্রবেশ করার সুযোগ পান।

বিজ্ঞপ্তি অনুস্মারক

চিত্র ২. বিজ্ঞপ্তি অনুস্মারক

এই প্রবাহটি যেভাবে কাজ করবে তা নিচে দেওয়া হলো:

বিজ্ঞপ্তি অনুস্মারক প্রবাহ

চিত্র ৩. নোটিফিকেশন রিমাইন্ডার ফ্লো

ভয়েস রিপ্লাই

এটিই বাস্তবায়নের সবচেয়ে সহজ প্রক্রিয়া। এর জন্য VoiceInteractionSession#onShow() কলব্যাকে একটি উক্তি শুরু করতে হয়, ব্যবহারকারীকে কী করতে হবে তা ব্যাখ্যা করতে হয় এবং তারপর (UX Restriction অবস্থা অনুযায়ী সেটআপের অনুমতি থাকলে) তাদের জিজ্ঞাসা করতে হয় যে তারা সেটআপ প্রক্রিয়াটি শুরু করতে চান কিনা। যদি সেই মুহূর্তে সেটআপ করা সম্ভব না হয়, তবে এই পরিস্থিতিটিও ব্যাখ্যা করুন।

প্রথমবার ব্যবহারের জন্য সেটআপ করুন

ব্যবহারকারীর পক্ষে এমন একটি VIA চালু করে ফেলার সম্ভাবনা সবসময়ই থাকে যা সঠিকভাবে কনফিগার করা হয়নি। এই ধরনের ক্ষেত্রে:

  1. ব্যবহারকারীকে মৌখিকভাবে এই পরিস্থিতি সম্পর্কে জানান (উদাহরণস্বরূপ, "সঠিকভাবে কাজ করার জন্য, আপনাকে কয়েকটি ধাপ সম্পন্ন করতে হবে...")।
  2. যদি ইউএক্স রেস্ট্রিকশন ইঞ্জিন অনুমতি দেয় ( UX_RESTRICTIONS_NO_SETUP দেখুন), তাহলে ব্যবহারকারীকে জিজ্ঞাসা করুন যে তিনি সেটআপ প্রক্রিয়া শুরু করতে চান কিনা এবং তারপরে VIA-এর জন্য সেটিংস স্ক্রিনটি খুলুন।
  3. অন্যথায় (উদাহরণস্বরূপ, যদি ব্যবহারকারী গাড়ি চালান), ব্যবহারকারীকে একটি বিজ্ঞপ্তি দিন যাতে তিনি নিরাপদ হলে বিকল্পটিতে ক্লিক করতে পারেন।

ভয়েস ইন্টারঅ্যাকশন সেটআপ স্ক্রিন তৈরি করুন

সেটআপ এবং সাইন-ইন স্ক্রিনগুলোকে নিয়মিত কার্যক্রম হিসেবে তৈরি করা উচিত। UI ডেভেলপমেন্টের জন্য UX এবং ভিজ্যুয়াল নির্দেশিকা দেখতে “Preloaded Assistants: UX Guidance” দেখুন।

সাধারণ নির্দেশিকা:

  • VIA-গুলিতে ব্যবহারকারীদের যেকোনো সময় সেটআপ থামানো এবং পুনরায় শুরু করার সুযোগ থাকা উচিত।
  • UX_RESTRICTIONS_NO_SETUP বিধিনিষেধটি কার্যকর থাকলে সেটআপের অনুমতি দেওয়া উচিত নয়। বিস্তারিত জানতে, ড্রাইভারের মনোযোগ বিচ্যুতি সংক্রান্ত নির্দেশিকা দেখুন।
  • সেটআপ স্ক্রিনগুলো প্রতিটি গাড়ির ডিজাইন সিস্টেমের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। সাধারণ স্ক্রিন লেআউট, আইকন, রঙ এবং অন্যান্য দিকগুলো UI-এর বাকি অংশের সাথে সঙ্গতিপূর্ণ হওয়া উচিত। বিস্তারিত জানতে কাস্টমাইজেশন দেখুন।

একটি সেটিংস স্ক্রিন বাস্তবায়ন করুন

সেটিংস ইন্টিগ্রেশন

চিত্র ৪. সেটিংস একীকরণ

সেটিংস স্ক্রিনগুলো সাধারণ অ্যান্ড্রয়েড অ্যাক্টিভিটির অংশ। যদি এগুলো প্রয়োগ করা হয়, তবে VIA ম্যানিফেস্টের অংশ হিসেবে ( ম্যানিফেস্ট দেখুন) এর এন্ট্রি পয়েন্ট অবশ্যই res/xml/interaction_service.xml ফাইলে ঘোষণা করতে হবে। সেটআপ চালিয়ে যাওয়া এবং সাইন-ইন করার জন্য (যদি ব্যবহারকারী তা সম্পূর্ণ না করে থাকেন) অথবা প্রয়োজনে সাইন-আউট বা ব্যবহারকারী পরিবর্তনের বিকল্প দেওয়ার জন্য সেটিংস বিভাগটি একটি ভালো জায়গা। উপরে বর্ণিত সেটআপ স্ক্রিনগুলোর মতোই, এই স্ক্রিনগুলোতেও নিম্নলিখিত বৈশিষ্ট্যগুলো থাকা উচিত:

ম্যানিফেস্ট ফাইলে প্রয়োজনীয় অনুমতিগুলো ঘোষণা করুন।

একটি VIA-এর জন্য প্রয়োজনীয় অনুমতিগুলোকে তিনটি শ্রেণীতে ভাগ করা যেতে পারে:

  • সিস্টেম সিগনেচার পারমিশন। এই পারমিশনগুলো শুধুমাত্র আগে থেকে ইনস্টল করা, সিস্টেম দ্বারা স্বাক্ষরিত APK-গুলোকে দেওয়া হয়। ব্যবহারকারীরা এই পারমিশনগুলো দিতে পারেন না, শুধুমাত্র OEM-রাই তাদের সিস্টেম ইমেজ তৈরির সময় এগুলো দিতে পারেন। সিগনেচার পারমিশন পাওয়ার বিষয়ে আরও তথ্যের জন্য, "সিস্টেম-বিশেষাধিকারপ্রাপ্ত পারমিশন প্রদান করুন" দেখুন।
  • ঝুঁকিপূর্ণ অনুমতিসমূহ। এগুলো হলো এমন অনুমতি যা একজন ব্যবহারকারীকে অবশ্যই PermissionsController ডায়ালগ ব্যবহার করে মঞ্জুর করতে হয়। OEM-রা ডিফল্ট VoiceInteractionService-কে এই অনুমতিগুলোর কয়েকটি আগে থেকেই মঞ্জুর করে রাখতে পারে। কিন্তু যেহেতু এই ডিফল্টটি ডিভাইসভেদে পরিবর্তিত হতে পারে, তাই অ্যাপগুলোর প্রয়োজনের সময় এই অনুমতিগুলোর জন্য অনুরোধ করার সক্ষমতা থাকা উচিত।
  • অন্যান্য অনুমতিসমূহ। এগুলো হলো এমন সব অন্যান্য অনুমতি যেগুলোর জন্য ব্যবহারকারীর হস্তক্ষেপের প্রয়োজন হয় না। এই অনুমতিগুলো সিস্টেম দ্বারা স্বয়ংক্রিয়ভাবে প্রদান করা হয়।

উপরোক্ত বিষয়গুলো বিবেচনা করে, নিম্নলিখিত অংশে শুধুমাত্র ঝুঁকিপূর্ণ অনুমতি অনুরোধ করার উপর আলোকপাত করা হয়েছে। ব্যবহারকারী যখন সাইন-ইন বা সেটিং স্ক্রিনে থাকবেন, শুধুমাত্র তখনই অনুমতি অনুরোধ করা উচিত।

অ্যাপটি চালানোর জন্য প্রয়োজনীয় অনুমতি না থাকলে, ব্যবহারকারীকে পরিস্থিতিটি ব্যাখ্যা করার জন্য একটি ভয়েস আটারেন্স এবং VIA সেটিংস স্ক্রিনে ফিরে যাওয়ার জন্য একটি নোটিফিকেশন ব্যবহার করার পরামর্শ দেওয়া হয়। বিস্তারিত জানতে, ১. নোটিফিকেশন রিমাইন্ডার দেখুন।

সেটিং স্ক্রিনের অংশ হিসেবে অনুমতির জন্য অনুরোধ করুন।

বিপজ্জনক অনুমতিগুলো সাধারণ ActivityCompat#requestPermission() মেথড (বা সমতুল্য) ব্যবহার করে অনুরোধ করা হয়। কীভাবে অনুমতি অনুরোধ করতে হয় সে সম্পর্কে বিস্তারিত জানতে, অ্যাপের অনুমতি অনুরোধ (Request App Permissions ) দেখুন।

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

চিত্র ৫. অনুমতির জন্য অনুরোধ

বিজ্ঞপ্তি শ্রোতার অনুমতি

TTR ফ্লো বাস্তবায়ন করতে, VIA-কে অবশ্যই নোটিফিকেশন লিসেনার হিসেবে মনোনীত করতে হবে। এটি সরাসরি কোনো অনুমতি নয়, বরং একটি কনফিগারেশন যা সিস্টেমকে নিবন্ধিত লিসেনারদের কাছে নোটিফিকেশন পাঠাতে সক্ষম করে। VIA-কে এই তথ্যে অ্যাক্সেস দেওয়া হয়েছে কিনা তা জানতে, অ্যাপগুলো নিম্নলিখিত পদক্ষেপগুলো নিতে পারে:

  • (ঐচ্ছিক) CarAssistUtils#assistantIsNotificationListener() ব্যবহার করে আগে থেকেই নোটিফিকেশন লিসেনার আছে কিনা তা পরীক্ষা করে নিন। এটি, উদাহরণস্বরূপ, সেটআপ ফ্লো চলাকালীন করা যেতে পারে।
  • (বাধ্যতামূলক) CarVoiceInteractionSession#onShow() হ্যান্ডেল করার ক্ষেত্রে VOICE_ACTION_HANDLE_EXCEPTION অ্যাকশন এবং EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING এক্সেপশন দ্বারা প্রতিক্রিয়া জানান।

যদি এই অ্যাক্সেস আগে থেকে দেওয়া না থাকে, তাহলে VIA-কে ইউটারেন্স এবং নোটিফিকেশনের সমন্বয়ে ব্যবহারকারীকে গাড়ির সেটিংস-এর নোটিফিকেশন অ্যাক্সেস বিভাগে নির্দেশিত করা উচিত। সেটিংস অ্যাপের উপযুক্ত বিভাগটি খোলার জন্য নিম্নলিখিত কোডটি ব্যবহার করা যেতে পারে:

private void requestNotificationListenerAccess() {
    Intent intent = new Intent(Settings
        .ACTION_NOTIFICATION_LISTENER_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    startActivity(intent);
}

একটি ভয়েস প্লেট UI বাস্তবায়ন করুন

যখন একটি VoiceInteractionSession একটি onShow() কলব্যাক গ্রহণ করে, তখন এটি একটি ভয়েস প্লেট UI প্রদর্শন করতে পারে। ভয়েস প্লেট বাস্তবায়নের ভিজ্যুয়াল এবং UX নির্দেশিকার জন্য, Preloaded Assistants: UX Guidance দেখুন।

ভয়েস প্লেট প্রদর্শন করা হচ্ছে

চিত্র ৬. ভয়েস প্লেট প্রদর্শন

এই UI-টি বাস্তবায়ন করার দুটি উপায় রয়েছে:

  • VoiceInteractionSession#onCreateContentView() ওভাররাইড করুন
  • VoiceInteractionSession#startAssistantActivity() ব্যবহার করে একটি অ্যাক্টিভিটি চালু করুন

onCreateContentView() ব্যবহার করুন

এটি একটি ভয়েস প্লেট উপস্থাপনের ডিফল্ট পদ্ধতি। VoiceInteractionSession বেস ক্লাসটি একটি উইন্ডো তৈরি করে এবং যতক্ষণ একটি ভয়েস সেশন সক্রিয় থাকে, ততক্ষণ এর লাইফসাইকেল পরিচালনা করে। সেশন তৈরি হওয়ার সাথে সাথেই অ্যাপগুলোকে অবশ্যই VoiceInteractionSession#onCreateContentView() ওভাররাইড করতে হবে এবং এমন একটি ভিউ রিটার্ন করতে হবে যা ওই উইন্ডোর সাথে সংযুক্ত থাকে। এই ভিউটি প্রাথমিকভাবে অদৃশ্য থাকা উচিত। যখন একটি ভয়েস ইন্টারঅ্যাকশন শুরু হয়, তখন VoiceInteractionSession#onShow() কল করে এই ভিউটিকে দৃশ্যমান করতে হবে এবং তারপর VoiceInteractionSession#onHide() কল করে এটিকে আবার অদৃশ্য করে দিতে হবে।

public class MyVoiceInteractionSession extends CarVoiceInteractionSession {
    private View mVoicePlate;
    

    @Override
    public View onCreateContentView() {
        mVoicePlate = inflater.inflate(R.layout.voice_plate, null);
        
   }

    @Override
    protected void onShow(String action, Bundle args, int showFlags) {
        // TODO: Update UI state to "listening"
        mVoicePlate.setVisibility(View.VISIBLE);
    }

    @Override
    public void onHide() {
        mVoicePlate.setVisibility(View.GONE);
    }
    
}

এই পদ্ধতি ব্যবহার করার সময়, আপনার UI-এর আড়াল হয়ে যাওয়া অংশগুলোর কথা মাথায় রাখতে VoiceInteractionSession#onComputeInsets() ফাংশনটি পরিবর্তন করে নিতে পারেন।

startAssistantActivity() ব্যবহার করুন

এই ক্ষেত্রে, VoiceInteractionSession ভয়েস প্লেট UI পরিচালনার দায়িত্ব একটি সাধারণ অ্যাক্টিভিটির কাছে অর্পণ করে। যখন এই বিকল্পটি ব্যবহার করা হয়, তখন একটি VoiceInteractionSession ইমপ্লিমেন্টেশনকে অবশ্যই onPrepareShow() কলব্যাকে তার ডিফল্ট কন্টেন্ট উইন্ডো তৈরি করা নিষ্ক্রিয় করতে হবে ( onCreateContentView() এর ব্যবহার দেখুন)। VoiceInteractionSession#onShow() এ, সেশনটি VoiceInteractionSession#startAssistantActivity() ব্যবহার করে ভয়েস প্লেট অ্যাক্টিভিটি শুরু করবে। এই মেথডটি সঠিক উইন্ডো সেটিংস এবং অ্যাক্টিভিটি ফ্ল্যাগ সহ UI শুরু করে।

public class MyVoiceInteractionSession extends CarVoiceInteractionSession {
    

    @Override
    public void onPrepareShow(Bundle args, int showFlags) {
        super.onPrepareShow(args, showFlags);
        setUiEnabled(false);
    }

    @Override
    protected void onShow(String action, Bundle args, int showFlags) {
        closeSystemDialogs();
        Intent intent = new Intent(getContext(), VoicePlateActivity.class);
        intent.putExtra(VoicePlateActivity.EXTRA_ACTION, action);
        intent.putExtra(VoicePlateActivity.EXTRA_ARGS, args);
        startAssistantActivity(intent);
    }

    
}

এই অ্যাক্টিভিটি এবং VoiceInteractionSession এর মধ্যে যোগাযোগ বজায় রাখার জন্য, এক সেট অভ্যন্তরীণ Intent বা সার্ভিস বাইন্ডিং-এর প্রয়োজন হতে পারে। উদাহরণস্বরূপ, যখন VoiceInteractionSession#onHide() কল করা হয়, তখন সেশনটিকে অবশ্যই এই অনুরোধটি অ্যাক্টিভিটিতে পাঠাতে সক্ষম হতে হবে।

গুরুত্বপূর্ণ। অটোমোটিভে, গাড়ি চালানোর সময় শুধুমাত্র বিশেষভাবে অ্যানোটেট করা অ্যাক্টিভিটি অথবা UXR "allowlist"-এ তালিকাভুক্ত অ্যাক্টিভিটিগুলোই প্রদর্শিত হতে পারে। এটি VoiceInteractionSession#startAssistantActivity() দিয়ে শুরু করা অ্যাক্টিভিটিগুলোর ক্ষেত্রেও প্রযোজ্য। মনে রাখবেন, হয় আপনার অ্যাক্টিভিটিকে <meta-data android:name="distractionOptimized" android:value="true"/> দিয়ে অ্যানোটেট করুন অথবা এই অ্যাক্টিভিটিটিকে /packages/services/Car/service/res/values/config.xml ফাইলের systemActivityWhitelist কী-তে অন্তর্ভুক্ত করুন। আরও তথ্যের জন্য, ড্রাইভার ডিস্ট্র্যাকশন গাইডলাইনস দেখুন।

ভয়েস রিকগনিশন বাস্তবায়ন করুন

এই অংশে, আপনি হটওয়ার্ড সনাক্তকরণ ও শনাক্তকরণের মাধ্যমে ভয়েস রিকগনিশন কীভাবে প্রয়োগ করতে হয় তা শিখবেন। হটওয়ার্ড হলো এমন একটি ট্রিগার শব্দ যা কণ্ঠস্বরের মাধ্যমে কোনো নতুন জিজ্ঞাসা বা কাজ শুরু করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, "ওকে গুগল" বা "হে গুগল"।

ডিএসপি হটওয়ার্ড সনাক্তকরণ

অ্যান্ড্রয়েড AlwaysOnHotwordDetector এর মাধ্যমে ডিএসপি (DSP) স্তরে একটি সর্বদা-সক্রিয় হটওয়ার্ড ডিটেক্টর ব্যবহারের সুযোগ দেয়, যা কম সিপিইউ (CPU) ব্যবহার করে হটওয়ার্ড শনাক্তকরণ বাস্তবায়নের একটি উপায়। এই কার্যকারিতার ব্যবহার দুটি ভাগে বিভক্ত:

  • একটি AlwaysOnHotwordDetector এর ইনস্ট্যানসিয়েশন।
  • হটওয়ার্ড শনাক্তকরণ সাউন্ড মডেলের তালিকাভুক্তি।

VoiceInteractionService ইমপ্লিমেন্টেশন, ডিটেকশনের জন্য ব্যবহৃত কীফ্রেজ এবং লোকেল পাস করে VoiceInteractionService#createAlwaysOnHotwordDetector() ব্যবহার করে একটি হটওয়ার্ড ডিটেক্টর তৈরি করতে পারে। এর ফলে, অ্যাপটি নিম্নলিখিত সম্ভাব্য মানগুলির মধ্যে একটি সহ একটি onAvailabilityChanged() কলব্যাক পায়:

  • STATE_HARDWARE_UNAVAILABLE . ডিভাইসটিতে ডিএসপি (DSP) সক্ষমতা উপলব্ধ নেই। এক্ষেত্রে, সফটওয়্যার হটওয়ার্ড ডিটেকশন ব্যবহার করা হয়।
  • STATE_HARDWARE_UNSUPPORTED । সাধারণভাবে ডিএসপি (DSP) সমর্থন উপলব্ধ নয়, কিন্তু প্রদত্ত কীফ্রেজ এবং লোকেল সংমিশ্রণটি ডিএসপি সমর্থন করে না। অ্যাপটি সফটওয়্যার হটওয়ার্ড ডিটেকশন ব্যবহার করার বিকল্প বেছে নিতে পারে।
  • STATE_HARDWARE_ENROLLED . হট ওয়ার্ড ডিটেকশন প্রস্তুত এবং startRecognition() মেথডটি কল করে এটি শুরু করা যেতে পারে।
  • STATE_HARDWARE_UNENROLLED . অনুরোধকৃত কীফ্রেজের জন্য কোনো সাউন্ড মডেল উপলব্ধ নেই, কিন্তু তালিকাভুক্তি সম্ভব।

IVoiceInteractionManagerService#updateKeyphraseSoundModel() ব্যবহার করে হটওয়ার্ড ডিটেকশন সাউন্ড মডেলগুলোর এনরোলমেন্ট করা যায়। সিস্টেমে একই সময়ে একাধিক মডেল রেজিস্টার করা যেতে পারে, কিন্তু শুধুমাত্র একটি মডেলই একটি AlwaysOnHotwordDetector এর সাথে যুক্ত থাকে। সব ডিভাইসে ডিএসপি হটওয়ার্ড ডিটেকশন উপলব্ধ নাও থাকতে পারে। VIA ডেভেলপারদের getDspModuleProperties() মেথড ব্যবহার করে হার্ডওয়্যারের সক্ষমতা যাচাই করে নেওয়া উচিত। সাউন্ড মডেল কীভাবে এনরোল করতে হয় তা দেখানোর জন্য নমুনা কোডের জন্য VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java দেখুন। যুগপৎ হটওয়ার্ড শনাক্তকরণ সম্পর্কে জানতে কনকারেন্ট ক্যাপচার দেখুন।

সফটওয়্যার হটওয়ার্ড সনাক্তকরণ

উপরে যেমন উল্লেখ করা হয়েছে, সব ডিভাইসে ডিএসপি হটওয়ার্ড ডিটেকশন উপলব্ধ নাও থাকতে পারে (উদাহরণস্বরূপ, অ্যান্ড্রয়েড এমুলেটর ডিএসপি এমুলেশন প্রদান করে না)। এই ক্ষেত্রে, সফটওয়্যার ভয়েস রিকগনিশনই একমাত্র বিকল্প। মাইক্রোফোনে অ্যাক্সেসের প্রয়োজন হতে পারে এমন অন্যান্য অ্যাপের কাজে যাতে হস্তক্ষেপ না হয়, সেজন্য ভিআইএ-কে অবশ্যই নিম্নলিখিত উপায়ে অডিও ইনপুট অ্যাক্সেস করতে হবে:

এই দুটি কনস্ট্যান্টই @hide আছে এবং শুধুমাত্র বান্ডল করা অ্যাপগুলোর জন্য উপলব্ধ।

অডিও ইনপুট এবং ভয়েস রিকগনিশন পরিচালনা করুন

MediaRecorder ক্লাস ব্যবহার করে অডিও ইনপুট বাস্তবায়ন করা হবে। এই API কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, MediaRecorder Overview দেখুন। ভয়েস ইন্টারঅ্যাকশন সার্ভিসগুলোও RecognitionService ক্লাসের ইমপ্লিমেন্টেশন হবে বলে আশা করা হয়। সিস্টেমের যে কোনো অ্যাপ যার ভয়েস রিকগনিশন প্রয়োজন, সে এই সক্ষমতা অ্যাক্সেস করার জন্য এটি ব্যবহার করে। ভয়েস রিকগনিশন করতে এবং মাইক্রোফোন অ্যাক্সেস পেতে, VIA-এর অবশ্যই android.permission.RECORD_AUDIO পারমিশন থাকতে হবে। যে অ্যাপগুলো একটি RecognitionService ইমপ্লিমেন্টেশন অ্যাক্সেস করে, তাদেরও এই পারমিশনটি থাকা আবশ্যক।

অ্যান্ড্রয়েড ১০-এর আগে, একবারে শুধুমাত্র একটি অ্যাপকেই মাইক্রোফোন ব্যবহারের অনুমতি দেওয়া হতো (হটওয়ার্ড ডিটেকশন ছাড়া, যা উপরে উল্লেখ করা হয়েছে)। অ্যান্ড্রয়েড ১০ থেকে মাইক্রোফোন ব্যবহারের অনুমতি শেয়ার করা যায়। আরও তথ্যের জন্য ‘অডিও ইনপুট শেয়ারিং’ দেখুন।

অডিও আউটপুট অ্যাক্সেস করুন

যখন ভিআইএ মৌখিক উত্তর দিতে প্রস্তুত থাকে, তখন নিম্নলিখিত নির্দেশিকাগুলো অনুসরণ করা গুরুত্বপূর্ণ:

  • অডিও ফোকাসের অনুরোধ করার সময় বা অডিও আউটপুট পরিচালনা করার সময়, অ্যাপটিকে অবশ্যই অডিও অ্যাট্রিবিউট হিসেবে AudioAttributes#USAGE_ASSISTANT এবং AudioAttributes#CONTENT_TYPE_SPEECH ব্যবহার করতে হবে।
  • স্পিচ রিকগনিশনের সময়, AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE ব্যবহার করে অডিও ফোকাসের জন্য অনুরোধ করতে হবে। মনে রাখবেন যে, অডিও ফোকাস সরিয়ে নেওয়া হলে কিছু মিডিয়া অ্যাপ মিডিয়া কমান্ডে সঠিকভাবে সাড়া নাও দিতে পারে ( মিডিয়া কমান্ড পূরণ দেখুন)।