ऐप्लिकेशन तैयार करने से जुड़ी सेवाएं

वॉइस इंटरैक्शन ऐप्लिकेशन (वीआईए) लागू करने के लिए, यह तरीका अपनाएं:

  1. VIA स्केलेटन बनाएं.
  2. (ज़रूरी नहीं) सेटअप/साइन-इन फ़्लो लागू करें.
  3. (ज़रूरी नहीं) सेटिंग वाली स्क्रीन लागू करें.
  4. मेनिफ़ेस्ट फ़ाइल में ज़रूरी अनुमतियां बताएं.
  5. वॉइस प्लेट का यूज़र इंटरफ़ेस (यूआई) लागू करें.
  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>

इस उदाहरण में:

  • VIAs को ऐसी सेवा एक्सपोज़ करनी चाहिए जो 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 सेटअप फ़्लो को न दिखाएं. इसका मतलब है कि वीआईए को डिवाइस के बूट होने के दौरान, उपयोगकर्ता के स्विच करने या डिवाइस को अनलॉक करने पर, एचयू पर कॉन्टेंट अपने-आप दिखने से रोकना चाहिए.

सूचना का रिमाइंडर

सूचना के तौर पर रिमाइंडर भेजने से, उपयोगकर्ताओं को सेटअप की ज़रूरत के बारे में पता चलता है. साथ ही, वे Assistant के सेटअप फ़्लो पर आसानी से जा सकते हैं.

सूचना का रिमाइंडर

दूसरी इमेज. सूचना का रिमाइंडर

यह फ़्लो इस तरह से काम करेगा:

सूचना के रिमाइंडर का फ़्लो

तीसरी इमेज. सूचना के रिमाइंडर का फ़्लो

बोलकर जवाब दें

यह सबसे आसान फ़्लो है. इसमें VoiceInteractionSession#onShow() कॉलबैक पर बोलकर निर्देश दिया जाता है. साथ ही, उपयोगकर्ता को यह बताया जाता है कि उसे क्या करना है. इसके बाद, उपयोगकर्ता से पूछा जाता है कि क्या उसे सेटअप फ़्लो शुरू करना है. हालांकि, यह पूछने के लिए ज़रूरी है कि UX की पाबंदी की स्थिति के हिसाब से सेटअप की अनुमति हो. अगर उस समय सेटअप नहीं किया जा सकता, तो इस स्थिति के बारे में भी बताएं.

पहली बार इस्तेमाल करने पर सेटअप करना

उपयोगकर्ता के पास, ऐसे वीआईए को ट्रिगर करने का विकल्प हमेशा होता है जिसे सही तरीके से कॉन्फ़िगर नहीं किया गया है. ऐसे मामलों में:

  1. उपयोगकर्ता को इस स्थिति के बारे में बोलकर बताएं. उदाहरण के लिए, "ठीक से काम करने के लिए, मुझे आपको कुछ चरण पूरे करने होंगे … ".
  2. अगर UX की पाबंदियों वाला इंजन अनुमति देता है (UX_RESTRICTIONS_NO_SETUP देखें), तो उपयोगकर्ता से पूछें कि क्या उसे सेटअप की प्रोसेस शुरू करनी है. इसके बाद, VIA के लिए सेटिंग स्क्रीन खोलें.
  3. अगर उपयोगकर्ता ड्राइविंग कर रहा है, तो उसे सूचना दें कि वह सुरक्षित होने पर, विकल्प पर क्लिक करे.

वॉइस इंटरैक्शन सेटअप करने की स्क्रीन बनाना

सेटअप और साइन-इन स्क्रीन को सामान्य गतिविधियों के तौर पर डेवलप किया जाना चाहिए. पहले से लोड की गई सहायता: यूज़र इंटरफ़ेस (यूएक्स) के दिशा-निर्देश में, यूज़र इंटरफ़ेस (यूआई) के डेवलपमेंट के लिए यूएक्स और विज़ुअल दिशा-निर्देश देखें.

