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

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

  1. वीआईए स्केलेटन बनाएं.
  2. (ज़रूरी नहीं) सेटअप/साइन-इन फ़्लो लागू करें.
  3. (ज़रूरी नहीं) सेटिंग वाली स्क्रीन लागू करें.
  4. मेनिफ़ेस्ट फ़ाइल में ज़रूरी अनुमतियां बताएं.
  5. वॉइस प्लेट का यूज़र इंटरफ़ेस (यूआई) लागू करें.
  6. आवाज़ पहचानने की सुविधा लागू करें. इसमें RecognitionService API को लागू करना ज़रूरी है.
  7. उच्चारण को लागू करें (इसकी जगह TextToSpeech API को भी लागू करने का विकल्प है).
  8. कमांड पूरा करने की सुविधा लागू करें. यह कॉन्टेंट, कमांड पूरा करना में देखें.

यहां दिए गए सेक्शन में, ऊपर बताए गए हर चरण को पूरा करने का तरीका बताया गया है.

वीआईए स्केलेटन बनाना

मेनिफ़ेस्ट

किसी ऐप्लिकेशन में वॉइस इंटरैक्शन है या नहीं, यह मेनिफ़ेस्ट में मौजूद इन चीज़ों से पता चलता है:

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>

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

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

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 किसी वीआईए का एंट्रीपॉइंट होता है. इस सेवा की मुख्य ज़िम्मेदारियां ये हैं:

  • ऐसी सभी प्रोसेस शुरू करना जिनका इस वीआईए के चालू रहने तक चलना ज़रूरी है. उदाहरण के लिए, हॉटवर्ड की पहचान.
  • साथ काम करने वाली, बोलकर की जाने वाली कार्रवाइयों की रिपोर्ट करना (वॉइस असिस्टेंट की 'टैप करके सुनें' सुविधा देखें).
  • लॉक स्क्रीन (कीगार्ड) से वॉइस इंटरैक्शन सेशन शुरू करना.

सबसे आसान तरीके से, 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 की पूरी सूची देखने के लिए दस्तावेज़ देखें.

सेटअप/साइन-इन फ़्लो लागू करना

सेटअप और साइन-इन कई जगह किया जा सकता है:

  • डिवाइस को ऑनबोर्ड करने के दौरान (सेटअप विज़र्ड).
  • बोलकर निर्देश देने की सुविधा की सेवा बदलने के दौरान (सेटिंग).
  • ऐप्लिकेशन को पहली बार लॉन्च करने पर.

सुझाए गए उपयोगकर्ता अनुभव और विज़ुअल निर्देश के बारे में ज़्यादा जानने के लिए, पहले से लोड की गई असिस्टेंट: उपयोगकर्ता अनुभव से जुड़े दिशा-निर्देश देखें.

वॉइस सेवा बदलने के दौरान सेटअप करना

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

  • उपयोगकर्ता ने सेटअप विज़र्ड को पूरी तरह से स्किप किया हो या उसने वॉइस इंटरैक्शन कॉन्फ़िगरेशन के चरण को स्किप किया हो.
  • उपयोगकर्ता ने डिवाइस को शामिल करने के दौरान कॉन्फ़िगर किए गए वीआईए से अलग वीआईए चुना हो.

किसी भी मामले में, VoiceInteractionService के पास उपयोगकर्ता से सेटअप पूरा करवाने के कई तरीके हैं:

  • सूचना के तौर पर रिमाइंडर.
  • इसके इस्तेमाल की कोशिश पर, अपने-आप बोलकर दिया गया जवाब.

ध्यान दें: हमारा सुझाव है कि उपयोगकर्ता के अनुरोध के बिना, वीआईए सेटअप फ़्लो को न दिखाएं. इसका मतलब है कि डिवाइस के बूट होने के दौरान, वीआईए को एचयू पर कॉन्टेंट अपने-आप दिखने से रोकना चाहिए. ऐसा तब भी किया जाना चाहिए जब उपयोगकर्ता डिवाइस को स्विच या अनलॉक करे.

सूचना के तौर पर रिमाइंडर

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

सूचना के तौर पर रिमाइंडर

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

यह प्रोसेस इस तरह से काम करेगी:

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

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

बोलकर दिया गया जवाब

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • (ज़रूरी नहीं) CarAssistUtils#assistantIsNotificationListener() का इस्तेमाल करके, पहले से यह देखें कि सूचना सुनने वाले लोग मौजूद हैं या नहीं. उदाहरण के लिए, सेटअप फ़्लो के दौरान ऐसा किया जा सकता है.
  • (ज़रूरी) CarVoiceInteractionSession#onShow() को कार्रवाई VOICE_ACTION_HANDLE_EXCEPTION और अपवाद EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING के साथ मैनेज करने के लिए प्रतिक्रिया दें.

अगर यह ऐक्सेस पहले से नहीं दिया गया है, तो वीआईए को उपयोगकर्ता को कार की सेटिंग के सूचना ऐक्सेस सेक्शन पर ले जाना चाहिए. इसके लिए, उसे निर्देश बोलने होंगे और सूचनाएं भेजनी होंगी. सेटिंग ऐप्लिकेशन का सही सेक्शन खोलने के लिए, यहां दिए गए कोड का इस्तेमाल किया जा सकता है:

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

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

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

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

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

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

  • 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() को शुरू किया जाता है, तो सेशन को यह अनुरोध ऐक्टिविटी को भेजना चाहिए.

अहम जानकारी. Automotive में, ड्राइविंग के दौरान सिर्फ़ खास तौर पर एनोटेट की गई गतिविधियां या 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 से सिर्फ़ एक मॉडल जुड़ा होता है. ऐसा हो सकता है कि डीएसपी हॉटवर्ड की सुविधा, सभी डिवाइसों पर उपलब्ध न हो. वीआईए डेवलपर को getDspModuleProperties() तरीके का इस्तेमाल करके, हार्डवेयर की क्षमताओं की जांच करनी चाहिए. साउंड मॉडल को रजिस्टर करने का तरीका बताने वाला सैंपल कोड देखने के लिए, VoiceEnrollment/src/com/android/test/voiceenrollment/EnrollmentUtil.java देखें. एक साथ कई हॉटवर्ड पहचानने की सुविधा के बारे में जानने के लिए, एक साथ कई ऑडियो कैप्चर करना लेख पढ़ें.

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

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

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

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

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

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

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

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

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