febrero 21, 2022 10:00 am

Jesús

En un artículo publicado recientemente hablamos sobre cómo traducir texto usando una combinación de OCR y NLP.

No obstante, en aquella ocasión nuestro lenguaje de partida siempre era el inglés.

¿Por qué? Pues, porque por defecto Tesseract está preparado para escanear, extraer texto en inglés.

La pregunta obvia en este punto sería, ¿puede Tesseract trabajar con otros idiomas? 

Más aún, ¿podemos traducir entre dos pares de idiomas cualesquiera?

La respuesta es: ¡Claro que sí!

Al final de este artículo sabrás: 

  • Cómo descargar y configurar Tessdata.
  • Cómo escanear y traducir texto entre múltiples lenguajes, usando Tesseract y TextBlob.

Instalación de Tessdata

Como su nombre indica, Tessdata es un compendio de archivos de datos de lenguajes basados en modelos de redes neuronales, principalmente LSTMs, que se usan para expandir las capacidades de Tesseract.

Estos modelos han sido entrenados para reconocer y extraer texto en infinidad de idiomas, como Vietnamita, Inglés, Español, Alemán, entre muchos otros.

Si estás en un sistema basado en Unix, como macOs, Ubuntu o Debian, sigue estas instrucciones para descargar y configurar Tessdata en tu máquina:

Primero, clona el repositorio de tessdata en tu máquina:

git clone https://github.com/tesseract-ocr/tessdata

Después, muévete al directorio:

cd tessdata

Usa pwd para obtener la ruta absoluta y cópiala:

pwd

Por último, asigna el valor del paso anterior a la variable de entorno TESSDATA_PREFIX. Por ejemplo, en mi caso sería así:

export TESSDATA_PREFIX=/home/jesus/DataSmarts/tessdata

¡ATENTO!

Para evitar tener que crear esta variable de entorno cada vez que vayas a usar Tesseract, añade la instrucción del último paso a tu archivo ~/.bashrc

Eso es todo. Prosigamos.

Creación del Entorno de Desarrollo con Anaconda

Veamos la estructura del proyecto:

Aparte de varias imágenes de ejemplo, el proyecto cuenta con el archivo datasmarts/universal_translator.py, que es donde está implementada la lógica del traductor.

Si deseas descargarte la versión definitiva del código, simplemente llena el siguiente formulario:

Como dicta la costumbre, ahora tenemos que crear y configurar el ambiente de Anaconda. 

Ubícate en la raíz del proyecto y ejecuta este comando:

conda env create -f pytesseract-non-english

El ambiente que acabas de crear responde a esta configuración (pytesseract-non-english):

Para activar el ambiente, ejecuta:

conda activate pytesseract-non-english

Buenísimo. Con los preparativos listos, podemos empezar a implementar

Traducción Universal con Tesseract y TextBlob

Abre el archivo datasmarts/universal_translator.py, e inserta estas líneas para traerte las dependencias del script:

El siguiente paso es definir el menú del programa, el cual se compone de estos argumentos:

  • -i/--image: Ruta a la imagen de entrada.
  • -l/--lang: Lenguaje de origen que Tesseract usará para escanear el texto en la imagen.
  • -t/--to:Lenguaje al cual traduciremos el texto.
  • -p/--psm: Page Segmentation Mode. Se usa para decirle a Tesseract cómo interpretar el texto en la imagen. El valor por defecto, 13, le dice que lea todo como una sola línea de texto. Esto es algo que exploraremos en futuros artículos.

Ahora cargamos la imagen, y cambiamos de espacio de color (de BGR a RGB) para evadir problemas de compatibilidad con Tesseract:

Mostramos la imagen en pantalla:

Configuramos Tesseract para que use el lenguaje de origen determinado por el argumento -l/--language y el modo de segmentación de página:

Posteriormente, usamos la conocida función pytesseract.image_to_string() para extraer el texto de la imagen:

Mostramos el texto escaneado por Tesseract, justo antes de traducirlo:

Para traducirlo, instanciamos un objeto de tipo TextBlob(), pasándole como argumento dicho texto. Luego, llamamos el método translate(), especificando en el parámetro to el lenguaje de destino:

Finalmente, imprimos en consola la traducción, y cerramos las ventanas creadas por OpenCV:

Insert Content Template or Symbol

¡ATENTO!

Antes de ejecutar el código, asegúrate de hallarte en la raíz del proyecto para que los comandos funcionen correctamente.

Corramos un primer ejemplo:

python datasmarts/universal_translator.py -i german.png -t en -l deu

Esta instrucción traducirá la siguiente imagen, que contiene una frase en alemán, al inglés:

En consola veremos esto:

TEXTO ORIGINAL
Ich brauche ein Bier!



-- - -
TRADUCIDO
I need a beer!

Genial, ¿no crees?

Si quisieras traducir al español, simplemente especificarías -t es, así:

python datasmarts/universal_translator.py -i german.png -t es -l deu

El resultado en la terminal será:

TEXTO ORIGINAL
Ich brauche ein Bier!



-- - -
TRADUCIDO
¡Necesito una cerveza!

Hay más imágenes con las que puedes probar, por lo que te recomiendo fuertemente que descargues el código en la siguiente sección.

Resumen

El día de hoy aprendimos a crear un traductor universal con la ayuda de Tesseract y TextBlob.

La mecánica de la traducción es idéntica a la que vimos en este artículo. No obstante, toda la clave del asunto radica en descargar y configurar adecuadamente Tessdata para desbloquear los poderes de OCR de Tesseract.

Una vez contamos con la amplia colección de modelos de lenguajes de Tessdata, solo debemos apuntar la variable TESSDATA_PREFIX al directorio donde se encuentran dichos archivos. 

Esto hace que Tesseract pueda “leer” textos en lenguajes tan variados como el Inglés, Árabe, Vietnamita, Japonés, Español, Alemán, Francés, entre un sinnúmero de otras opciones.

Cool, ¿no?

Te invito a que descargues el proyecto en este formulario, para que continúes experimentando y aprendiendo por tu cuenta:

Nos vemos ¡Hasta la próxima!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.