Desenvolupant un Assistent Personal Intel·ligent

“Siri, llegeix els missatges de correu electrònic”

“Hola Cortana, com està el clima?”

“Ok Google, com es diu hola en anglès?”

” Alexa, instal·lacions per a timer for 15 minutes “

Aquest tipus de frases (ordres) s’estan fent part de la nostra vida quotidiana. Cada dia és més comú usar la nostra veu i un llenguatge natural per interactuar amb dispositius i serveis. La gran majoria dels dispositius i sistemes operatius més populars incorporen el que es coneix com un assistent personal intel·ligent; és una tendència que s’està accelerant.

Un assistent personal intel·ligent (Intelligent Personal Assistant, IPA) és un agent de programari que pot realitzar tasques o oferir serveis a un individu. L’usuari pot interactuar amb l’IPA usant llenguatge natural a través de veu o text. El IPA pot més obtenir i usar informació addicional de context tal com la ubicació de l’usuari, informació dins de el mateix dispositiu (fotos, contactes, etc.) i altres serveis per a proporcionar una millor resposta a l’usuari.

Els assistents personals com Siri, Google Now o Cortana poden executar moltes accions i respondre a una gran varietat de peticions de l’usuari. Típicament, el dispositiu és tan sols una façana per proveir el servei, ja que en realitat els serveis que reconeixen la parla i determinen la resposta o acció adequada, són serveis allotjats al núvol.

Vull el meu propi IPA

Si volem crear un servei d’IPA, una opció és fer-ho com una extensió a serveis existents com Siri, Cortana o Alexa. No obstant això, això pot tenir limitacions o no donar-nos el control complet que podríem requerir. Així que una altra opció és que desenvolupem la nostra pròpia aplicació i simplement utilitzem els serveis de reconeixement de la parla que exposen alguns d’aquests motors.

Per a construir el nostre IPA primer necessitem identificar-ne els diferents components o subsistemes. A grans trets són: interfície per interactuar amb l’assistent, reconeixement de la parla, llenguatge de domini específic (DSL), i endpoint per accedir a l’agent.

A continuació anem a platicar sobre cada un d’ells.

Reconeixement de parla

És un camp de la lingüística computacional orientat a desenvolupar metodologies i tecnologies que permetin que els ordinadors puguin entendre i traduir llenguatge parlat. Val la pena aclarir que el reconeixement de la parla és diferent de el reconeixement de veu, ja que aquest últim només s’enfoca en identificar la persona que parla, mes no el que està dient.

Com poden imaginar, desenvolupar un servei de reconeixement de la parla és una tasca molt gran i gairebé impossible per a una sola persona. Afortunadament empreses com Microsoft, Google i Xamarin entre d’altres, els han desenvolupat ja, i els han obert perquè puguem usar-los en les nostres aplicacions. En el llistat 1 mostro com podem inicialitzar el servei de reconeixement de la parla en .Net. Posteriorment, en el llistat 2 mostro com es podria fer en web utilitzant el Web Speech API, que és suportat per Chrome.

Llistat 1. Codi C # per usar Windows Speech Recognition.

Llistat 2. Codi Javascript per utilitzar Web Speech API.

llenguatge de domini específic (DSL)

És un llenguatge informàtic dissenyat per a representar o resoldre un problema específic. Hi ha una gran varietat de DSLs, des de llenguatges d’ús molt comú com HTML o SQL, fins llenguatges de nínxol com podria ser Csound per a síntesi de sons. El domini pot ser també una àrea de negocis. Així que per exemple, podríem crear un DSL per gestió de pòlisses d’assegurança.

Quan es crea un DSL que només es farà servir en una aplicació se li acostuma anomenar un mini-llenguatge.

per implementar el llenguatge necessitem definir la seva gramàtica i crear un parser (analitzador sintàctic) per poder interpretar el que l’usuari ens diu i donar-li una resposta. Podríem fer les dues coses a mà, però en l’actualitat hi ha ja moltes eines que ens faciliten definir la gramàtica i crear el nostre parser.

