मीडिया से मिले जवाब

मीडिया से मिले जवाबों की मदद से, आपकी कार्रवाइयों को SSML की 240 सेकंड की सीमा से ज़्यादा देर तक ऑडियो कॉन्टेंट चलाने की सुविधा मिलती है. मीडिया रिस्पॉन्स, सिर्फ़ ऑडियो वाले डिवाइस और विज़ुअल कॉन्टेंट दिखाने वाले डिवाइस, दोनों पर काम करते हैं. डिसप्ले पर, मीडिया रिस्पॉन्स के साथ एक विज़ुअल कॉम्पोनेंट शामिल होता है. इस कॉम्पोनेंट में मीडिया कंट्रोल और (वैकल्पिक तौर पर) एक इमेज शामिल होती है.

मीडिया से जुड़े जवाब तय करते समय, RICH_RESPONSE और LONG_FORM_AUDIO, दोनों प्लैटफ़ॉर्म पर किसी उम्मीदवार का इस्तेमाल करें, ताकि Google Assistant सिर्फ़ उन डिवाइस पर ही बेहतर जवाब दे पाए जिन पर यह सुविधा काम करती है. प्रॉम्प्ट में हर content ऑब्जेक्ट के लिए, सिर्फ़ एक रिच रिस्पॉन्स का इस्तेमाल किया जा सकता है.

प्लेबैक के लिए, ऑडियो सही तरीके से फ़ॉर्मैट की गई MP3 फ़ाइल में होना चाहिए. MP3 फ़ाइलों को वेब सर्वर पर होस्ट किया जाना चाहिए और वे एचटीटीपीएस यूआरएल पर सार्वजनिक तौर पर उपलब्ध होनी चाहिए. लाइव स्ट्रीमिंग की सुविधा सिर्फ़ MP3 फ़ॉर्मैट में काम करती है.

स्मार्ट डिसप्ले पर मीडिया से मिले जवाब का उदाहरण
पहली इमेज. स्मार्ट डिसप्ले पर मीडिया से मिले जवाब का उदाहरण

व्यवहार

स्मार्टफ़ोन पर मीडिया से मिले जवाब का उदाहरण
दूसरी इमेज. स्मार्टफ़ोन पर मीडिया जवाब का उदाहरण

मीडिया से जुड़े जवाब का मुख्य कॉम्पोनेंट, सिंगल-ट्रैक कार्ड होता है. कार्ड की मदद से, उपयोगकर्ता ये काम कर सकते हैं:

  • पिछले 10 सेकंड फिर से चलाएं
  • इसे 30 सेकंड आगे बढ़ाएं
  • मीडिया कॉन्टेंट की कुल अवधि देखना
  • मीडिया चलाने के लिए प्रोग्रेस इंडिकेटर देखना
  • वीडियो चलाने का बीता समय देखें

मीडिया से जुड़े रिस्पॉन्स में, ऑडियो इंटरैक्शन के लिए ये ऑडियो कंट्रोल काम करते हैं. ये कंट्रोल Google Assistant मैनेज करती है:

  • "Ok Google, चलाओ.”
  • “Ok Google, रोको.”
  • “Ok Google, रुको.”
  • “Ok Google, फिर से शुरू करो.”

उपयोगकर्ता, "Ok Google, आवाज़ तेज़ करो " या "Ok Google, आवाज़ को 50 प्रतिशत पर सेट करो" जैसे वाक्यांशों का इस्तेमाल करके भी आवाज़ कंट्रोल कर सकते हैं." अगर आपकी कार्रवाई में सेट किए गए इंटेंट, ट्रेनिंग वाले मिलते-जुलते वाक्यांशों को हैंडल करते हैं, तो उन्हें प्राथमिकता दी जाएगी. अगर आपकी सेट की गई कार्रवाई में कोई खास वजह नहीं है, तो Assistant को उपयोगकर्ता के इन अनुरोधों को हैंडल करने की अनुमति दें.

Android फ़ोन पर व्यवहार

