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

একটি ভয়েস ইন্টারঅ্যাকশন অ্যাপ্লিকেশন (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 মেটাডেটা ফাইল অন্তর্ভুক্ত করা উচিত:

    রেজ/এক্সএমএল/ইন্টারঅ্যাকশন_সার্ভিস.এক্সএমএল

    <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 দেখুন। যেহেতু সমস্ত VIAs ভয়েস শনাক্তকারী পরিষেবাও, তাই আপনাকে অবশ্যই আপনার ম্যানিফেস্টে নিম্নলিখিতগুলি অন্তর্ভুক্ত করতে হবে:

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 হল একটি 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() বাস্তবায়নের জন্য Voice Assistant Tap-to-Read পরিচালনা করা প্রয়োজন। VoiceInteractionSessionService সিস্টেমটি VoiceInteractionSession তৈরি এবং এর সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহার করে। এর কেবল একটি দায়িত্ব রয়েছে, অনুরোধ করা হলে নতুন সেশন শুরু করা।

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 সীমাবদ্ধতার অবস্থা অনুসারে সেটআপ অনুমোদিত হয়) যে তারা সেটআপ প্রবাহ শুরু করতে চায় কিনা। যদি সেই সময়ে সেটআপ সম্ভব না হয়, তাহলে এই পরিস্থিতিটিও ব্যাখ্যা করুন।

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

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

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

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

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

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

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

একটি সেটিংস স্ক্রিন প্রয়োগ করুন

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

চিত্র ৪. সেটিংস ইন্টিগ্রেশন

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

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

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

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

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

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

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

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

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

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

চিত্র ৫। অনুমতির অনুরোধ করুন

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

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 নির্দেশিকাগুলির জন্য, প্রিলোডেড অ্যাসিস্ট্যান্টস: UX নির্দেশিকা দেখুন।

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

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

এই 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 মধ্যে যোগাযোগ বজায় রাখার জন্য, অভ্যন্তরীণ Intents বা পরিষেবা বাইন্ডিংয়ের একটি সেট প্রয়োজন হতে পারে। উদাহরণস্বরূপ, যখন 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 সাপোর্ট পাওয়া যায় না, তবে DSP প্রদত্ত কীফ্রেজ এবং লোকেল সংমিশ্রণ সমর্থন করে না। অ্যাপটি সফটওয়্যার হটওয়ার্ড ডিটেকশন ব্যবহার করতে পারে।
  • STATE_HARDWARE_ENROLLED । হট ওয়ার্ড ডিটেকশন প্রস্তুত এবং startRecognition() পদ্ধতিটি কল করে এটি শুরু করা যেতে পারে।
  • STATE_HARDWARE_UNENROLLED । অনুরোধ করা কীফ্রেজের জন্য একটি সাউন্ড মডেল উপলব্ধ নেই, তবে তালিকাভুক্তি সম্ভব।

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

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

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

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

অডিও ইনপুট এবং ভয়েস স্বীকৃতি পরিচালনা করুন

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

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

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

যখন VIA মৌখিক প্রতিক্রিয়া প্রদানের জন্য প্রস্তুত থাকে, তখন নিম্নলিখিত নির্দেশিকাগুলি অনুসরণ করা গুরুত্বপূর্ণ:

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