Una de les eines més comunes per desenvolupar llenguatges és YACC, que ens permet generar un parser basat en una gramàtica analítica que hem de descriure en un metallenguatge similar a la notació de Backus-Naur.

en aquest cas no farem servir YACC, sinó que farem servir Irony, un kit de desenvolupament per implementar llenguatges en la plataforma .Net. A diferència de solucions com YACC i Lex, que generen un parser a partir de la gramàtica analítica que hàgim definit, Irony ens permet expressar la gramàtica del nostre llenguatge directament en C #.

El llistat 3 mostra com definim la gramàtica a través de terminals i no-terminals, així com els enunciats que anem a reconèixer.

Llistat 3. Definició de l’ADSL.

endpoint

Anem a exposar els serveis del nostre assistent a través d’un endpoint allotjat en la nostra aplicació web. Aquest endpoint rebrà com a paràmetre la consulta d’l’usuari i la passarà a l’assistent, el qual interpretarà els resultats i enviarà una resposta serialitzada.

a

App

L’usuari podrà interactuar amb el nostre assistent intel·ligent a través d’una aplicació mòbil.

Ja en els llistats 1 i 2 vam veure com podem utilitzar les APIs de Chrome i Windows per a reconeixement de la parla. Ara en els llistats 4a, 4b i 4c podem veure com llançar la recerca i mostrar els resultats en una aplicació Windows Universal.

El llistat 4a mostra com disparar una petició asíncrona i esmicolar els resultats, després el llistat 4b mostra com es podrien desplegar i finalment el llistat 4c mostra com podríem acompanyar aquests resultats d’un missatge de veu.

llistat 4a. Disparar recerca i processar resultats.

Llistat 4b. Desplegar resultats.

Llistat 4c. Donar missatge parlat.

Alternatives

Un assistent personal intel·ligent pot desenvolupar-se de moltes maneres. En aquest article prenem algunes decisions pel que fa a tecnologies i arquitectura, per la part de reconeixement de la parla podríem usar serveis de Xamarin que té una API de reconeixement de llenguatge i és multiplataforma. També podríem integrar la nostra aplicació amb serveis com Siri o Cortana. El DSL, com hem esmentat, també podríem haver-ho desenvolupat amb YACC, Lex o alguna variant d’aquests.

Codi font

Tot el codi font en aquest article és part d’un assistent personal petit que està allotjat en http://deepthoughtagent.azurewebsites.net/, a la url: http://deepthoughtagent.azurewebsites.net/ Home / preguntes estan el tipus de preguntes que pot contestar l’assistent; alguns exemples són:

  • Quantes embarcacions té contracte a123456?
  • En quants contractes aquesta embarcació un?
  • Quina capacitat té embarcació Morelos?
  • Què contracte comença abans de ’12 / 12/2015 ‘?
  • Quina embarcació té més velocitat?
  • Quin contracte té menys embarcacions?
  • quan comença contracte ABCDE?
  • Mostra totes les embarcacions
  • Mostra tots els contractes
  • Mostra el contracte ABCDE
  • Actualitza l’embarcació pinta canvia la seva velocitat per 20
  • Quant és 2 + 2?
  • Quant és 2 entre 2?

el codi font es pot obtenir a https://github.com/pedro-ramirez-suarez/ScioAssistant, l’aplicació mòbil (Windows Universal App) està configurada per utilitzar el endpoint http://deepthoughtagent.azurewebsites.net/, sent que el servei està allotjat en un servidor amb recursos molt limitats no podrà gestionar moltes peticions, per córrer els seus propis experiments n’hi ha prou amb allotjar el DSL en o tre lloc i canviar la URL definida a l’arxiu “AppResources.resx” perquè apunti a on està el nostre endpoint.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *