ऐप्लिकेशन डेवलपमेंट

वॉइस इंटरेक्शन एप्लिकेशन (VIA) को लागू करने के लिए, आप इन चरणों को पूरा करते हैं:

  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>

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

  • 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

निम्नलिखित चित्र इनमें से प्रत्येक इकाई के जीवन-चक्र को दर्शाता है:

जीवन चक्र

चित्र 1. जीवनचक्र

जैसा कि पहले कहा गया है, VoiceInteractionService 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() का कार्यान्वयन आवश्यक है। एक 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 सेटअप प्रवाह प्रस्तुत करने की दृढ़ता से अनुशंसा नहीं की जाती है। इसका मतलब यह है कि वीआईए को डिवाइस बूट के दौरान या उपयोगकर्ता स्विच या अनलॉक के परिणामस्वरूप एचयू पर सामग्री को स्वचालित रूप से प्रदर्शित करने से बचना चाहिए।

अधिसूचना अनुस्मारक

अधिसूचना अनुस्मारक सेटअप की आवश्यकता को इंगित करने और उपयोगकर्ताओं को सहायक सेटअप प्रवाह में नेविगेट करने की क्षमता प्रदान करने का एक गैर-दखल देने वाला तरीका है।

अधिसूचना अनुस्मारक

चित्र 2. अधिसूचना अनुस्मारक

यहां बताया गया है कि यह प्रवाह कैसे काम करेगा:

अधिसूचना अनुस्मारक प्रवाह

चित्र 3. अधिसूचना अनुस्मारक प्रवाह

आवाज उत्तर

इसे लागू करने के लिए यह सबसे सरल प्रवाह है, VoiceInteractionSession#onShow() कॉलबैक पर एक उच्चारण आरंभ करना, उपयोगकर्ता को समझाना कि क्या करने की आवश्यकता है, और फिर उनसे पूछना (यदि UX प्रतिबंध स्थिति को देखते हुए सेटअप की अनुमति है) यदि वे आरंभ करना चाहते हैं सेटअप प्रवाह. यदि उस समय सेटअप संभव नहीं है, तो इस स्थिति को भी स्पष्ट करें।

प्रथम उपयोग पर सेटअप

उपयोगकर्ता के लिए ऐसे VIA को ट्रिगर करना हमेशा संभव होता है जिसे ठीक से कॉन्फ़िगर नहीं किया गया हो। इस तरह के मामलों में:

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

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

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

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

  • VIA को उपयोगकर्ताओं को किसी भी समय सेटअप को बाधित करने और फिर से शुरू करने की अनुमति देनी चाहिए।
  • यदि UX_RESTRICTIONS_NO_SETUP प्रतिबंध प्रभावी है तो सेटअप की अनुमति नहीं दी जानी चाहिए। विवरण के लिए, ड्राइवर व्याकुलता दिशानिर्देश देखें।
  • सेटअप स्क्रीन को प्रत्येक वाहन के डिज़ाइन सिस्टम से मेल खाना चाहिए। सामान्य स्क्रीन लेआउट, आइकन, रंग और अन्य पहलू बाकी यूआई के अनुरूप होने चाहिए। विवरण के लिए अनुकूलन देखें.

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

सेटिंग्स एकीकरण

चित्र 4. सेटिंग्स एकीकरण

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

  • स्क्रीन स्टैक में पिछली स्क्रीन पर वापस बाहर निकलने का विकल्प प्रदान करें (उदाहरण के लिए, कार सेटिंग्स पर)।
  • वाहन चलाते समय अनुमति नहीं दी जाएगी। विवरण के लिए, ड्राइवर व्याकुलता दिशानिर्देश देखें।
  • प्रत्येक वाहन डिज़ाइन प्रणाली का मिलान करें। विवरण के लिए, अनुकूलन देखें।

मेनिफेस्ट फ़ाइल में आवश्यक अनुमतियाँ घोषित करें

