Está en la página 1de 20

Laboratorio

Inteligencia Artificial con GeneXus™


Copyright 1988 - 2018 | GeneXus S.A.
Todos los derechos reservados. Este documento no puede ser reproducido en ningún medio
sin el consentimiento explícito de GeneXus S.A. La información contenida en este documento
es para uso personal únicamente.

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.
Objetivos
Conocer el módulo GeneXusAI, los servicios que provee y cómo utilizarlos.

En este laboratorio vamos a desarrollar una aplicación de traducción automática para Smart
Devices, que permita traducir un texto ingresado en la aplicación (mediante el teclado), traducir
a partir de una grabación de audio, o traducir el texto detectado en una imagen. La salida de la
traducción será un texto, con la posibilidad de que la aplicación lo lea “en voz alta”.

El laboratorio se compone de tres partes. En la primer parte se configura la base de


conocimiento que se va a utilizar durante el laboratorio, y se hace una breve presentación del
módulo con una descripción de la funcionalidad que provee. En la segunda parte es donde
agregaremos los servicios de inteligencia artificial a nuestra aplicación. Por último en la tercer
parte - que es opcional-, vamos a ver cómo configurar los servicios de los distintos proveedores
para poder obtener las claves necesarias.
Parte 1: Configuración inicial
Prerrequisitos

El diseño de la interfaz de usuario de la aplicación no es parte del taller, por lo que se cuenta
con una base de conocimiento (KB) con el desarrollo inicial de esta interfaz de usuario.

Para crear la KB de forma local, se debe ejecutar GeneXus 16 y luego File > New > Knowledge
Base from GeneXus Server. En el campo Server KB URL poner lo siguiente:
http://samples.genexusserver.com/v16/home.aspx?GX28_LabAI_Startup,0.

Nota: es necesario contar con una GeneXus Account para poder acceder a la KB en el
GeneXus Server. Si no se tiene una, se debe crear antes de seguir adelante.

Ejecución de la aplicación final

Si se desea ver cuál será la interfaz de usuario de la aplicación final, se puede ejecutar la
misma en este momento (luego de hacer un Build All). El panel principal de la aplicación es
MainLabAI. La explicación de los componentes de la interfaz de usuario se pueden ver en el
Anexo II.

Conociendo el módulo GeneXusAI

El primer paso para poder utilizar el módulo GeneXusAI es incorporarlo a la KB. Para esto
debemos ir a la opción Manage Module References en el menú Knowledge Manager e instalar
el módulo GeneXusAI.

Figura 1: Manage Module References

Una vez instalado el módulo, en el KB Explorer lo podemos encontrar dentro de References.


Figura 2: KB Explorer

El módulo GeneXusAI se compone de un conjunto de Procedures, Structured Data Types


(SDTs) y Domains, que permiten interactuar de forma fácil con los servicios de inteligencia
artificial de distintos proveedores.

En la versión actual del módulo (versión correspondiente a GeneXus 16) se cuenta con tres
proveedores:

● IBM Watson,
● Microsoft Cognitive Services, y
● SAP Leonardo.

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.

El submódulo Configuration define el concepto de Provider (SDT), que se utiliza en todas


las funciones del módulo. Para cada “provider” se define un nombre y el tipo de proveedor1, y
además un conjunto de pares clave-valor con la información que necesita cada servicio.

El submódulo Audio contiene las funciones que permiten interactuar con el habla, éstas son:
SpeechToText (transcribe de un audio a texto) y TextToSpeech (recita en “voz alta” el texto).

1
Es decir, el fabricante.
El submódulo Image contiene las funciones para manipular imágenes, que son: 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 representado por la imagen, por ejemplo: campo, ciudad, playa,
aeropuerto, etc.) y OCR (reconocimiento de texto en imágenes).

El submódulo Text incluye funciones relativas a textos: DetectLanguage (identifica el idioma


en que está escrito el texto dado), ExtractEntities (extrae las entidades principales del
texto), KeyPhrases (extrae las frases más relevantes del texto, incluyendo keywords o palabras
clave), SentimentAnalysis (determina el sentimiento que expresa el texto dado, por ejemplo:
enojo, alegría, tristeza, etc.) y Translate (traduce de un idioma a otro).

