Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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 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.
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.
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.
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 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).
● Audio.SpeechToText
● Audio.TextToSpeech
● Image.OCR
● Text.DetectLanguage
● Text.Translate
Parte 2: Agregando la funcionalidad
Definición de los providers
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
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:
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
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.
El combo “From” permite elegir la opción “Autodetect”, funcionalidad que nos quedó pendiente
de implementar en el paso anterior.
&from.FromString(&fromLanguage)
por:
donde:
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
En este punto vamos a utilizar la función de Optical Character Recognition (Image.OCR) para
detectar texto en una imagen y luego traducirlo.
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:
parm(in:&outputRegionCollection, out:&outputText);
y el siguiente código:
&outputText = !''
for &outputRegion in &outputRegionCollection
&outputText += &outputRegion.label + !' '
endfor
donde:
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.
Nota: para poder probar la funcionalidad de este punto es necesario contar con un dispositivo
físico, no es posible probarlo en el simulador.
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
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.
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.
A modo de ejemplo, vamos a obtener una clave de SAP para la función de OCR.
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.
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.
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