У меня проблема с действием Google Assistant и использованием его в приложении Google Assistant Mobile.
Я пытаюсь воспроизвести треклист из 1-3-минутных mp3-файлов, используя Media Response и обратные вызовы, и этоотлично работает в симуляторе и на моем Google Home Mini, но не в приложении Google Assistant на моем телефоне.
Я заметил, что обратный вызов MediaResponse не отправляется, когда я тестирую на iPhone.Первый MediaResponse будет воспроизводиться, но затем приложение будет молчать.Тем не менее, он не завершает мои действия, он оставляет микрофон открытым, и когда я пытаюсь поговорить с ним снова, все, что я говорю, отправляется на мои действия.Эта часть очень похожа на проблему Starfish Mint , хотя моя, похоже, работает на моем устройстве Google Home.Они сказали, что исправили это на
"После 6 месяцев ожидания нам удается решить это самостоятельно. В MEDIA_FINISHED мы должны вернуть аудио-текст в вашем медиа-ответе, чтобы получить последующее событие MEDIA_FINISHED. Мы проверили это ссписок воспроизведения из 100 мультимедийных файлов, и он воспроизводится как чудо. "
, хотя я не совсем уверен, что это значит.
Это может быть очевидным ответом на мой вопрос, но гдеон говорит: Медиа-ответы поддерживаются на телефонах Android и в Google Home , означает ли это, что они не поддерживаются на iPhone, и в этом проблема?Есть ли какие-либо обходные пути для этого, например, использование действия подкаста или чего-то еще?
Я пробовал другое приложение для воспроизведения звука, Music Player Sample , которое является одним из примеров приложений Google Dialogflow, и онотакже не работает на моем телефоне, хотя и в других местах.Может быть, это просто iPhone?
Что меня смущает, так это то, что, когда я смотрю на возможности действия на моем телефоне: conv.surface.capabilities.has("actions.capability.MEDIA_RESPONSE_AUDIO")
оно включает actions.capability.MEDIA_RESPONSE_AUDIO в своих возможностях,Если бы этого не было, я был бы более склонен полагать, что в него не входят айфоны, но кажется странным, что у него это будет в возможностях, но тогда не будет работать.
Вот код, где я играюпервый трек:
app.intent('TreatmentResponse', (conv, context, params) => {
var treatmentTracks = [{url: 'url', name: 'name'},{url: 'url', name: 'name'}];
var result = playNext(treatmentTracks[0].url, treatmentTracks[0].name);
var response = result[0];
conv.data.currentTreatment = 'treatment';
conv.data.currentTreatmentName = 'treatmentName';
conv.data.treatmentPos = 1;
conv.data.treatmentTracks = treatmentTracks;
conv.ask("Excellent, I'll play some tracks in that category.");
conv.ask(response);
conv.ask(new Suggestions(['skip']));
});
и вот моя функция обратного вызова:
app.intent('Media Status', (conv) => {
const mediaStatus = conv.arguments.get('MEDIA_STATUS');
var { treatmentPos, treatmentTracks, currentTreatment, currentTreatmentName } = conv.data;
if (mediaStatus && mediaStatus.status === 'FINISHED' && treatmentPos < treatmentTracks.length) {
playNextTrack(conv, treatmentPos, treatmentTracks);
} else {
endConversation(conv, currentTreatment);
}
});
Вот playNextTrack ()
function playNextTrack(conv, pos, medias) {
conv.data.treatmentPos = pos+1;
var result = playNext(medias[pos].url, medias[pos].name);
var response = result[0];
var ssml = result[1];
conv.ask(ssml);
conv.ask(response);
conv.ask(new Suggestions(['skip']));
}
и playNext ()
function playNext(url, name) {
const response = new MediaObject({
name: name,
url: url,
});
var ssml = new SimpleResponse({
text: 'Up next:',
speech: '<speak><break time="1" /></speak>'
});
return [response, ssml];
}
Другая проблема заключается в том, что MediaResponse воспроизводится на моем iPhone, если я прерываю его, чтобы сказать «Далее» или «Пропустить», вместо использования моего намерения «NextOrSkip», как это происходит в симуляторе и на Google Home.Мини, он просто говорит «уверен» или «хорошо» [у меня его нет нигде в коде], а затем молчит (и слушает).