Para este laboratorio las funciones que vamos a utilizar son:

● Audio.SpeechToText
● Audio.TextToSpeech
● Image.OCR
● Text.DetectLanguage
● Text.Translate
Parte 2: Agregando la funcionalidad
Definición de los providers

Antes de comenzar a implementar la funcionalidad de inteligencia artificial, necesitamos


configurar los proveedores que vamos a utilizar.

Para eso vamos a crear un nuevo Procedure de nombre GetProvider con los siguientes
parámetros que definimos en las Rules:

parm(in:&name, out:&provider);

donde:

● &name: VarChar(40)
● &provider: Provider, GeneXusAI.Configuration

El código del Procedure es el siguiente:

if &name = !'watson-translate'
&provider.Name = !'watson-translate'
&provider.Type = ProviderType.IBM

&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'{portal_provider_api_key}'
&provider.Properties.Add(&prop)
endif

if &name = !'watson-tts'
&provider.Name = !'watson-tts'
&provider.Type = ProviderType.IBM

&prop = new()
&prop.Key = PropertyKey.Username
&prop.Value = !'{portal_provider_api_username}'
&provider.Properties.Add(&prop)

&prop = new()
&prop.Key = PropertyKey.Password
&prop.Value = !'{portal_provider_api_password}'
&provider.Properties.Add(&prop)
endif

if &name = !'watson-stt'
&provider.Name = !'watson-stt'
&provider.Type = ProviderType.IBM

&prop = new()
&prop.Key = PropertyKey.Username
&prop.Value = !'{portal_provider_api_username}'
&provider.Properties.Add(&prop)

&prop = new()
&prop.Key = PropertyKey.Password
&prop.Value = !'{portal_provider_api_password}'
&provider.Properties.Add(&prop)
endif

if &name = !'watson-ocr'
&provider.Name = !'watson-ocr'
&provider.Type = ProviderType.IBM

&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'{portal_provider_api_key}'
&provider.Properties.Add(&prop)
endif

donde:

● &prop: Provider.Property, GeneXusAI.Configuration

Notar que si bien estamos usando un solo proveedor (IBM Watson), en realidad tenemos que
definir varios “providers”, porque cada uno de los servicios tiene sus propias credenciales.

Traducción de texto

La función más básica de la aplicación es poder traducir de texto a texto. Por lo tanto, es por
allí que vamos a comenzar.

En el Panel MainLabAI, en pantalla tenemos dos combos, “From” y “To” que indican de qué
idioma a qué idioma vamos a traducir.
En dicho panel vamos a editar el Event 'Translate', debe quedar así:

Event 'Translate'
composite
&provider = GetProvider(!'watson-translate')
if &fromLanguage = !'.' // autodetect language
// TODO
&fromLanguage = !''
endif
if &fromLanguage.IsEmpty() or &toLanguage.IsEmpty()
msg('Select valid from and to languages to perform translation')
else
&from.FromString(&fromLanguage)
&to.FromString(&toLanguage)
&translatedText = Translate(&sourceText, &from, &to, &provider,
&messages)
endif
endcomposite
Endevent

donde las variables que debemos definir son:

● &from: (based on) Language, GeneXusAI


● &to: (based on) Language, GeneXusAI
● &provider: Provider, GeneXusAI.Configuration
● &messages: Messages, GeneXus.Common

Lo primero que hacemos es obtener la información necesaria del proveedor de traducción.

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 verificamos que se hayan seleccionado los idiomas “From” y “To”, y si están,
llamamos a la función de traducción.

La función devuelve el texto traducido, y si hubo algún error, el mismo queda en la variable
&messages.

Ejecutar la aplicación (Run al Panel MainLabAI). En este punto la misma debe ser capaz de
traducir de texto a texto.

Por ejemplo, si traducimos de español a inglés el siguiente texto:


Bienvenidos al laboratorio de inteligencia artificial del encuentro GeneXus.

el resultado esperado es (algo del estilo de):

Welcome to the Artificial Intelligence laboratory of the GeneXus meeting.

Detección del idioma

El combo “From” permite elegir la opción “Autodetect”, funcionalidad que nos quedó pendiente
de implementar en el paso anterior.

Para poder detectar el idioma de origen vamos a utilizar la función Text.DetectLanguage.

En el Event 'Translate' vamos a eliminar el siguiente código:

if &fromLanguage = !'.' // autodetect language


// TODO
&fromLanguage = !''
endif

y en el último else, vamos a cambiar la forma en que se asigna la variable &from:

&from.FromString(&fromLanguage)

por:

if &fromLanguage = !'.' // autodetect language


&outputLabel = DetectLanguage(&sourceText, &provider, &messages)
&from.FromString(&outputLabel.label)
else
&from.FromString(&fromLanguage)
endif

donde:

● &outputLabel: OutputLabel, GeneXusAI

Ejecutar la aplicación. En este punto la misma debe ser capaz de detectar el idioma del texto
ingresado, seleccionando la opción “Autodetect” en el combo “From”.
Reconocer texto en una imagen

Nota: se puede probar esta funcionalidad en el emulador usando la imagen de ejemplo, o


descargando una imagen a la galería del mismo.

En este punto vamos a utilizar la función de Optical Character Recognition (Image.OCR) para
detectar texto en una imagen y luego traducirlo.

Para esto, debemos implementar el siguiente evento:

Event camera.Tap
composite
if &fromLanguage.IsEmpty()
msg('Select a From language first')
else
if &fromLanguage = !'.' // autodetect language
msg('Autodetect language not available for images')
else
SelectImage.CallOptions.Target = !'blank'
&image = SelectImage()

&from.FromString(&fromLanguage)

&provider = GetProvider(!'watson-ocr')
&outputRegionCollection = OCR(&image, &from, &provider, &messages)

if &outputRegionCollection.Count > 0
&sourceText = ProcessOCROutput(&outputRegionCollection)
else
&sourceText = ''
msg('Could not find text in selected image')
endif
endif
endif
endcomposite
Endevent

donde:

● &outputRegionCollection: Collection of OutputRegion, GeneXusAI


● &image: Image
El evento camera.Tap usa un Procedure -que debemos crear- de nombre ProcessOCROutput
que debe tener los siguientes parámetros:

parm(in:&outputRegionCollection, out:&outputText);

y el siguiente código:

&outputText = !''
for &outputRegion in &outputRegionCollection
&outputText += &outputRegion.label + !' '
endfor

donde:

● &outputRegion: OutputRegion, GeneXusAI


● &outputRegionCollection: Collection of OutputRegion, GeneXusAI
● &outputText: Text

El Procedure simplemente concatena todos los textos que se detectaron en la imagen2.

El evento primero valida que se tenga la información necesaria (el idioma de origen), luego
llama a un Panel para seleccionar la imagen (ya está definido en la KB inicial) y luego llama a la
función de OCR y procesa el resultado.

Ejecutar la aplicación, en este punto la misma debe ser capaz de detectar texto en una imagen
ingresada. Seleccionar From = English y hacer tap en la imagen de la cámara. Seleccionar la
imagen y tap en “Done”. Si se ejecuta en el simulador se puede usar la imagen de ejemplo
(cartel de “Central Park”) y se obtendrá en texto “central south park”. Si se ejecuta en un
dispositivo se puede usar una imagen capturada con la cámara.

Transcripción de texto a partir del habla

Nota: para poder probar la funcionalidad de este punto es necesario contar con un dispositivo
físico, no es posible probarlo en el simulador.

El otro método de entrada de texto a la aplicación será mediante el habla.

Para eso, debemos implementar el siguiente evento:

2
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.
Event microphone.Tap
composite
if &fromLanguage.IsEmpty()
msg('Select a From language first')
else
if &fromLanguage = !'.' // autodetect language
msg('Autodetect language not available for images')
else
RecordAudio.CallOptions.Target = !'blank'
&audio = RecordAudio()