VIA द्वारा आवश्यक अनुमतियों को तीन श्रेणियों में विभाजित किया जा सकता है:

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

उपरोक्त को देखते हुए, निम्नलिखित अनुभाग केवल खतरनाक अनुमतियों का अनुरोध करने पर केंद्रित है। अनुमतियों का अनुरोध केवल तभी किया जाना चाहिए जब उपयोगकर्ता साइन-इन या सेटिंग स्क्रीन पर हो।

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

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

नियमित ActivityCompat#requestPermission() विधि (या समकक्ष) का उपयोग करके खतरनाक अनुमतियों का अनुरोध किया जाता है। अनुमतियों का अनुरोध करने के तरीके के बारे में विवरण के लिए, ऐप अनुमतियों का अनुरोध करें देखें।

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

चित्र 5. अनुमतियों का अनुरोध करें

अधिसूचना श्रोता की अनुमति

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

  • (वैकल्पिक) 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() कॉलबैक प्राप्त होता है, तो यह एक वॉयस प्लेट UI प्रस्तुत कर सकता है। वॉयस प्लेट कार्यान्वयन पर दृश्य और यूएक्स दिशानिर्देशों के लिए, प्रीलोडेड असिस्टेंट: यूएक्स गाइडेंस देखें।

वॉयस प्लेट प्रदर्शित करना

चित्र 6. वॉयस प्लेट प्रदर्शित करना

इस यूआई को कार्यान्वित करने के तरीके पर दो विकल्प हैं:

  • 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() समायोजित करना चाह सकते हैं।

स्टार्टअसिस्टेंटएक्टिविटी() का उपयोग करें

इस मामले में, 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 कुंजी में शामिल करें। /packages/services/Car/service/res/values/config.xml फ़ाइल। अधिक जानकारी के लिए, ड्राइवर व्याकुलता दिशानिर्देश देखें।

ध्वनि पहचान लागू करें

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

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

एंड्रॉइड AlwaysOnHotwordDetector के माध्यम से डीएसपी स्तर पर हमेशा चालू रहने वाले हॉटवर्ड डिटेक्टर तक पहुंच प्रदान करता है। कम CPU के साथ हॉटवर्ड पहचान लागू करने का तरीका। इस कार्यक्षमता के उपयोग को दो भागों में विभाजित किया गया है:

  • AlwaysOnHotwordDetector का इंस्टेंटेशन।
  • हॉटवर्ड डिटेक्शन साउंड मॉडल का नामांकन।

VoiceInteractionService कार्यान्वयन VoiceInteractionService#createAlwaysOnHotwordDetector() का उपयोग करके एक हॉटवर्ड डिटेक्टर बना सकता है, एक कीफ़्रेज़ और लोकेल पास कर सकता है जिसे वे पहचान के लिए उपयोग करना चाहते हैं। परिणामस्वरूप, ऐप को निम्नलिखित संभावित मानों में से एक के साथ onAvailabilityChanged() कॉलबैक प्राप्त होता है:

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

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

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

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

ये दोनों स्थिरांक @hide हैं और केवल बंडल किए गए ऐप्स के लिए उपलब्ध हैं।

ऑडियो इनपुट और ध्वनि पहचान प्रबंधित करें

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

एंड्रॉइड 10 से पहले, माइक्रोफ़ोन एक्सेस एक समय में केवल एक ऐप को दिया जाता था (हॉटवर्ड डिटेक्शन के अपवाद के साथ, ऊपर देखें)। एंड्रॉइड 10 से शुरू करके, माइक्रोफ़ोन एक्सेस साझा किया जा सकता है। अधिक जानकारी के लिए ऑडियो इनपुट साझा करना देखें।

ऑडियो आउटपुट तक पहुंचें

जब वीआईए मौखिक प्रतिक्रिया देने के लिए तैयार है, तो दिशानिर्देशों के इस अगले सेट का पालन करना महत्वपूर्ण है:

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