Как отправить несколько выписок в приложении Google Assistant?

Я создаю приложение Google Assistant для создания цитат. В настоящее время я использую Api.ai с веб-перехватчик ApiAi NodeJs. Я хотел, чтобы мой ответ был таким:

Innovation is the only way to win.
By Steve Jobs
Want one more?

Обратите внимание, что все три строки являются разными строками. Я знаю, что это возможно, если я просто использую ux api.ai без веб-перехватчика (используя несколько простых ответов), но я не могу понять, как это сделать в сочетании с веб-перехватчиком.

Я старался:

assistant.ask("Innovation is the only way to win.");
assistant.ask("By Steve Jobs");
assistant.ask("Want one more?");

Но, кажется, говорит только первое предложение. Я также попытался заменить его на:

assistant.tell("Innovation is the only way to win.");
assistant.tell("By Steve Jobs");
assistant.ask("Want one more?");

Но он выходит сразу после первого оператора. Как это сделать?


person frunkad    schedule 05.08.2017    source источник


Ответы (2)


И ask(), и tell() принимают свои параметры и отправляют ответ. Единственная разница в том, что ask() продолжает разговор, ожидая, что пользователь что-то скажет в ответ, а tell() указывает на то, что разговор окончен. Если вы думаете об этом с точки зрения веб-сервера, и ask(), и tell() отправляют обратно эквивалент страницы, а затем закрывают соединение, но ask() включает форму на страницу, а tell() нет.

Оба они могут принимать объект RichResponse, который может включать одну или две строки или Объекты SimpleResponse, которые будут отображаться в виде всплывающих окон чата. Однако вы не можете сделать три, по крайней мере, согласно документации. Таким образом, кажется, что лучше всего будет включить один SimpleResponse с цитатой и авторством, а второй с подсказкой для другого.

Это также похоже на случай, когда вы хотите, чтобы аудио отличалось от отображаемого текста. В этом случае вам нужно построить SimpleResponse так, чтобы он имел как поля speech, так и поля displayText.

Это может выглядеть примерно так (хотя я не тестировал код):

var simpleResponse = {
  speech: 'Steve Jobs said "Innovation is the only way to win."',
  displayText: '"Innovation is the only way to win." -- Steve Jobs'
};
var richResponse = assistant.buildRichResponse();
richResponse.addSimpleResponse(simpleResponse);
richResponse.addSimpleResponse('Do you want another?');
assistant.ask( richResponse );

Это также позволит вам делать такие вещи, как добавление карточек в середине этих двух аннотаций, которые могут, например, содержать изображение человека, о котором идет речь. Для этого вы должны вызвать метод richResponse.addBasicCard() с объектом BasicCard. Это может быть даже лучше визуально, чем включение атрибуции цитаты во вторую строку.

Что касается дизайна — имейте в виду, что вы разрабатываете дизайн для широкого круга устройств. Попытка сосредоточиться на форматировании строки, когда у вас есть разные режимы отображения (а иногда и несуществующие), имеет сомнительный дизайн. Не пытайтесь сосредоточиться на том, как будет выглядеть беседа, вместо этого вы должны сосредоточиться на том, насколько беседа похожа на беседу вашего пользователя с другим человеком. Помните, что голос является основным средством этого разговора, а визуальные эффекты призваны дополнять этот разговор, а не управлять им.

person Prisoner    schedule 05.08.2017
comment
Большое спасибо, но я столкнулся с проблемой при развертывании: код assistant.ask() отправляет Default Response, который обрабатывается только api.ai, но при тестировании выдает ошибку. Более того, я изменил код на function quote_start(assistant){ assistant..ask("Hello"); } Даже это не работает при тестировании (в консоли телефона/AoG), но дает ответ по умолчанию в api.ai. Ранее сегодня я столкнулся с некоторой ошибкой, при развертывании код фактически не менялся - понятия не имею, почему. Почему все это происходит вдруг? - person frunkad; 06.08.2017
comment
Похоже, что эти вопросы отличаются от исходного вопроса и не связаны с ним. Если ответ помог, приветствуется голосование и принятие ответа. Если у вас есть новые вопросы, откройте новый вопрос StackOverflow, предоставив как можно больше информации. - person Prisoner; 06.08.2017

Насколько я понял из документации, .tell и .ask оба закрывают микрофон. Попробуйте поместить все ваши утверждения в одну строку. Насколько я могу судить, .ask на самом деле не влияет на тон речи; он просто говорит помощнику ждать ввода.

assistant.ask("Innovation is the only way to win. By Steve Jobs. Want one more?");
person Katie    schedule 05.08.2017
comment
.ask на самом деле открывает микрофон, и помещать его в одну строку, ммм, это не то, что я хочу. Спасибо. P.S. поскольку я помещаю цитату Стива Джобса, я должен убедиться, что у нее хороший дизайн ;) - person frunkad; 05.08.2017
comment
Я знаю, что .ask открывает микрофон, но .tell и .ask оба закрывают микрофон после пробежки. Есть ли какая-то особая причина, по которой вы не хотите, чтобы все было в одной строке? - person Katie; 05.08.2017
comment
Цель дизайна - единственная причина. Во всех отношениях это выглядело бы лучше. - person frunkad; 05.08.2017
comment
Это может выглядеть лучше, но это невозможно с тем, как работает API помощника. Вы можете добавить несколько строк или использовать разрывы строк, чтобы очистить его, но любой другой способ сделать это будет выглядеть намного грязнее. - person Katie; 05.08.2017