GX - IA con Genexus
GX - IA con Genexus
GX - IA con Genexus
Marcas Registradas
GeneXus es una marca registrada (®) en múltiples países y regiones, incluyendo entre otros,
América Latina, EEUU, Japón, la UE y Uruguay. Todas las demás marcas mencionadas en
este documento son propiedad de sus respectivos dueños.
Campus Party, Mar 15th 2019 GeneXus S.A
Objetivos
Generales
Desarrollar una aplicación mobile que permita realizar la traducción automática de texto escrito,
texto hablado y texto identificado en imágenes consumiendo servicios de Inteligencia Artificial
(IA) en la nube.
Específicos
● Presentar el módulo GeneXusAI, las funcionalidades que provee y cómo configurarlo.
3. OPCIONAL. Configurar los servicios con un proveedor distinto incluyendo el proceso para
obtener las claves necesarias.
Campus Party, Mar 15th 2019 GeneXus S.A
● Es necesario contar con una GeneXus Account para poder hacer Deploy To Cloud. Si no
cuenta con una al momento de realizar este laboratorio, crear una nueva (necesita
verificación por correo electrónico). Además, debe estar suscrito a Deploy To Cloud en la
sección My Apps una vez logueado.
● Usted debe contar con un dispositivo móvil con sistema operativo Android o iOS.
○ Dispositivos Android
Es necesario tener un lector de códigos QR (usualmente es una funcionalidad nativa en
la aplicación de cámara) y permitir instalar aplicaciones de fuentes desconocidas; para
ello, dirigirse a Ajustes > Seguridad, y marcar la opción Orígenes Desconocidos.
○ Dispositivos iOS
Es necesario descargar la aplicación GeneXus KB Navigator desde el App Store.
En la ventana de Import Objects desplegada a continuación (ver Figura 3), buscar el archivo
LabAI Startup.xpz disponible en el escritorio (click en ). Una vez seleccionado, presionar el
botón “Load” y se desplegarán los objetos allí contenidos. Para importarlos a la KB,
simplemente damos click en el botón “Import”.
Campus Party, Mar 15th 2019 GeneXus S.A
Componentes:
MainLabAI panel
Panel principal. Es el panel a ejecutar en el
dispositivo móvil. Contiene la UI y lógica para
invocar los servicios de AI que vamos a utilizar.
UI folder
Contiene dos paneles auxiliares para interactuar
con la aplicación móvil, uno para poder
grabar/reproducir audio desde el dispositivo
(RecordAudio) y otro para seleccionar una imagen
(desde la galería o mediante una foto,
SelectImage).
Helpers folder
Contiene dos objetos de tipo Procedure donde
programaremos la configuración del proveedor de
servicios de AI en la nube (GetProvider) y haremos
post-procesamiento del texto identificado por OCR
(PostprocessOcr).
Ejecución de la aplicación
Primero hay que armar la KB. Para ello, habiendo hecho la configuración para el prototipado en
la nube, dirigirse a Build > Build All desde la toolbar de GeneXus IDE (ver Figura 7, o dar click
en el ícono ). Esto iniciará el proceso de armado, y esperamos a que culmine exitosamente
(esto lo podemos ver en la solapa Output) .
Campus Party, Mar 15th 2019 GeneXus S.A
NOTA: Al usar la opción Deploy to Cloud todos los servicios se ejecutan de forma remota, pudiendo
presentarse problemas de red. Asegurarse tener buena conectividad.
Una vez armada la KB, dirigirse a View > Show QR desde la toolbar (ver Figura 8). Esto lanzará
el navegador, y nos mostrará el código QR al cual podremos acceder a la aplicación.
NOTA: Considerar que en este punto del workshop aún no hemos agregado ninguna funcionalidad. Con cada
cambio que realizamos, debemos repetir el proceso de para armar la KB y obtener el código QR.
Campus Party, Mar 15th 2019 GeneXus S.A
B Explorer lo
Una vez instalado el módulo, en el K
podemos encontrar dentro del nodo References ( ver
Figura 10).
1
En su versión para GeneXus 16 Upgrade 2. En upgrades posteriores se incorporarán Baidu AI y
Alibaba, así como también la posibilidad de incluir modelos adaptados a necesidades específicas.
Campus Party, Mar 15th 2019 GeneXus S.A
NOTA: En este laboratorio vamos a utilizar los servicios de IBM Watson, pero la funcionalidad que
implementemos es independiente de los servicios que se terminen usando.
El módulo GeneXusAI a su vez está compuesto por varios submódulos que agrupan las
funciones del mismo según el tipo de funcionalidad de cada una.
Configuration
Define el concepto de Provider (SDT), utilizado como input en todas las funciones del módulo.
Para cada “provider” se define un nombre y el tipo de proveedor2, y además un conjunto de
parejas clave-valor con la información que necesita cada servicio.
Audio
Contiene las funciones que permiten interactuar con el habla.
+ SpeechToText: Transcribe de un audio con voz a texto.
+ TextToSpeech: Recita un texto en “voz alta”.
Image
Contiene las funciones para manipular imágenes.
+ Classify: Identifica el objeto principal en la imagen.
+ DetectFaces: Detecta rostros en la imagen.
+ DetectObjects: Detecta los objetos que se encuentran presentes en la imagen.
+ DetectScene: Detecta el escenario en por la imagen (p.e.campo, ciudad, playa, etc.).
+ OCR: Reconoce de texto en imágenes.
Text
Contiene funciones relativas a textos escritos en lenguaje natural.
+ DetectLanguage: Identifica el idioma en que está escrito el texto dado.
+ ExtractEntities: Extrae las entidades principales del texto.
+ KeyPhrases: Extrae las palabras o frases más relevantes del texto.
+ SentimentAnalysis: Cuantifica el sentimiento expresado en el texto.
+ Translate: Traduce de un idioma a otro.
Video
Contiene funciones para el tratamiento de videos
+ Process: Comienza el procesamiento de un video en forma asíncrona.
+ Analyze: Extrae la información analizada en el video (p.e. caras, discurso, texto, categorías).
2
Es decir, el fabricante.
Campus Party, Mar 15th 2019 GeneXus S.A
NOTA: Las claves aquí expuestas fueron generadas con propósito de este laboratorio y serán
dadas de baja culminado el workshop. En la Parte 3 de este documento se brinda una guía de
ejemplo para generar claves personales.
Con tal motivo, abrimos el objeto GetProvider y nos dirigimos a la solapa “Rules” para definir
qué parámetros aceptará el procedimiento mediante una regla “parm” como esta:
parm(in:&name, out:&provider);
&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'lzFqAZYt58LB2vd1EpROiJYYcgFtMt0nn4aO3Pu5_tdK'
&provider.Properties.Add(&prop)
endIf
&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'ggHrLTK63FUM8fpmEKL3uyH7JAzvdkrKC57mxks_jJSx'
&provider.Properties.Add(&prop)
endIf
&provider.Name = !'watson-stt'
&provider.Type = ProviderType.IBM
&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'lUUPdN8w9-Y55k1WtTEIovOvCx97hMkid6B7EGjCs2rU'
&provider.Properties.Add(&prop)
endIf
&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'FRrGhE9Am7IjH8BS54W3lEMW3lfNBQ0UxRu0yu8h5chV'
&provider.Properties.Add(&prop)
endIf
NOTA: Si bien estamos usando un sólo proveedor (IBM Watson), en este caso definimos varias entradas
para él (condicionales “if”) puesto que el proveedor nos brinda credenciales específicas por cada servicio.
Esta particularidad depende de cada proveedor; p.e. Google o Amazon nos brinda una única clave para todos
los servicios y, por tanto, estos proveedores tendrían una única entrada (i.e. un único “if” ) asociada en el
procedimiento.
En el Panel MainLabAI, en pantalla tenemos dos combos, “From” y “To” que indican de qué
idioma a qué idioma vamos a traducir.
endIf
if &fromLanguage.IsEmpty() OR &toLanguage.IsEmpty()
msg(!'Select valid from and to languages to perform translation')
else
if &fromLanguage = &toLanguage
msg('Select different from and to languages')
else
&from.FromString(&fromLanguage)
&to.FromString(&toLanguage)
Progress.ShowWithTitleAndDescription('Translate','Processing')
&translated = Translate(&source,&from,&to,&provider,&messages)
Progress.Hide()
endIf
endIf
endComposite
EndEvent
Source 1: Evento ‘Translate’ para traducir texto escrito de un idioma a otro
Luego controlamos que en el &from no se haya elegido la opción de detectar el idioma, que
vamos a implementar en el siguiente paso.
Por último validamos que se hayan seleccionado los idiomas &from y & to. Si están
configurados por el usuario, y son distintos, invocamos a la función de traducción
(Text.Translate).
Probamos la aplicación
y seleccionamos “From” con valor Spanish y “To” con valor English, el resultado esperado es
(algo del estilo de):
por:
if &fromLanguage = !'.'
Progress.ShowWithTitleAndDescription('Autodetect','Processing')
&outputLabel = DetectLanguage(&source, &provider, &messages)
Progress.Hide()
&fromLanguage = &outputLabel.label
endIf
definiendo en la solapa “Variables” lo siguiente:
● &outputLabel OutputLabel, GeneXusAI
En este punto volvemos a ejecutar la aplicación, y la misma debe ser capaz de detectar el
idioma del texto ingresado cuando hayamos seleccionando la opción Auto en el combo “From”.
Campus Party, Mar 15th 2019 GeneXus S.A
Primero valida que el idioma de origen esté correctamente configurado (no sea vacío ni Auto) .
Campus Party, Mar 15th 2019 GeneXus S.A
Luego se llama al panel SelectImage que ayudará al usuario a seleccionar una imagen, ya sea
eligiendo la imagen provista por defecto, eligiendo una desde su galería o tomando una
fotografía.
NOTA: IBM Watson únicamente reconoce texto en Inglés a partir de imágenes. Otros valores de “From”
podrían dar resultados no esperados. Otros proveedores sí soportan texto multi-idioma.
Probamos la aplicación
Repetimos el proceso para ejecutar la aplicación y, en este punto, la misma debe ser capaz de
detectar texto en una imagen que seleccionemos o tomemos foto.
Para ejecutar una prueba sencilla, seleccionar “From” el valor English y hacer tap en el ícono
de la cámara. Allí, elegir la imagen provista por defecto (cartel “Central Park”, en Inglés) y hacer
tap en el botón “Done”. Al terminar de procesar, se obtendrá en texto “central south park” .
Si desea hacer otra prueba con imágenes de su galería o tomada mediante una fotografía,
asegúrese de que el texto presente en la imagen esté en Inglés (el resultado para otros idiomas
puede no ser correcto).
3
En una implementación real seguramente vamos a querer saber dónde está cada texto y con qué
confianza se reconoció cada uno; para este ejemplo, nos alcanza con concatenarlos todos sin importar el
orden.
Campus Party, Mar 15th 2019 GeneXus S.A
Source 3: Evento microphone.tap para reconocer texto a partir del habla
Un ‘Locale’ es una particularización de un ‘Language’ para una zona determinada; p.e. para el
idioma Español (language ‘es’) podemos encontrar variantes para España (locale ‘es-ES’),
México (locale ‘es-MX’), etc.
Campus Party, Mar 15th 2019 GeneXus S.A
Probamos la aplicación
Ejecutar la aplicación. En este punto la misma debe ser capaz de convertir a texto el contenido
(hablado) de un archivo de audio grabado por el dispositivo.
Síntesis de voz
Por último, vamos a agregar la opción de que el dispositivo lea en voz alta el texto traducido.
Primero valida que el lenguaje de destino haya sido previamente configurado por el usuario.
Luego, de forma análoga a los demás códigos que hemos visto, se solicita la información del
proveedor para el servicio de síntesis del habla mediante el procedimiento GetProvider.
Luego, se infiere el valor de &locale a partir del &toLanguage y se invoca a la función
Audio.TextToSpeech para finalmente reproducir el resultado en el dispositivo.
Campus Party, Mar 15th 2019 GeneXus S.A
Probamos la aplicación
Ejecutar la aplicación. En este punto la misma debe ser capaz de recitar en voz alta el texto
que hayamos traducido previamente.
¡Felicitaciones!
Campus Party, Mar 15th 2019 GeneXus S.A
El documento HowTo: Get provider's credentials for GeneXusAI explica cómo obtener las
credenciales para los distintos proveedores. Los pasos a seguir dependen de cada uno de
ellos, el documento antes mencionado indica cuáles son los servicios que se requieren para
cada función del módulo.
Una vez en el portal debemos iniciar sesión (o crear una cuenta si no tenemos una), y vamos a
ver una pantalla como muestra la Figura 11.
Campus Party, Mar 15th 2019 GeneXus S.A
En el campo de búsqueda escribimos “ocr”, y debe aparecer la opción “Inference Service for
Optical Character Recognition (OCR)” (ver Figura 12).
En dicha pantalla clickeamos el botón “Show API Key” nos da la clave que debemos usar en
nuestra aplicación.
&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'{tu_API_key}'
&provider.Properties.Add(&prop)
endif
Campus Party, Mar 15th 2019 GeneXus S.A
Solo nos falta un paso más para poder usar este servicio en nuestra aplicación. En el Panel
MainLabAI, en el evento camera.tap, simplemente reemplazamos la línea que dice:
&provider = GetProvider(!'watson-ocr')
por:
&provider = GetProvider(!'sap-ocr')
Cuando volvamos a ejecutar la aplicación, el servicio de OCR que estaremos usando será el de
SAP Leonardo en vez de usar el de IBM Watson. ¡Todo esto habiendo cambiado sólamente
el nombre del proveedor!
Esta facilidad para intercambiar proveedores permite prototipar de forma rápida probando
varios servicios, permitiendo así que nuestra aplicación use el mejor servicio para nuestro caso
de uso.
Campus Party, Mar 15th 2019 GeneXus S.A
Anexo I: Referencias
● Documentación oficial
GeneXus Artificial Intelligence.
● Imágenes de la aplicación
IconFinder (MIT Licence).
Campus Party, Mar 15th 2019 GeneXus S.A