सामान्य दिशा-निर्देश:

सेटिंग स्क्रीन लागू करना

सेटिंग इंटिग्रेशन

चौथी इमेज. सेटिंग इंटिग्रेशन

सेटिंग स्क्रीन, Android की सामान्य गतिविधियां होती हैं. अगर इसे लागू किया जाता है, तो VIA मेनिफ़ेस्ट के हिस्से के तौर पर, res/xml/interaction_service.xml में उनके एंट्री पॉइंट का एलान करना ज़रूरी है (मेनिफ़ेस्ट देखें). सेटिंग सेक्शन में, सेटअप जारी रखने और साइन इन करने (अगर उपयोगकर्ता ने इसे पूरा नहीं किया है) के लिए एक अच्छा विकल्प मिलता है. इसके अलावा, ज़रूरत पड़ने पर साइन-आउट या उपयोगकर्ता बदलें विकल्प भी दिया जा सकता है. ऊपर बताई गई सेटअप स्क्रीन की तरह ही, इन स्क्रीन पर ये चीज़ें दिखनी चाहिए:

मेनिफ़ेस्ट फ़ाइल में ज़रूरी अनुमतियां बताना

किसी VIA को मिलने वाली अनुमतियों को तीन कैटगरी में बांटा जा सकता है:

  • सिस्टम हस्ताक्षर की अनुमतियां. ये अनुमतियां, सिर्फ़ पहले से इंस्टॉल किए गए और सिस्टम से साइन किए गए APK को दी जाती हैं. उपयोगकर्ता ये अनुमतियां नहीं दे सकते. सिर्फ़ OEM, सिस्टम इमेज बनाते समय ये अनुमतियां दे सकते हैं. हस्ताक्षर करने की अनुमतियां पाने के बारे में ज़्यादा जानने के लिए, सिस्टम से जुड़ी खास अनुमतियां देना लेख पढ़ें.
  • खतरनाक अनुमतियां. ये ऐसी अनुमतियां हैं जिन्हें उपयोगकर्ता को PermissionsController डायलॉग का इस्तेमाल करके देना होगा. OEM, डिफ़ॉल्ट VoiceInteractionService को इनमें से कुछ अनुमतियां पहले से दे सकते हैं. हालांकि, यह डिफ़ॉल्ट सेटिंग हर डिवाइस के हिसाब से अलग-अलग हो सकती है. इसलिए, ज़रूरत पड़ने पर ऐप्लिकेशन को इन अनुमतियों का अनुरोध करना चाहिए.
  • अन्य अनुमतियां. ये ऐसी अन्य अनुमतियां हैं जिनके लिए उपयोगकर्ता के ऐक्शन की ज़रूरत नहीं होती. ये अनुमतियां, सिस्टम की ओर से अपने-आप मिल जाती हैं.

ऊपर बताई गई बातों को ध्यान में रखते हुए, यहां सिर्फ़ खतरनाक अनुमतियों के लिए अनुरोध करने पर फ़ोकस किया गया है. अनुमतियों का अनुरोध सिर्फ़ तब किया जाना चाहिए, जब उपयोगकर्ता साइन-इन या सेटिंग स्क्रीन पर हो.

अगर ऐप्लिकेशन के पास काम करने के लिए ज़रूरी अनुमतियां नहीं हैं, तो हमारा सुझाव है कि उपयोगकर्ता को स्थिति के बारे में बताने के लिए, बोलकर निर्देश देने की सुविधा का इस्तेमाल करें. साथ ही, सूचना की मदद से उपयोगकर्ता को VIA की सेटिंग स्क्रीन पर वापस जाने का विकल्प दें. ज़्यादा जानकारी के लिए, 1. सूचना का रिमाइंडर.

सेटिंग स्क्रीन के हिस्से के तौर पर अनुमतियों का अनुरोध करना

खतरनाक अनुमतियों का अनुरोध, सामान्य ActivityCompat#requestPermission() तरीके (या इसके बराबर) का इस्तेमाल करके किया जाता है. अनुमतियों का अनुरोध करने के तरीके के बारे में जानने के लिए, ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख पढ़ें.

अनुमतियों का अनुरोध करना

पांचवीं इमेज. अनुमतियों का अनुरोध करना

सूचना सुनने की सुविधा की अनुमति

टीटीआर फ़्लो लागू करने के लिए, वीआईए को सूचना सुनने वाले के तौर पर तय किया जाना चाहिए. यह असल में अनुमति नहीं है, बल्कि एक ऐसा कॉन्फ़िगरेशन है जिसकी मदद से सिस्टम, रजिस्टर किए गए दर्शकों को सूचनाएं भेज सकता है. यह जानने के लिए कि 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);
}

वॉइस प्लेट का यूज़र इंटरफ़ेस (यूआई) लागू करना

जब किसी VoiceInteractionSession को onShow() कॉलबैक मिलता है, तो वह वॉइस प्लेट यूज़र इंटरफ़ेस (यूआई) दिखा सकता है. वॉइस प्लेट लागू करने के लिए विज़ुअल और यूज़र एक्सपीरियंस (UX) से जुड़े दिशा-निर्देशों के लिए,पहले से लोड की गई Assistant: यूज़र एक्सपीरियंस (UX) से जुड़े दिशा-निर्देश देखें.

वॉइस प्लेट दिखाना

छठी इमेज. वॉइस प्लेट दिखाना

इस यूज़र इंटरफ़ेस (यूआई) को लागू करने के दो विकल्प हैं:

  • 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);
    }
    
}

इस तरीके का इस्तेमाल करते समय, हो सकता है कि आपको अपने यूज़र इंटरफ़ेस (यूआई) के छिपे हुए हिस्सों को ध्यान में रखते हुए, VoiceInteractionSession#onComputeInsets() को अडजस्ट करना पड़े.

startAssistantActivity() का इस्तेमाल करना

इस मामले में, VoiceInteractionSession वॉइस प्लैटफ़ॉर्म के यूज़र इंटरफ़ेस (यूआई) को मैनेज करने का काम, किसी सामान्य ऐक्टिविटी को सौंपता है. इस विकल्प का इस्तेमाल करने पर, VoiceInteractionSession इंप्लिकेशन को onPrepareShow() कॉलबैक पर अपनी डिफ़ॉल्ट कॉन्टेंट विंडो बनाने की सुविधा बंद करनी होगी. इसके लिए, onCreateContentView() का इस्तेमाल करना देखें. VoiceInteractionSession#onShow() पर, सेशन VoiceInteractionSession#startAssistantActivity() का इस्तेमाल करके वॉइस प्लैटफ़ॉर्म गतिविधि शुरू करेगा. यह तरीका, सही विंडो सेटिंग और गतिविधि फ़्लैग के साथ यूज़र इंटरफ़ेस (यूआई) को शुरू करता है.

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 के बीच संपर्क बनाए रखने के लिए, इंटरनल इंटेंट या सेवा बाइंडिंग का एक सेट ज़रूरी हो सकता है. उदाहरण के लिए, जब VoiceInteractionSession#onHide() को शुरू किया जाता है, तो सेशन को यह अनुरोध ऐक्टिविटी को भेजना चाहिए.

अहम जानकारी. वाहन संबंधित ऐप्लिकेशन में, गाड़ी चलाते समय सिर्फ़ खास तौर पर एनोटेट की गई गतिविधियां या UXR की "अनुमति वाली सूची" में शामिल गतिविधियां ही दिखाई जा सकती हैं. यह VoiceInteractionSession#startAssistantActivity() से शुरू की गई गतिविधियों पर भी लागू होता है. अपनी गतिविधि के लिए <meta-data android:name="distractionOptimized" android:value="true"/> का इस्तेमाल करके एनोटेट करना न भूलें या इस गतिविधि को /packages/services/Car/service/res/values/config.xml फ़ाइल की systemActivityWhitelist कुंजी में शामिल करें. ज़्यादा जानकारी के लिए, ड्राइवर को ध्यान भटकाने वाले ऐप्लिकेशन इस्तेमाल करने से रोकने के लिए बने दिशा-निर्देश देखें.