Android फ़ोन पर, फ़ोन लॉक होने पर भी मीडिया कंट्रोल उपलब्ध होते हैं. मीडिया कंट्रोल, सूचना वाली जगह में भी दिखते हैं. साथ ही, यहां दी गई किसी भी स्थिति के पूरा होने पर, उपयोगकर्ता मीडिया की प्रतिक्रियाएं देख सकते हैं:

  • Google Assistant फ़ोरग्राउंड में है और फ़ोन की स्क्रीन चालू है.
  • ऑडियो चलने के दौरान उपयोगकर्ता Google Assistant से चला जाता है. वह वीडियो पूरा होने के 10 मिनट के अंदर, Google Assistant पर वापस आ जाता है. Google Assistant पर लौटने पर, उपयोगकर्ता को मीडिया कार्ड और सुझाव वाले चिप दिखते हैं.

प्रॉपर्टी

मीडिया से जुड़े रिस्पॉन्स में ये प्रॉपर्टी होती हैं:

प्रॉपर्टी Type ज़रूरी शर्त ब्यौरा
media_type MediaType ज़रूरी है दिए गए जवाब का मीडिया प्रकार. मीडिया की स्थिति स्वीकार करते समय, MEDIA_STATUS_ACK दिखाएं.
start_offset स्ट्रिंग ज़रूरी नहीं पहला मीडिया ट्रैक शुरू करने के लिए, स्क्रीन की पोज़िशन पर जाएं. वैल्यू सेकंड में दें, जिसमें फ़्रैक्शनल सेकंड में नौ से ज़्यादा दशमलव स्थान नहीं होते. साथ ही, अंत में सफ़िक्स "s" आता है. उदाहरण के लिए, तीन सेकंड और एक नैनोसेकंड को "3.000000001s" के तौर पर दिखाया जाता है.
optional_media_controls OptionalMediaControls की कैटगरी ज़रूरी नहीं जब कोई उपयोगकर्ता अपने मीडिया प्लेबैक की स्थिति बदलता है (जैसे, मीडिया प्लेबैक को रोककर या बंद करके), तो कॉलबैक पाने के लिए प्रॉपर्टी को ऑप्ट-इन करें.
media_objects MediaObject की कैटगरी ज़रूरी है प्रॉम्प्ट में शामिल करने के लिए, मीडिया ऑब्जेक्ट के बारे में बताता है. MEDIA_STATUS_ACK के साथ मीडिया के स्टेटस को स्वीकार करते समय, मीडिया ऑब्जेक्ट न दें.
first_media_object_index पूर्णांक ज़रूरी नहीं media_objects में चलने वाले पहले MediaObject का 0-आधारित इंडेक्स. अगर तय नहीं किया गया है, शून्य या सीमा से बाहर है, तो वीडियो पहले MediaObject पर शुरू होगा.
repeat_mode RepeatMode ज़रूरी नहीं मीडिया ऑब्जेक्ट की सूची के लिए दोहराएं मोड.

नमूना कोड

वाईएएमएल

candidates:
  - first_simple:
      variants:
        - speech: This is a media response.
    content:
      media:
        start_offset: 2.12345s
        optional_media_controls:
          - PAUSED
          - STOPPED
        media_objects:
          - name: Media name
            description: Media description
            url: 'https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3'
            image:
              large:
                url: 'https://storage.googleapis.com/automotive-media/album_art.jpg'
                alt: Jazz in Paris album art
        media_type: AUDIO

JSON

{
  "candidates": [
    {
      "first_simple": {
        "variants": [
          {
            "speech": "This is a media response."
          }
        ]
      },
      "content": {
        "media": {
          "start_offset": "2.12345s",
          "optional_media_controls": [
            "PAUSED",
            "STOPPED"
          ],
          "media_objects": [
            {
              "name": "Media name",
              "description": "Media description",
              "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
              "image": {
                "large": {
                  "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
                  "alt": "Jazz in Paris album art"
                }
              }
            }
          ],
          "media_type": "AUDIO"
        }
      }
    }
  ]
}

Node.js

// Media response
app.handle('media', (conv) => {
  conv.add('This is a media response');
  conv.add(new Media({
    mediaObjects: [
      {
        name: 'Media name',
        description: 'Media description',
        url: 'https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
        image: {
          large: JAZZ_IN_PARIS_IMAGE,
        }
      }
    ],
    mediaType: 'AUDIO',
    optionalMediaControls: ['PAUSED', 'STOPPED'],
    startOffset: '2.12345s'
  }));
});

