Ответы мультимедиа позволяют вашим Действиям воспроизводить аудиоконтент, длительность воспроизведения которого превышает 240-секундный предел SSML . Медиа-ответы работают как на устройствах, поддерживающих только звук, так и на устройствах, которые могут отображать визуальный контент. На дисплее ответы мультимедиа сопровождаются визуальным компонентом с элементами управления мультимедиа и (необязательно) неподвижным изображением.
При определении ответа мультимедиа используйте кандидата с поверхностными возможностями RICH_RESPONSE
и LONG_FORM_AUDIO
, чтобы Google Assistant возвращал расширенный ответ только на поддерживаемых устройствах. Вы можете использовать только один расширенный ответ для каждого объекта content
в приглашении.
Аудио для воспроизведения должно быть в правильно отформатированном файле MP3. Файлы MP3 должны размещаться на веб-сервере и быть общедоступными через URL-адрес HTTPS. Прямая трансляция поддерживается только для формата MP3.
![Пример реакции СМИ на умном дисплее](https://developers-dot-devsite-v2-prod.appspot.com/static/assistant/conversational/images/smart-display/media.png?authuser=0000&hl=ru)
Поведение
![Пример ответа СМИ на смартфоне](https://developers-dot-devsite-v2-prod.appspot.com/static/assistant/conversational/images/media.png?authuser=0000&hl=ru)
Основным компонентом реакции СМИ является однопутная карточка. Карта позволяет пользователю делать следующее:
- Воспроизвести последние 10 секунд
- Перейти вперед на 30 секунд.
- Просмотр общей длины медиаконтента
- Просмотр индикатора прогресса воспроизведения мультимедиа
- Просмотр прошедшего времени воспроизведения
Ответы мультимедиа поддерживают следующие элементы управления звуком для голосового взаимодействия, все из которых обрабатываются Google Assistant:
- «Окей, Google, играй».
- «Окей, Google, пауза».
- «Окей, Google, остановись».
- «Окей, Google, начни сначала».
Пользователи также могут контролировать громкость, произнося такие фразы, как «Эй, Google, увеличь громкость». или «Окей, Google, установи громкость на 50 процентов». Намерения в вашем действии имеют приоритет, если они обрабатывают похожие обучающие фразы. Позвольте Ассистенту обрабатывать эти запросы пользователей, если у вашего действия нет особой причины.
Поведение на телефонах Android
На телефонах Android элементы управления мультимедиа также доступны, когда телефон заблокирован. Элементы управления мультимедиа также отображаются в области уведомлений, и пользователи могут видеть ответы мультимедиа при выполнении любого из следующих условий:
- Google Ассистент находится на переднем плане, а экран телефона включен.
- Пользователь покидает Google Assistant во время воспроизведения звука и возвращается в Google Assistant в течение 10 минут после завершения воспроизведения. Вернувшись в Google Assistant, пользователь видит медиа-карту и чипы подсказок.
Характеристики
Реакция СМИ обладает следующими свойствами:
Свойство | Тип | Требование | Описание |
---|---|---|---|
media_type | MediaType | Необходимый | Тип носителя предоставленного ответа. Возвращайте MEDIA_STATUS_ACK при подтверждении статуса мультимедиа. |
start_offset | нить | Необязательный | Найдите позицию для запуска первой медиа-дорожки. Укажите значение в секундах, причем дробные секунды выражаются не более чем девятью десятичными знаками и заканчиваются суффиксом «s». Например, 3 секунды и 1 наносекунда выражаются как «3,000000001 с». |
optional_media_controls | массив OptionalMediaControls | Необязательный | Свойство согласия на получение обратных вызовов, когда пользователь меняет статус воспроизведения мультимедиа (например, приостанавливает или останавливает воспроизведение мультимедиа). |
media_objects | массив MediaObject | Необходимый | Представляет объекты мультимедиа, которые необходимо включить в приглашение. При подтверждении статуса мультимедиа с помощью MEDIA_STATUS_ACK не предоставляйте медиа-объекты. |
first_media_object_index | целое число | Необязательный | Отсчитываемый от 0 индекс первого MediaObject в media_objects для воспроизведения. Если значение не указано, равно нулю или выходит за пределы, воспроизведение начинается с первого 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 возвращает событие статуса из следующего списка на основе хода воспроизведения мультимедиа и запросов пользователей:
-
FINISHED
: пользователь завершил воспроизведение мультимедиа (или переходит к следующему фрагменту мультимедиа), и переход не к выходу из разговора. Этот статус также соответствует системному намерениюMEDIA_STATUS_FINISHED
. -
PAUSED
: Пользователь приостановил воспроизведение мультимедиа. Подтвердите свое согласие на получение этого события состояния с помощью свойстваoptional_media_controls
. Этот статус также соответствует системному намерениюMEDIA_STATUS_PAUSED
. -
STOPPED
: Пользователь остановил или завершил воспроизведение мультимедиа. Подтвердите свое согласие на получение этого события состояния с помощью свойстваoptional_media_controls
. Этот статус также соответствует системному намерениюMEDIA_STATUS_STOPPED
. -
FAILED
: Не удалось воспроизвести медиафайлы. Этот статус также соответствует системному намерениюMEDIA_STATUS_FAILED
.
Во время воспроизведения мультимедиа пользователь может предоставить запрос, который можно интерпретировать как событие паузы и остановки мультимедиа (например, «стоп», «отмена» или «выход»). В этой ситуации Ассистент предоставляет системное намерение actions.intent.CANCEL
для вашего действия, генерирует событие статуса мультимедиа со значением статуса «ОСТАНОВЛЕНО» и полностью завершает ваше действие.
Когда Ассистент генерирует событие статуса мультимедиа со значением статуса 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.'); } });
Вернуть плейлист
Вы можете добавить в ответ несколько аудиофайлов, чтобы создать список воспроизведения. После завершения воспроизведения первой дорожки автоматически воспроизводится следующая дорожка, и это продолжается до тех пор, пока не будет воспроизведена каждая дорожка. Пользователи также могут нажать кнопку «Далее» на экране или сказать «Далее» или что-то подобное, чтобы перейти к следующему треку.
Кнопка «Далее» неактивна на последнем треке плейлиста. Однако если вы включите режим зацикливания, список воспроизведения начнется заново с первого трека. Дополнительные сведения о режиме цикла см. в разделе Реализация режима цикла .
Чтобы создать список воспроизведения, включите более одного MediaObject
в массив media_objects
. В следующем фрагменте кода показано приглашение, которое возвращает список воспроизведения из трех треков:
{ "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" } } } ] }