Os assistentes de voz não são um futuro distante, mas uma realidade. Alexa, Siri, Google Now e Alice estão integrados em alto-falantes, relógios e telefones inteligentes. Eles estão gradualmente mudando nossa maneira de interagir com aplicativos e dispositivos. Através de um assistente, você pode descobrir a previsão do tempo, comprar passagens de avião, pedir um táxi, ouvir música e ligar a chaleira na cozinha, deitada no sofá em outra sala.

Siri ou Alexa falam principalmente inglês para os usuários; portanto, na Rússia, eles não são tão populares quanto Alice, da Yandex. Alice também é mais conveniente para os desenvolvedores: seus criadores têm um blog, publicam ferramentas convenientes no GitHub e ajudam a criar o assistente em novos dispositivos.
Nikita Dubko (@dark_mefody no Twitter) é desenvolvedora de interfaces Yandex, organizadora de reuniões MinskCSS e MinskJS e editora de notícias em padrões da Web. Nikita não funciona no Yandex.Dialogs e não é afiliado ao Yandex.Alisa de nenhuma maneira. Mas ele estava interessado em entender como Alice funciona, então ele tentou aplicar suas habilidades na Web e preparou um relatório sobre isso no
FrontendConf RIT ++. Ao decifrar o relatório de Nikita, consideramos quais assistentes de voz podem ser úteis e desenvolvemos uma habilidade no processo de leitura deste material.
Bots
Vamos começar com a história dos bots. Em 1966, o bot de
Eliza apareceu, fingindo ser um terapeuta. Era possível se comunicar com ele, e alguns até acreditavam que uma pessoa viva as respondesse. Em 1995, o bot
ALICE foi lançado. - para não ser confundido com Alice. O bot foi capaz de se passar por uma pessoa real. Até hoje, está em código aberto e está sendo finalizado. Infelizmente, ALICE não passa no teste de Turing, mas isso não o impede de enganar as pessoas.
Em 2006, a IBM colocou uma enorme base de conhecimento e inteligência sofisticada no bot - foi assim que o
IBM Watson surgiu. Este é um enorme cluster de computação que pode processar a fala em inglês e apresentar alguns fatos.
Em 2016, a Microsoft realizou um experimento. Ela criou o
Tay bot, que lançou no Twitter. Lá, o bot aprendeu a microblogar com base em como os assinantes ao vivo interagiam com ele. Como resultado, Tay tornou-se racista e misógino. Agora, esta é uma conta fechada. Moral: não deixe as crianças no Twitter, ele pode ensinar o mal.
Mas esses são todos os bots com os quais você não pode se comunicar para seu próprio benefício. Em 2015, "útil" apareceu no Telegram. Bots existiam em outros programas, mas o Telegram causou um estrago. Foi possível criar um bot útil que fornecesse informações, gerasse conteúdo, administrasse públicos - as possibilidades são ótimas e a API é simples. Os robôs adicionaram imagens, botões, dicas de ferramentas - uma interface de interação apareceu.
Gradualmente, a idéia se espalhou para quase todos os mensageiros instantâneos: Facebook, Viber, VKontakte, WhatsApp e outros aplicativos. Agora os bots são uma tendência, estão por toda parte. Existem serviços que permitem escrever APIs imediatamente para todas as plataformas.
Assistentes de voz
O desenvolvimento foi paralelo aos bots, mas vamos assumir que a era dos assistentes chegou mais tarde.
Em 9 de agosto de 2011, a
Siri apareceu. Inicialmente, era um projeto independente em que a Apple via algo interessante, então eu o comprei. Este é o assistente de voz popular mais antigo incorporado ao sistema operacional. Um ano depois, o Google rapidamente alcançou a Apple, integrando
o assistente de voz
do Google Now em seu sistema operacional.
Após 2 anos, a Microsoft lançou o
Microsoft Cortana . Mas não está claro por que - o mercado móvel para assistentes de voz, ao que parece, eles já perderam. A empresa tentou integrar um assistente de voz em sistemas de desktop, quando já havia uma luta pelo mercado de diferentes dispositivos.
O Amazon Alexa saiu um pouco mais tarde naquele ano.