आवाज़ पहचानने की सुविधा लागू करना

इस सेक्शन में, हॉटवर्ड का पता लगाने और उन्हें पहचानने की सुविधा की मदद से, आवाज़ पहचानने की सुविधा को लागू करने का तरीका बताया गया है. हॉटवर्ड, ट्रिगर शब्द होता है. इसका इस्तेमाल, बोलकर कोई नई क्वेरी या कार्रवाई शुरू करने के लिए किया जाता है. उदाहरण के लिए, "Ok Google" या "Hey Google".

डीएसपी के हॉटवर्ड का पता लगाना

Android, AlwaysOnHotwordDetector की मदद से डीएसपी लेवल पर, हमेशा चालू हॉटवर्ड डिटेक्टर का ऐक्सेस देता है. सीपीयू के कम इस्तेमाल के साथ हॉटवर्ड डिटेक्शन की सुविधा लागू करने का तरीका. इस सुविधा के इस्तेमाल को दो हिस्सों में बांटा गया है:

  • AlwaysOnHotwordDetector का इंस्टैंशिएशन.
  • हॉटवर्ड डिटेक्शन के लिए, आवाज़ के नमूने से तैयार किए गए मॉडल को रजिस्टर करना.

VoiceInteractionService को लागू करने पर, VoiceInteractionService#createAlwaysOnHotwordDetector() का इस्तेमाल करके हॉटवर्ड डिटेक्टर बनाया जा सकता है. इसके लिए, आपको वह कीवर्ड और स्थानीय भाषा देनी होगी जिसका इस्तेमाल आपको हॉटवर्ड डिटेक्शन के लिए करना है. इस वजह से, ऐप्लिकेशन को इनमें से किसी एक वैल्यू के साथ onAvailabilityChanged() कॉलबैक मिलता है:

  • STATE_HARDWARE_UNAVAILABLE. डिवाइस पर डीएसपी की सुविधा उपलब्ध नहीं है. इस मामले में, सॉफ़्टवेयर के ज़रिए हॉटवर्ड की पहचान करने की सुविधा का इस्तेमाल किया जाता है.
  • STATE_HARDWARE_UNSUPPORTED. आम तौर पर, डीएसपी सहायता उपलब्ध नहीं होती, लेकिन डीएसपी, दिए गए कीवर्ड और स्थान-भाषा के कॉम्बिनेशन के साथ काम नहीं करता. ऐप्लिकेशन, सॉफ़्टवेयर हॉटवर्ड डिटेक्शन का इस्तेमाल करने का विकल्प चुन सकता है.
  • STATE_HARDWARE_ENROLLED. हॉटवर्ड डिटेक्शन की सुविधा अब इस्तेमाल की जा सकती है. इसे startRecognition() तरीके का इस्तेमाल करके शुरू किया जा सकता है.
  • STATE_HARDWARE_UNENROLLED. अनुरोध किए गए कीवर्ड के लिए साउंड मॉडल उपलब्ध नहीं है, लेकिन रजिस्टर किया जा सकता है.

IVoiceInteractionManagerService#updateKeyphraseSoundModel() का इस्तेमाल करके, हॉटवर्ड डिटेक्शन साउंड मॉडल को रजिस्टर किया जा सकता है. एक समय पर सिस्टम में कई मॉडल रजिस्टर किए जा सकते हैं. हालांकि, किसी AlwaysOnHotwordDetector से सिर्फ़ एक मॉडल जुड़ा होता है. ऐसा हो सकता है कि डीएसपी हॉटवर्ड की सुविधा, सभी डिवाइसों पर उपलब्ध न हो. VIA डेवलपर को getDspModuleProperties() के तरीके का इस्तेमाल करके, हार्डवेयर की क्षमताओं की जांच करनी चाहिए. साउंड मॉडल को रजिस्टर करने का तरीका बताने वाला सैंपल कोड देखने के लिए, VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java देखें. एक साथ कई हॉटवर्ड पहचानने की सुविधा के बारे में जानने के लिए, एक साथ कई ऑडियो कैप्चर करना लेख पढ़ें.