JSON

{
  "session": {
    "id": "session_id",
    "params": {},
    "languageCode": ""
  },
  "prompt": {
    "override": false,
    "content": {
      "media": {
        "mediaObjects": [
        {
          "name": "Media name",
          "description": "Media description",
          "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
          "image": {
            "large": {
              "alt": "Jazz in Paris album art",
              "height": 0,
              "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
              "width": 0
            }
          }
        }
        ],
        "mediaType": "AUDIO",
        "optionalMediaControls": [
          "PAUSED",
          "STOPPED"
        ]
      }
    },
    "firstSimple": {
      "speech": "This is a media response",
      "text": "This is a media response"
    }
  }
}

मीडिया की स्थिति ऐक्सेस की जा रही है

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

Google Assistant, मीडिया चलाने की स्थिति और उपयोगकर्ता की क्वेरी के आधार पर, नीचे दी गई सूची में से स्टेटस इवेंट दिखाती है:

  • FINISHED: उपयोगकर्ता ने मीडिया चलाना पूरा कर लिया है (या मीडिया के अगले हिस्से पर चला जाता है) और ट्रांज़िशन का मतलब नहीं है कि वह बातचीत के एग्ज़िट पर है. यह स्थिति MEDIA_STATUS_FINISHED सिस्टम इंटेंट के साथ भी मैप की जाती है.
  • PAUSED: उपयोगकर्ता ने मीडिया चलाना रोक दिया है. optional_media_controls प्रॉपर्टी के साथ, इस स्टेटस इवेंट को पाने के लिए ऑप्ट इन करें. यह स्थिति MEDIA_STATUS_PAUSED सिस्टम इंटेंट के साथ भी मैप की जाती है.
  • STOPPED: उपयोगकर्ता ने मीडिया चलाना रोका या बंद किया. optional_media_controls प्रॉपर्टी के साथ, इस स्टेटस इवेंट को पाने के लिए ऑप्ट इन करें. यह स्टेटस, MEDIA_STATUS_STOPPED सिस्टम इंटेंट को भी मैप करता है.
  • FAILED: मीडिया नहीं चलाया जा सका. यह स्थिति MEDIA_STATUS_FAILED सिस्टम इंटेंट के साथ भी मैप की जाती है.

मीडिया चलाने के दौरान, उपयोगकर्ता कोई ऐसी क्वेरी पूछ सकता है जिसे मीडिया रोकने और बंद करने वाले इवेंट, जैसे कि "बंद करें", "रद्द करें" या "बाहर निकलें", दोनों के तौर पर समझा जा सकता है. ऐसी स्थिति में, Assistant आपकी सेट की गई कार्रवाई के लिए, actions.intent.CANCEL सिस्टम इंटेंट उपलब्ध कराती है. साथ ही, "STOPPED" स्टेटस वैल्यू के साथ मीडिया स्टेटस इवेंट जनरेट करती है और आपकी सेट की गई कार्रवाई से पूरी तरह बाहर निकल जाती है.

जब Assistant PAUSED या STOPPED स्टेटस वैल्यू के साथ कोई मीडिया स्टेटस इवेंट जनरेट करती है, तो मीडिया रिस्पॉन्स के साथ जवाब दें. जवाब में सिर्फ़ एक सहमति (MEDIA_STATUS_ACK टाइप का) होनी चाहिए.

मीडिया की प्रोग्रेस

वेबहुक अनुरोधों के लिए, मीडिया चलाने की मौजूदा प्रोग्रेस context.media.progress फ़ील्ड में उपलब्ध होती है. मीडिया प्लेबैक शुरू होने के समय के ऑफ़सेट के हिसाब से भी, मीडिया प्रोग्रेस का इस्तेमाल किया जा सकता है. इससे मीडिया वहीं से चलाया जाएगा जहां से मीडिया खत्म हुआ है. मीडिया रिस्पॉन्स पर शुरुआत के समय का ऑफ़सेट लागू करने के लिए, start_offset प्रॉपर्टी का इस्तेमाल करें.