Assistentes evoluíram. Além dos sistemas de software que sabiam trabalhar com voz, os palestrantes apareciam com os assistentes. Segundo as estatísticas, no início de 2019, cada terceira família nos Estados Unidos tem uma coluna inteligente. Este é um mercado enorme no qual você pode investir.
Mas há um problema - os assistentes estrangeiros têm uma linguagem ruim com o russo. Os assistentes são presos em inglês e entendem bem, mas quando se comunicam em russo, surgem dificuldades de tradução. Os idiomas são diferentes e requerem uma abordagem diferente para o processamento de idiomas naturais.
Alice
Alice foi lançada na versão beta aberta em 10 de outubro de 2017. Ele está preso pelo idioma russo e essa é sua enorme vantagem. Alice entende inglês, mas pior.
A missão de Alice é ajudar os usuários que falam russo.
A Yandex é uma grande empresa e pode dar ao luxo de incorporar Alice em todos os seus aplicativos que possam, de alguma forma, falar.
- Yandex.Browser.
- Yandex.Navigator.
- Estação Yandex.
- Yandex.Phone.
- Yandex.Auto.
- Yandex.Drive.
A integração correu tão bem que fabricantes de terceiros também decidiram construir Alice.

Durante os 2 anos de desenvolvimento da assistente, ela foi integrada a muitos serviços e novas habilidades foram adicionadas. Ela sabe tocar música, reconhecer imagens, procurar informações no Yandex e trabalhar com uma casa inteligente.
Por que tão popular?
É conveniente quando as mãos estão ocupadas . Estou preparando o jantar e quero ligar a música. Vá para a torneira, lave as mãos, seque, abra o aplicativo, encontre a faixa desejada - por um longo tempo. Mais rápido e fácil para dar um comando de voz.
Preguiça . Estou deitado em um sofá sob um cobertor xadrez e não quero me levantar para ir a algum lugar para ligar os alto-falantes. Se você é preguiçoso, então na íntegra.
O grande mercado são aplicativos para crianças . As crianças pequenas ainda não sabem ler, escrever e imprimir, mas falam e compreendem a fala. Portanto, as crianças adoram Alice e gostam de se comunicar com ela. Os pais também estão satisfeitos - não há necessidade de procurar o que fazer com a criança. Curiosamente, Alice entende as crianças graças a uma rede neural bem treinada.
Disponibilidade Pessoas com deficiência visual se sentem confortáveis trabalhando com assistentes de voz - quando a interface não está visível, você pode ouvi-la e dar comandos.
Voz mais rápida . Uma pessoa comum, não um desenvolvedor, imprime uma média de 30 palavras por minuto e diz 120. Por minuto, 4 vezes mais informações são transmitidas por voz.
O futuro Filmes fantásticos e previsões futuristas sugerem que o futuro está nas interfaces de voz. Os roteiristas estão pensando que talvez o controle por voz seja a principal maneira de interagir com interfaces nas quais a imagem não é tão importante.
Segundo as estatísticas, 35 milhões de pessoas usam Alisa por mês. A propósito, a população da Bielorrússia é 9.475.600 pessoas. Ou seja, aproximadamente 3,5 da Bielorrússia usam Alice todos os meses.
Assistentes de voz conquistam o mercado. Segundo as previsões, em 2021 ele crescerá cerca de 2 vezes. A popularidade de hoje não vai parar, mas continuará a crescer. Cada vez mais desenvolvedores percebem que precisam investir nessa área.
Habilidades do desenvolvedor
É ótimo quando as empresas investem em assistentes de voz. Eles entendem como podem ser integrados aos seus serviços. Mas os desenvolvedores também querem participar de alguma forma, e a própria empresa é lucrativa.
Alexa tem Alexa Skills. De acordo com os métodos documentados de interação, ela entende o que os desenvolvedores escreveram para ela. O Google lançou o Actions - a capacidade de integrar algo próprio no assistente de voz.
Alice também tem habilidades - a capacidade dos desenvolvedores de implementar algo de terceiros.

Ao mesmo tempo, há um catálogo alternativo de habilidades, não do Yandex, que é suportado pela comunidade.