do case
case &fromLanguage = !'en'
&locale = Locale.English_UnitedStates
case &fromLanguage = !'es'
&locale = Locale.Spanish_Spain
case &fromLanguage = !'pt'
&locale = Locale.Portuguese_Brasil
endcase

&provider = GetProvider(!'watson-stt')
&sourceText = SpeechToText(&audio, &locale, &provider, &messages)
endif
endif
endcomposite
Endevent

donde:

● &audio: Audio
● &locale: (based on) Locale, GeneXusAI

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 en 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.
Para eso vamos a implementar el siguiente evento:

Event speech.Tap
composite
if &toLanguage.IsEmpty()
msg('Select a To language first')
else
&provider = GetProvider(!'watson-tts')

do case
case &toLanguage = !'en'
&locale = Locale.English_UnitedStates
case &toLanguage = !'es'
&locale = Locale.Spanish_Spain
case &toLanguage = !'pt'
&locale = Locale.Portuguese_Brasil
endcase

&audio = TextToSpeech(&translatedText, VoiceType.Female, &locale,


&provider, &messages)

GeneXus.SD.Media.Audio.PlayBackground(&audio)
endif
endcomposite
Endevent

Ejecutar la aplicación. En este punto la misma debe ser capaz de recitar en voz alta el
resultado de la traducción.

En este punto la aplicación ya está completa. ¡Felicitaciones!


Parte 3 (opcional): Generar
credenciales
Un punto importante del módulo GeneXusAI es obtener las credenciales necesarias para utilizar
los servicios de los distintos proveedores en nuestras aplicaciones. Las credenciales que se
usaron para el laboratorio fueron creadas específicamente para el mismo y serán dadas de
baja a la brevedad.

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.

Funcionalidad de OCR de SAP

A modo de ejemplo, vamos a obtener una clave de SAP para la función de OCR.

Para eso, debemos acceder primero al sitio de SAP API:


https://api.sap.com/package/SAPLeonardoMLFunctionalServices.

Una vez en el portal debemos iniciar sesión (o crear una cuenta si no tenemos una), y vamos a
ver una pantalla como la que sigue:
Figura 3: Pagina inicial de SAP API Business Hub

En el campo de búsqueda escribimos “ocr”, y debe aparecer la opción “Inference Service for
Optical Character Recognition (OCR)”.
Figura 4: Servicio de OCR de SAP

En dicha pantalla el botón “Show API Key” nos da la clave que debemos usar en nuestra
aplicación.

Volviendo a GeneXus, en el Procedure GetProvider, agregamos un nuevo proveedor,


agregando el siguiente código al final:

if &name = !'sap-ocr'
&provider.Name = !'sap-ocr'
&provider.Type = ProviderType.SAP

&prop = new()
&prop.Key = PropertyKey.Key
&prop.Value = !'{portal_provider_api_key}'
&provider.Properties.Add(&prop)
endif

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. ¡Habiendo cambiado solamente 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.
Anexo I: Referencias
Documentación oficial de GeneXus Artificial Intelligence.

Funcionalidad del módulo GeneXusAI utilizada en el laboratorio:


● SpeechToText procedure
● TextToSpeech procedure
● OCR procedure
● DetectLanguage procedure
● Translate procedure

HowTo: Get provider's credentials for GeneXusAI

Las imágenes utilizadas en la aplicación son de https://www.iconfinder.com/iconsets/ionicons


(MIT Licence).
Anexo II: Interfaz de usuario
A continuación se muestra una captura de pantalla de la aplicación que vamos a desarrollar.

Figura 5: interfaz de usuario de la aplicación

La aplicación consiste de los siguientes componentes:

1. Texto a traducir
2. Idioma desde el cual se traduce
3. Idioma al cual se quiere traducir
4. Botón para realizar la traducción
5. Texto de salida, traducido al idioma de destino
6. Botón para poder introducir texto a partir de una imagen
7. Botón para poder introducir texto a partir de una grabación de audio
8. Botón para que la aplicación lea en voz alta el texto traducido

También podría gustarte