domingo, febrero 24, 2019

Python for Social Good o cómo crear en un rato tu propia colección de herramientas para bien social #Python

Ahora más que nunca, con la gran cantidad de recursos gratuitos que tenemos en Internet, crear aplicaciones que nos ofrezcan soluciones orientadas al bien social es una tarea realmente sencilla. En este artículo vamos a demostrar lo fácil que es crear una aplicación (que llamaremos SocialGood.py) en Python que realice todas estas acciones:

Figura 1: Python for Social Good o cómo crear en un ratito
tu propia colección de herramientas para bien social

Al final la potencia del lenguaje Python ha hecho que se convierta en uno de los más populares no solo para los pentesters, sino también para los Data Scientists, para las startups, y para poder crear un prototipo rápido y funcional en poco tiempo. Y es que sus posibilidades son enormes. Nuestro compañero en 0xWord, Dani Echeverri le dedicó dos pedazo de libros para ver todo lo que se podía hacer en el mundo del pentesting y el hacking.

Figura 2: Python para Pentesters & Hacking con Python

Hoy vamos a ver cómo nos da flexibilidad y multicanalidad. Es decir, podremos, por ejemplo, capturar un texto con la cámara del ordenador, convertirlo a Braille, luego a texto, después traducirlo al idioma que queramos, reproducirlo con voz por el altavoz y finalmente volcarlo a un MP3. Por supuesto, podemos combinar estas acciones como queramos, pero, además, también hemos incluido la opción de hablar por el micrófono y pasar a texto (en el idioma que queramos) la transcripción del mismo, para luego crear otro ciclo de acciones con el resultado obtenido.

Figura 3: Funciones disponibles en la aplicación Python

Todo esto ha sido posible gracias a la cantidad de repositorios y librerías que permiten realizar la mayor parte del trabajo. Sólo tenemos que tener algunas nociones de Python, instalar las dependencias y requisitos necesarios. Finalmente, sólo tenemos que programar nuestra propia aplicación. Este es el código fuente de la nuestra:

from google_speech import Speech
from googletrans import Translator
import speech_recognition as sr
from guessing_game import recognize_speech_from_mic
import braille
import cv2
import os

class SocialTools(object):

    def __init__(self, language):
        self.language=language
 
    def Capture_TextFromImage(self):
        cam = cv2.VideoCapture(0)
        while True:
            ret_val, img = cam.read()
            cv2.imshow('Detect Image', img)
            if cv2.waitKey(1) == 27:
                print("Success! Image taken")
                cv2.imwrite("capture.jpg",img)
                if braille.imageToBraille("capture.jpg") == "":
                    print("Error: Image not recognized")
                break
        cv2.destroyAllWindows()

        # Filtro del texto capturado OCR
        text_image=braille.imageToText("capture.jpg") 
        text_image = [s.replace('\n', ' ') for s in text_image]
        text_output = ''.join(text_image)  
        return(text_output)

    def Text_ToBraille(sefl,text_txt):
        return(braille.writeText(text_txt))
         
    def Traslate_Text(self,text_source):
        translator = Translator()
        translated_text=translator.translate(text_source,dest=self.language)
        return(translated_text.text)

    def Text_ToFileMP3(self,text_mp3,filename):
        speech = Speech(text_mp3, self.language)
        speech.save(filename+".mp3")

    def Text_ToSpeech(self,text_toaudio):
        speech = Speech(text_toaudio, self.language)
        speech.play()

    def Voice_ToText(self, set_language):
        r = sr.Recognizer()
        
        with sr.Microphone() as source:                                                                       
            print("Speak...")                                                                                   
            audio = r.listen(source)
        try:
            print("Output: " + r.recognize_google(audio, language=set_language))
            return(r.recognize_google(audio, language=set_language))
        except sr.UnknownValueError:
            print("Could not understand audio")
        except sr.RequestError as e:
            print("Could not request results; {0}".format(e))
        
if __name__ == "__main__":
    so_good=SocialTools("fr")
    text_from_image=so_good.Capture_TextFromImage()
    os.system('clear') 
    print(text_from_image)
    text_to_braille=so_good.Text_ToBraille(text_from_image)
    text_translated_from=so_good.Traslate_Text(text_from_image)
    print(text_translated_from)
    so_good.Text_ToSpeech(text_translated_from)
    so_good.Text_ToFileMP3(text_translated_from,"frances")
    voicetxt=so_good.Voice_ToText('es-ES')

Con este sencillo programa en Python, hemos creado una clase llamada SocialGood la cual nos permitirá realizar todas las tareas que antes hemos mencionado. Sólo tendremos que ir jugando con las diferentes llamadas a las funciones disponibles e ir concatenando las acciones que queramos.

Social Good: Ejemplos de uso

Por ejemplo, en el código publicado, podemos ver que el primer paso es definir el idioma principal con el que trabajaremos, en nuestro caso, francés:
so_good=SocialTools("fr")
Luego capturamos el texto de una captura obtenida desde la cámara del ordenador:
text_from_image=so_good.Capture_TextFromImage()
El texto recibido lo convertimos a Braille:
text_to_braille=so_good.Text_ToBraille(text_from_image)
El siguiente paso que realizamos es convertirlo al idioma francés que hemos definido antes:
text_translated_from=so_good.Traslate_Text(text_from_image)
Ahora hacemos que dicho texto se reproduzca por el altavoz con voz:
so_good.Text_ToSpeech(text_translated_from)
También hemos añadido la opción de poder hablar desde el micrófono para luego transcribir la conversación a texto plano, en el idioma que queramos (en nuestro caso español):
voicetxt=so_good.Voice_ToText('es-ES')
Finalmente, con esta función creamos un fichero MP3 (de nombre “frances”) con la traducción:
so_good.Text_ToFileMP3(text_translated_from,"frances")
Si fuera necesario, con el texto obtenido podríamos volver a ejecutar cualquiera de las otras funciones y así sucesivamente.

PoC en Vídeo

El siguiente vídeo muestra la ejecución de las acciones anteriores, es decir, primero captura de imagen con texto (en español), traducción a Braille, traducción al francés, reproducción por el altavoz del texto, prueba de reconocimiento de voz con el micrófono y finalmente (esto no se ve el vídeo), grabamos un fichero MP3:

Figura 4: PoC de SocialGood en Python

Las librerías y repositorios utilizados en el código han sido las siguientes:
Con apenas 70 líneas de código (seguro que este programa se puede mejorar y optimizar más) podemos implementar de una manera sencilla este tipo de aplicaciones las cuales pueden ser de gran utilidad para crear programas para el bien social.

Happy Hacking!!!

Autor: Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps" y del blog Cyberhades.

No hay comentarios:

Publicar un comentario