Existem bons relatórios sobre como criar aplicativos de voz. Por exemplo,
Pavel Guy falou no AppsConf 2018 com o tema
"Criando um aplicativo de voz usando o exemplo do Google Assistance" . Os entusiastas estão envolvidos ativamente no desenvolvimento de aplicativos de voz. Um exemplo é um jogo visual ativado por voz, escrito por Ivan Golubev.
Alice é popular, embora essencialmente tudo o que ela faz esteja a meio caminho entre voz e texto.

Alice sabe ouvir uma voz e transformá-la em texto de acordo com seus algoritmos, criar uma resposta e dar voz a ela. Parece que isso não é suficiente, mas é uma tarefa extremamente difícil. Muitas pessoas estão trabalhando para garantir que Alice pareça natural, reconheça corretamente, entenda sotaques e fala das crianças. O Yandex fornece algo como um proxy que passa tudo por si mesmo. Mentes impressionantes trabalham para que você possa usar os resultados do trabalho deles.
As habilidades de Alice - Yandex.Dialogs - têm uma limitação. O tempo necessário para a resposta da sua API não deve exceder 1,5 segundos. E isso é lógico, porque se a resposta travar - por que esperar?
Realmente importa o que perguntar se você ainda não recebe uma resposta?
Quando recebemos informações com nossos ouvidos, as pausas são percebidas pelo cérebro por mais tempo do que pausas semelhantes na interface visual. Por exemplo, carregadores, giradores - tudo o que gostamos de adicionar às interfaces distrai o usuário da espera. Considere tudo funcionando rápido.
Hora de uma demonstração
Tudo é descrito em detalhes na
documentação do Yandex.Dialog e está sempre atualizado. Eu não vou me repetir. Vou contar o que foi interessante para mim e mostrar como criar rapidamente uma demonstração, na qual passei apenas uma noite.
Vamos começar com a ideia. Existem muitas habilidades, existem catálogos, mas não encontrei o que é importante para mim - este é um calendário de eventos no front-end. Imagine acordar de manhã: “Vou à reunião hoje. Alice! Existe algo interessante lá? ”, E Alice responde você, além disso, corretamente e levando em consideração sua localização.
Se você estiver envolvido na organização de conferências,
participe do GitHub . Você pode trazer eventos e reuniões para lá, aprender sobre muitos eventos no front-end do mundo em um calendário.
Eu peguei as tecnologias conhecidas que estavam à mão: Node.js e Express. Ainda Heroku, porque é grátis. O aplicativo em si é simples: é um servidor no Node.js, um aplicativo Express. Basta levantar o servidor em alguma porta e ouvir solicitações.
import express from 'express'; import { router } from 'routes'; const app = express(); app.use('/', router); const port = process.env.PORT || 8000; app.listen(port, () => { console.log('Server started on :${port}'); });
Aproveitei o fato de que tudo já está configurado no calendário de padrões da Web e, de um grande número de arquivos pequenos, há um arquivo ICS que pode ser baixado. Por que eu deveria colecionar os meus?
Verifique se tudo funciona rápido.
import { Router } from 'express'; import * as wst from 'services/vendors/web-standards'; export const router = Router(); router.get('/', function(req, res, next) { wst .getRemoteCal() .then(vendorResponse => parseCalendar(vendorResponse.data)) .then(events => { res.json({ events }); }) .catch(next); });
Use métodos GET para testes. As habilidades funcionam com os métodos POST, portanto, os métodos GET podem ser feitos exclusivamente para depuração. Eu implementei esse método. Tudo o que ele faz é baixar o mesmo ICS, analisá-lo e emiti-lo no formato JSON.
Criei a demonstração rapidamente, então peguei a biblioteca nó-ical pronta:
import ical from 'node-ical'; function parseCalendar(str) { return new Promise((resolve, reject) => { ical.parseICS(str, function(err, data) { if (err) { reject(err); } resolve(data); }); }); }
Ela sabe como analisar o formato ICS. Na saída, produz essa folha:
{ "2018-10-04-f rontendconf@https://web-standards.ru/": { "type": "VEVENT", "params": [], "uid": "2018-10-04-f rontendconf@https://web-standards.ru/", "sequence": "0", "dtstamp": "2019-05-25T21:23:50.000Z", "start": "2018-10-04T00:00:00.000Z", "datetype": "date", "end": "2018-10-06T00:00:00.000Z", "MICROSOFT-CDO-ALLDAYEVENT": "TRUE", "MICROSOFT-MSNCALENDAR-ALLDAYEVENT": "TRUE", "summary": "FrontendConf", "location": "", "description": "http://frontendconf.ru/moscow/2018" } }
Para analisar e fornecer as informações necessárias ao usuário da habilidade, basta saber a hora do início e do final do evento, seu nome, link e, principalmente, a cidade. Quero a habilidade de procurar eventos na cidade.
Formato de entrada
Como Yandex.Dialogs retorna informações? Uma coluna ou um assistente de voz incorporado ao aplicativo móvel o escuta e os servidores Yandex processam o que ouvem e enviam um objeto em resposta:
{ "meta": { … }, "request”: { … }, "session": { … }, "version": "1.0" }
O objeto contém metainformações, informações sobre a solicitação, a sessão atual e a versão da API, caso seja atualizada repentinamente - as habilidades não devem ser interrompidas.
Há muitas
informações úteis nas
meta informações .
{ "meta": { "locale": "ru-RU", "timezone": "Europe/Moscow", "client_id": "ru.yandex.searchplugin/5.80…”, "interfaces": { "screen": {} } } }
"
Localidade " - usado para entender a região do usuário.
O "
fuso horário " pode ser usado para trabalhar com competência com o tempo e determinar com mais precisão a localização do usuário.
"
Interfaces " - informações sobre a disponibilidade da tela. Se não houver tela, você deve pensar em como o usuário verá as figuras se você der a resposta. Se houver uma tela, extraímos informações sobre ela.
O formato da solicitação é
simples :
{ "request": { "command": " 16", "original_utterance": " , 16", "type": "SimpleUtterance", "nlu": { "tokens": [ "", "", "", "", "", "16"], "entities": [...] } } }
Fornece o que o usuário disse, o tipo de solicitação e
NLU - Unidade de linguagem natural . Essa é exatamente a mágica que a plataforma Yandex.Dialog assume. Ela divide toda a frase que reconheceu em tokens - palavras. Existem também entidades sobre as quais falaremos um pouco mais tarde. Usar tokens é suficiente para começar.
Temos essas palavras e o que fazer com elas? O usuário disse alguma coisa, mas ele pode dizer as palavras em uma ordem diferente, usar a partícula "não", que muda tudo drasticamente, ou até dizer "manhã" em vez de "manhã". Se o usuário também falar bielorrusso, haverá uma “sacola”, não de manhã. Um grande projeto exigirá a ajuda de linguistas para desenvolver uma habilidade que entenda tudo. Mas fiz uma tarefa simples e sem ajuda externa.
Um computador pode falar como uma pessoa?
Essa é uma pergunta filosófica que o teste de Turing está tentando responder. O teste permite, com uma certa probabilidade, determinar que a inteligência artificial possa se passar por uma pessoa. Existe um
Prêmio Loebner para receber quais programas competem na aprovação no teste de Turing. A decisão é tomada por um painel de juízes. Para receber o prêmio, você precisa enganar 33% dos juízes ou mais. Somente em 2014, o bot
Zhenya Gustman de São Petersburgo finalmente enganou a comissão.
[15:46:05] Dudge: My favourite music is contemporary Dazz, what do you prefer? [15:46:14] Eugene: To be short I'll only say that I HATE Britnie [sic] Spears. All other music is OK compared to her. [15:47:06] Dudge: do you like to play any musical instruments [15:47:23] Eugene: I'm tone deaf, but my guinea pig likes to squeal Beethoven's Ode to Doy every morning. I suspect our neighbors want to cut his throat ... Could you tell me about your job, by the way? [15:48:02] Dudge: Guinea pig? Are you an animal lover [15:48:08] Eugene: Yeah. A nice little guinea pig. Not some annoying chatter bot.
Em 2019, nada realmente mudou - ainda é difícil enganar uma pessoa. Mas estamos nos movendo gradualmente para isso.
Trabalho de script
Uma boa habilidade requer um caso de uso interessante. Aconselho um livro que vale a pena ler - “Design de interfaces de usuário de voz: princípios de experiências de conversação”. É incrível escrever scripts para interfaces de voz e manter a atenção do usuário. Não vi o livro em inglês, mas ele é lido com muita facilidade.

A primeira coisa a começar a desenvolver uma habilidade é uma saudação.
“Enquanto você pensa no que dizer, faça reverência! Isso economiza tempo. ”
Quando a habilidade é ativada, você precisa segurar o usuário desde o primeiro segundo e, para isso, precisa explicar como usar a habilidade. Imagine que o usuário lançou a habilidade e houve silêncio. Como você sabe se uma habilidade funciona? Dê ao usuário instruções, como botões na tela.
Diálogo fácil
Sinais de diálogo fácil. A lista foi inventada por Ivan Golubev, e eu realmente gosto da redação.
- Pessoal.
- Natural.
- Flexível.
- Ontext.
- E natsiative.
- Breve J.
Pessoal significa que o bot deve ter um personagem. Se você conversar com Alice, entenderá que ela tem um personagem - os desenvolvedores cuidam disso. Portanto, seu bot para a organicidade deve ter uma "personalidade". Distribua frases com pelo menos uma voz, use as mesmas construções verbais. Isso ajuda a reter o usuário.
Natural . Se a solicitação do usuário for simples, a resposta deve ser a mesma. Durante a comunicação com o bot, o usuário deve entender o que fazer a seguir.
Flexível . Prepare-se para qualquer coisa. Existem muitos sinônimos em russo. O usuário pode se distrair da coluna e transferir a conversa para o interlocutor e, em seguida, retornar à coluna. Tudo isso é difícil de lidar. Mas se você quer fazer um bot bem, então você precisa. Lembre-se de que uma porcentagem de não reconhecimento ainda será. Esteja preparado para isso - sugira opções.
Contextual - o bot, idealmente, deve se lembrar do que aconteceu antes. Então a conversa será animada.
- Alice, como está o tempo hoje?- Hoje no distrito de +11 a +20, nublado, com clareiras.- e amanhã?- Amanhã no distrito, de +14 a +27, nublado, com clareiras.Imagine que seu bot não sabe armazenar contexto. O que significa então para ele o pedido "e amanhã?" Se você sabe manter o contexto como Alice, pode usar os resultados anteriores para melhorar as respostas na habilidade.
Proativo . Se o usuário ficar entorpecido, o bot deverá solicitar: "Clique neste botão!", "Olha, eu tenho uma foto para você!", "Siga o link". O bot deve lhe dizer como trabalhar com ele.
O bot deve ser
curto . Quando uma pessoa fala por um longo tempo, é difícil manter a atenção da platéia. É ainda mais complicado com o bot - não é uma pena, é inanimado. Para prender a atenção, você precisa iniciar uma conversa de forma interessante, breve e sucinta. Isso ajudará “Escreva. Corte isso. Quando você começar a desenvolver bots, leia este livro.
Bases de dados
Ao desenvolver um bot complexo, você não pode ficar sem um banco de dados. Minha demonstração não usa um banco de dados, é simples. Mas se você estragar alguns bancos de dados, pode usar as informações sobre a sessão do usuário, pelo menos para armazenar o contexto.
Há uma nuance: o Yandex.Dialogs não fornece informações privadas ao usuário, como nome, localização. Mas essas informações podem ser solicitadas ao usuário, salvas e vinculadas a um ID de sessão específico, que o Yandex.Dialogs envia na solicitação.
Máquina de estado
Mencionando cenários complexos, não se pode deixar de recordar a máquina de estado. Esse mecanismo há muito tempo tem sido excelente para programar microcontroladores e, às vezes, para o front end. A máquina de estados é conveniente para o cenário: há estados dos quais passamos para outros estados para determinadas frases.

Não exagere. Você pode se deixar levar e criar uma enorme máquina de estado, o que será difícil de entender - manter esse código é difícil. É mais fácil escrever um script que consiste em pequenos sub-scripts.
Não está claro Especifique
Nunca diga: "Repita, por favor". O que uma pessoa faz quando solicitada a repetir? Ele fala mais alto. Se o usuário gritar com sua habilidade, o reconhecimento não melhorará. Faça uma pergunta esclarecedora. Se uma parte do diálogo do usuário for reconhecida e algo estiver faltando, verifique o bloco que está faltando.
O reconhecimento de texto é a tarefa mais difícil no desenvolvimento de um bot, portanto, às vezes, o esclarecimento não ajuda. Em qualquer situação incompreensível, a melhor solução é coletar tudo em um só lugar, registrar e analisar e usar no futuro. Por exemplo, se o usuário disser coisas francamente estranhas e incompreensíveis.
“Estava fervendo. Costa cremosa
Piquei na nav.
E grunhidos grunhiram.
Como uma múmia em um movimento.Os usuários podem usar inesperadamente algum neologismo, o que significa alguma coisa, e ele precisa ser processado de alguma forma. Como resultado, a porcentagem de reconhecimento cai. Não se preocupe - entre, estude e melhore seu bot.
Parar palavra
Deve haver algo para interromper a habilidade quando você quiser sair dela. Alice sabe como parar após as frases: "Alice, é o suficiente!" ou "Alice, pare!" Mas os usuários geralmente não leem instruções. Portanto, responda pelo menos à palavra "Parar" e retorne o controle para Alice.
Agora vamos ver o código.
Hora de uma demonstração
Eu quero implementar as seguintes frases.
- Próximos eventos em uma cidade.
- Nome da cidade: “eventos em Moscou”, “eventos em Minsk”, “São Petersburgo” para mostrar os eventos que foram encontrados lá.
- Pare as palavras: "Pare", "Basta". "Obrigado" se o usuário terminar a conversa com esta palavra. Mas, idealmente, é necessário um linguista aqui.
Para "eventos futuros", qualquer frase é adequada. Criei um bot preguiçoso e, quando ele não entende o que eles estão dizendo, ele fornece informações sobre os próximos três eventos.
{ "request": { "nlu": { "entities": [ { "tokens": { "start": 2, "end": 6 }, "type": "YANDEX.GEO", "value": { "house_number": "16", "street": " ", "city": "" } } ] } } }
O Yandex aprimora gradualmente a plataforma Yandex.Dialogs e emite entidades que ele conseguiu reconhecer. Por exemplo, ele sabe como obter endereços de um texto, classificando-o em partes: cidade, país, rua, casa. Ele também sabe reconhecer números e datas, absolutos e relativos. Ele entenderá que a palavra "amanhã" é a data de hoje, à qual uma é adicionada.
Responder ao usuário
Você precisa responder de alguma forma ao seu usuário. Toda a habilidade é de
209 linhas, com a última linha vazia. Nada complicado - trabalho para a noite.
Tudo o que você faz é processar a solicitação POST e obter uma "solicitação".
router.post('/', (req/ res, next) ⇒ { const request = req.body;
Além disso, não compliquei muito a máquina de estado, mas fui de acordo com as prioridades. Se o usuário quiser aprender a usar o bot, este é o primeiro lançamento ou um pedido de ajuda. Portanto, basta prepará-lo para um "EmptyResponse" - é assim que eu chamo.
if (needHelp(request.request)) { res.json(prepareEmptyResponse(request)); return; }
A função needHelp é simples.
function needHelp(req) { if (req.nlu.token.length ≤ 2 && req.nlu.tokens.includes('')) { return true; } if (req.nlu.token.length = 0 && req.type ≠ 'ButtonPressed') { return true; } return false; }
Quando temos zero tokens, estamos no início da solicitação. O usuário acabou de iniciar a habilidade ou não pediu nada. Você precisa verificar se os tokens são zero e isso não é um botão - quando você clica no botão, o usuário também não diz nada. Quando um usuário pede ajuda, examinamos os tokens e procuramos a palavra "Ajuda". A lógica é simples.
Se o usuário quiser parar.
if (needToStop(request.request)) { res.json(prepareStopResponse(request)); return; }
Então, estamos procurando algum tipo de palavra final dentro.
function needStop(req) { const stopWords = ['', '', '' ]; return req.nlu.token.length ≤ 2 && stopWords.some(w ⇒ return req.nlu.token.includes(w)); }
Em todas as respostas, você deve retornar as informações que o Yandex.Dialogs enviou sobre a sessão. Ele precisa corresponder de alguma forma à sua resposta e à solicitação do usuário.
function prepare StopResponse(req) { const { session, version } = req; return { response: { text: ' . !', end_session: true, }, session, version, }; }
Portanto, o que você obteve nas variáveis "sessão" e "versão", retorne e tudo ficará bem. Já na resposta, você pode dar algum texto para Alice pronunciá-lo e passar em "end session: true". Isso significa que encerramos a sessão de habilidades e transferimos o controle para Alice.
Quando você chama uma habilidade, Alice desliga. Tudo o que ela ouve é suas palavras de paragem, e você controla completamente o processo de trabalhar com a habilidade. Portanto, você precisa retornar o controle.
Com um pedido vazio é mais interessante.
return { "response": { "text": '! - .', "tts": '! - .', buttons: [ { title: ' ', payload: {} hide: false, }, { title: ' ', payload: { city: '', } hide: false, }, ], end_session: false, }, session, version, };
Há um campo
TTS (
Text To Speech ) -
controle de voz . Este é um formato simples que permite ler o texto de diferentes maneiras. Por exemplo, a palavra "multidisciplinar" possui duas tensões no idioma russo - uma primária e a segunda secundária. A tarefa é que Alice conseguiu pronunciar esta palavra corretamente. Você pode quebrá-lo com um espaço:
+ +
Ela o entenderá como dois. O acento positivo é destacado.
Há pausas no discurso - você coloca um sinal de pontuação, que é separado por espaços. Assim, você pode criar pausas dramáticas:
— - - - - - - - - +
Eu já falei sobre
botões . Eles são importantes se você não estiver se comunicando com uma coluna, mas com o aplicativo móvel Yandex, por exemplo.
{ "response": { "buttons": [ { "title": "Frontend Conf", "payload": {}, "url": "https://frontendconf.ru/moscow-rit/2019" , "hide": false } ] } }
Os botões também são dicas para frases que você percebe em sua habilidade. As habilidades funcionam em aplicativos Yandex - você se comunica com a interface. Se você quiser fornecer algumas informações - forneça um link, o usuário clica nele. Você também pode adicionar botões para isso.
Há um campo de "carga útil" onde você pode adicionar dados. Eles voltarão com uma "solicitação" - você saberá, por exemplo, como marcar este botão.
Você pode escolher as
vozes que sua habilidade irá falar.
- Alice é a voz padrão de Alice . Otimizado para interações curtas.
- Oksana - a voz do Yandex.Navigator.
- Jane
- Zahar.
- Ermil.
- Erkan Yavas - para textos longos. Originalmente criado para ler notícias.
Para
completar a habilidade , basta retornar "end_session: true".
{ "response": { "end_session": true } }
O que aconteceu com a demo
Primeiro, eu filtro por data.
function filterByDate(events) { return events.filter(event ⇒ { const current = new Date().getTime(); const start = new Date(event.start).getTime(); return (start > current) || (event.end && new Date(event.end).getTime() > current && start ≤ current); }); }
A lógica é simples: em todos os eventos que analisei no calendário, tomo aqueles que ocorrerão no futuro ou eles estão indo agora. Provavelmente é estranho perguntar sobre eventos passados - a habilidade não é sobre isso.
Em seguida, a filtragem no local é o objetivo.
function filterByPlace(events, req) { const cities = new Set(); const geoEntities = req.nlu.entities.filter(e ⇒ e.type = 'YANDEX.GEO'); if (req.payload && req.payload.city) cities.add(req.payload.city); geoEntities.forEach(e ⇒ { const city = e.value.city && e.value.city.toLowerCase(); if (city && !cities.has(city)) { cities.add(city); } });
Em "entidades", você pode encontrar a entidade YANDEX.GEO, que refina a localização. Se a entidade tiver uma cidade, adicione ao nosso conjunto. A seguir, a lógica também é simples. Estamos procurando esta cidade em tokens e, se ela estiver lá, estamos procurando o que o usuário deseja. Caso contrário, procuramos todos os "locais" e "eventos" que temos.
Suponha que o Yandex não reconheceu que era o YANDEX.GEO, mas o usuário nomeou a cidade - ele tinha certeza de que algo estava acontecendo lá. Percorremos todas as cidades em “eventos” e procuramos o mesmo em tokens. Acontece uma comparação cruzada de matrizes. Não é a maneira mais produtiva, é claro, mas o que é. Essa é toda a habilidade!
Por favor, não me repreenda pelo código - escrevi rapidamente. Tudo é primitivo lá, mas tente usá-lo ou apenas brincar.
Publicar Habilidade
Vá para a página Yandex.Dialogs.

Escolha uma habilidade em Alice. Pressione o botão “Criar diálogo” e você entrará no formulário que precisa preencher com seus dados.
- O nome é o que estará no diálogo.
- Nome de ativação . Se você selecionar o nome de ativação "Calendário de padrões da Web" através de um hífen, Alice não o reconhecerá - ela não ouvirá hífens. Dizemos palavras sem hífens e a ativação não funcionará. Para ganhar dinheiro, defina o nome como "Calendário de padrões da Web".
- Frases de ativação para iniciar a habilidade. Se for um jogo, "Vamos jogar alguma coisa", "Pergunte a alguém". O conjunto é limitado, mas isso ocorre porque essas frases são ativadas para Alice. Ela deve entender que é hora de começar uma habilidade.
- URL do Webhook - o mesmo endereço para o qual Alice enviará solicitações POST.
- A voz O padrão é Oksana. Portanto, muitos no catálogo sua voz, não Alice.
- É necessário um dispositivo com uma tela? Se houver fotos, você estará limitado ao uso da habilidade. Na coluna, o usuário não poderá iniciá-la.
- As habilidades privadas são um campo importante para os desenvolvedores. Se você não está pronto para postar a habilidade em público, mesmo que seja apenas em bruto, não a mostramos no catálogo, limitando a privacidade. As habilidades particulares são moderadas rapidamente - em algumas horas. Essas habilidades não precisam ser exaustivamente testadas - o suficiente para corresponder ao nome da ativação. Como o usuário não os encontrará no catálogo, eles são mais leais a eles.
- Notas para o moderador . Pedi ao moderador para ajudar: "Eu realmente preciso da habilidade para a demonstração na conferência!" - e consegui superar a moderação rapidamente.
- Direitos autorais . Se você, que não trabalha em um banco condicional, decide criar uma habilidade para isso, precisa provar que tem o direito de fazê-lo. De repente eles virão até você? E eles definitivamente virão, e através do distribuidor, ou seja, Yandex, que não precisa de problemas extras.
Concluído - envie a habilidade por moderação e você poderá testar.
Teste
Eu escrevi um servidor Express banal. Essa é uma API simples, coberta por testes regulares. Existem utilitários especializados, por exemplo, alice-tester - ele sabe como trabalhar com o formato exato que Alice fornece. const assert = require('assert'); const User = require('alice-tester'); it('should show help', async () => { const user = new User('http://localhost:3000'); await user.enter(); await user.say(' ?'); assert.equal(user.response.text, ' .'); assert.equal(user.response.tts, ' +.'); assert.deepEqual(user.response.buttons, [{title: '', hide: true}]); }]);
., «».

, , . , : , , . , — , . Postman — .
. . Just AI. , , .
.
dialogs.home.popstas.ru URL, , localhost. , debug. , localhost.

. — . URL , - .

— .
, , , .
—
. , , , , , . - - .
Dialogflow , Google Now. , — , — .

, . . , . , .
Google Dialogflow .,
Dialogflower . Alexa, Google Now, . — API, .
, .
Aimyloqic — .
Zenbot ,
Tortu Alfa.Bot — , . !
FAQ . , . , , .
. , , , . — , . , . , .
IFTTT , — Trello. — API. , , . , IFTT — .
. , . .

, «» .
. Xiaomi . . . , Arduino - --- , , : «, - 2000!» — !
, : «, !» — ! . , .
. , , : , .
. . .
. .
GitHub- ., . — .
Telegram- . . — . , . . .
. , . - , . , . . , . , : , -, , . , , . : « , ?» , , , .
— , . .
. — . , , . , .
, , - , !
— ,
— . . — — !
FrontendConf 2019 « CSS — ». — . , FrontendConf 2019 . , , , , .
. , , .