सॉफ़्टवेयर से हॉटवर्ड का पता लगाना

जैसा कि ऊपर बताया गया है, हो सकता है कि डीएसपी हॉटवर्ड की पहचान करने की सुविधा सभी डिवाइसों में उपलब्ध न हो. उदाहरण के लिए, Android एमुलेटर में डीएसपी एमुलेटर की सुविधा उपलब्ध नहीं होती. इस मामले में, आवाज़ पहचानने वाला सॉफ़्टवेयर ही एकमात्र विकल्प है. माइक्रोफ़ोन का ऐक्सेस पाने वाले अन्य ऐप्लिकेशन के साथ इंटरफ़ेयर करने से बचने के लिए, वीआईए को ऑडियो इनपुट ऐक्सेस करने के लिए इनका इस्तेमाल करना होगा:

ये दोनों कॉन्स्टेंट @hide हैं और सिर्फ़ बंडल किए गए ऐप्लिकेशन के लिए उपलब्ध हैं.

ऑडियो इनपुट और आवाज़ पहचानने की सुविधा को मैनेज करना

ऑडियो इनपुट को MediaRecorder क्लास का इस्तेमाल करके लागू किया जाएगा. इस एपीआई को इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, MediaRecorder के बारे में खास जानकारी देखें. वॉइस इंटरैक्शन की सेवाओं को भी RecognitionService सबसे बेहतर तरीके से लागू किया जाना चाहिए. सिस्टम में मौजूद कोई भी ऐप्लिकेशन, आवाज़ की पहचान करने की सुविधा का इस्तेमाल करने के लिए, इस API का इस्तेमाल करता है. बोलकर कमांड देने की सुविधा का इस्तेमाल करने और माइक्रोफ़ोन का ऐक्सेस पाने के लिए, VIAs को android.permission.RECORD_AUDIO दबाकर रखना होगा. RecognitionService को लागू करने वाले ऐप्लिकेशन के पास भी यह अनुमति होनी चाहिए.

Android 10 से पहले, माइक्रोफ़ोन का ऐक्सेस एक समय पर सिर्फ़ एक ऐप्लिकेशन को दिया जाता था. हालांकि, हॉटवर्ड की पहचान करने की सुविधा के लिए, यह नियम लागू नहीं होता था. इस बारे में ऊपर बताया गया है. Android 10 से, माइक्रोफ़ोन का ऐक्सेस शेयर किया जा सकता है. ज़्यादा जानकारी के लिए, ऑडियो इनपुट शेयर करना लेख पढ़ें.

ऑडियो आउटपुट ऐक्सेस करना

जब VIA, बोलकर जवाब देने के लिए तैयार हो, तो इन दिशा-निर्देशों का पालन करना ज़रूरी है:

  • ऑडियो फ़ोकस का अनुरोध करते समय या ऑडियो आउटपुट को मैनेज करते समय, ऐप्लिकेशन को ऑडियो एट्रिब्यूट के तौर पर AudioAttributes#USAGE_ASSISTANT और AudioAttributes#CONTENT_TYPE_SPEECH का इस्तेमाल करना होगा.
  • बोली पहचानने की सुविधा के दौरान, AudioManage#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE की मदद से ऑडियो फ़ोकस का अनुरोध करना ज़रूरी है. ध्यान रखें कि जब ऑडियो फ़ोकस हटाया जाता है, तो हो सकता है कि कुछ मीडिया ऐप्लिकेशन, मीडिया निर्देशों (मीडिया निर्देशों को पूरा करना देखें) का ठीक से जवाब न दें.