नमूना कोड

Node.js

// Media status
app.handle('media_status', (conv) => {
  const mediaStatus = conv.intent.params.MEDIA_STATUS.resolved;
  switch(mediaStatus) {
    case 'FINISHED':
      conv.add('Media has finished playing.');
      break;
    case 'FAILED':
      conv.add('Media has failed.');
      break;
    case 'PAUSED' || 'STOPPED':
      if (conv.request.context) {
        // Persist the media progress value
        const progress = conv.request.context.media.progress;
      }
      // Acknowledge pause/stop
      conv.add(new Media({
        mediaType: 'MEDIA_STATUS_ACK'
        }));
      break;
    default:
      conv.add('Unknown media status received.');
  }
});

प्लेलिस्ट वापस करना

प्लेलिस्ट बनाने के लिए, अपने जवाब में एक से ज़्यादा ऑडियो फ़ाइलें जोड़ी जा सकती हैं. पहला ट्रैक चलने के बाद, अगला ट्रैक अपने-आप चलने लगता है. यह हर ट्रैक के चलने तक जारी रहता है. उपयोगकर्ता स्क्रीन पर आगे बढ़ें बटन को भी दबा सकते हैं या अगले ट्रैक पर जाने के लिए "आगे बढ़ें" या ऐसा ही कुछ कह सकते हैं.

प्लेलिस्ट के आखिरी ट्रैक में, आगे बढ़ें बटन बंद होता है. हालांकि, अगर लूप मोड चालू किया जाता है, तो प्लेलिस्ट पहले ट्रैक से फिर से शुरू होती है. लूपिंग मोड के बारे में ज़्यादा जानने के लिए, लूपिंग मोड लागू करना लेख पढ़ें.

प्लेलिस्ट बनाने के लिए, media_objects कलेक्शन में एक से ज़्यादा MediaObject शामिल करें. नीचे दिया गया कोड स्निपेट एक प्रॉम्प्ट दिखाता है, जो तीन ट्रैक की एक प्लेलिस्ट दिखाता है:

{
  "candidates": [
    {
      "content": {
        "media": {
          "media_objects": [
            {
              "name": "1. Jazz in Paris",
              "description": "Song 1 of 3",
              "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
              "image": {
                "large": {
                  "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
                  "alt": "Album cover of an ocean view",
                  "height": 1600,
                  "width": 1056
                }
              }
            },
            {
              "name": "2. Jazz in Paris",
              "description": "Song 2 of 3",
              "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
              "image": {
                "large": {
                  "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
                  "alt": "Album cover of an ocean view",
                  "height": 1600,
                  "width": 1056
                }
              }
            },
            {
              "name": "3. Jazz in Paris",
              "description": "Song 3 of 3",
              "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
              "image": {
                "large": {
                  "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
                  "alt": "Album cover of an ocean view",
                  "height": 1600,
                  "width": 1056
                }
              }
            }
          ],
        }
      }
    }
  ]
}

लूपिंग मोड लागू करना

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

लूप मोड लागू करने के लिए, अपने प्रॉम्प्ट में repeat_mode फ़ील्ड जोड़ें और उसकी वैल्यू को ALL पर सेट करें. इससे आखिरी मीडिया ऑब्जेक्ट के खत्म होने पर, आपका मीडिया रिस्पॉन्स पहले मीडिया ऑब्जेक्ट की शुरुआत में चला जाता है.

नीचे दिया गया कोड स्निपेट, लूप में चलने वाले ट्रैक को लौटाने वाला प्रॉम्प्ट दिखाता है:

{
  "candidates": [
    {
      "content": {
        "media": {
          "media_objects": [
            {
              "name": "Jazz in Paris",
              "description": "Single song (repeated)",
              "url": "https://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3",
              "image": {
                "large": {
                  "url": "https://storage.googleapis.com/automotive-media/album_art.jpg",
                  "alt": "Album cover of an ocean view",
                  "height": 1600,
                  "width": 1056
                }
              }
            }
          ],
          "repeat_mode": "ALL"
        }
      }
    }
  ]
}