Seguridad

Cómo usar la Inteligencia Artificial para el Análisis de Audios de WhatsApp o Youtube en OSINT

En la primera parte de este artículo, titulada: “Cómo usar la Inteligencia Artificial para el Análisis Forense y la Ciberinvestigación de Audios” vimos algunas herramientas tanto comerciales como Open Source que se pueden utilizar para realizar estas tareas. En esta segunda vamos a ver cómo podemos utilizarlas en unos ejemplos concretos.

Figura 1: Cómo usar la Inteligencia Artificial para el
Análisis de Audios de WhatsApp o Youtube en OSINT
Para eso, vamos a analizar un audio de WhatsApp y la pista de un sonido de Youtube. La primera con ruidos de fondo, la segunda en medio de una discoteca. Por último vamos a ver cómo crear nuestro propio análisis con Python utilizando las herramientas Open Source. Vamos manos a la obra.

Cómo analizar las pistas de audio con Demucs & Mosaic.ai
Vamos a centrarnos en las aplicaciones que tenemos disponibles Open Source, en concreto con Demucs. Para esta prueba usaremos el siguiente audio donde aparece mi voz con un ruido de tráfico de fondo enviando un mensaje a Chema Alonso:

Figura 2: Audio de ejemplo principal, sin modificar
llamado AudioWhatsApp.wav (en el script)

Una vez instalado, ejecutarlo es muy sencillo, pero para demostrar las diferentes opciones de Demucs, he usado otro modelo para realizar la separación:


demucs -n mdx_extra AudioWhatsApp.wav
Con esto tendremos una carpeta de salida llamada “separated” donde aparecerán varios ficheros .wav. El que nos interesa es el “vocals” y el “others”, donde estarán la voz aislada y el ruido de fondo sin voz, respectivamente. En el fichero “vocals” podemos ver que ha habido una mejora sensible en la calidad de la voz aunque aún se oyen los coches de fondo:

Figura 3: Audio con la voz mejorada, aún con
ruido de fondo. AudioWhatsApp_Voz_A.wav

Pero podemos mejorar la separación de las pistas, para eso debemos usar otros modelos con Demucs y en concreto de MDX-Net. Existe una aplicación Open Source llamada “Ultimate Vocal Remover” que es una GUI para Demucs, facilitando mucho su utilización y selección de diferentes modelos:


Cambiando de diferentes modelos y jugando con las diferentes opciones, podemos llegar a obtener una salida óptima, prácticamente limpia, en dos pistas diferentes, una con el tráfico y otra con la voz:

Figura 5: Pista con el tráfico o sonido de fondo
sin la voz. AudioWhatsApp_Trafico.wav

Tener la pista del sonido de tráfico puede permitir descubrir sonidos de todo tipo. Trenes, coches, camiones o motos. E incluso, podríamos analizar qué tipo de moto (o de coche) se escucha de fondo en uno de estos audios. Ya hicimos hace años un experimento con esto en el equipo de Ideas Locas llamado: ““Colega, ¿dónde está mi moto?”. Cómo reconocer motos por su sonido con Inteligencia Artificial“.

Y ahora la voz, donde notamos una clara mejoría respecto a la anterior prueba:


Figura 7:  Pista con la voz aislada prácticamente
limpia. AudioWhatsApp_Voz_B.wav

Para poder separar diferentes pistas en función del tipo de audio concreto como por ejemplo para identificar acciones o eventos específicos (como disparos, cristales rotos, etcétera) , artefactos (aviones, coches, motos, etcétera) tenemos que ir buscando modelos pre-entrenados o entrenarlo nosotros.


Nuevo libro de Luis Márquez en 0xWord.
Toda esa información se puede utilizar para hacer investigaciones más profundas sobre los audios que te envía una determinada persona por WhatsApp, así que si el OSINT es una parte de tu investigación, estas herramientas deben estar en tu mochila, al igual que las que publicamos en el artículo de “Are you Talkin’ ta me?” donde presentamos cómo hacer Age Stimation, Gender Prediction, Sentiment Analysis con modelos de Machine Learning, así como los modelos para reconocer las voces y las personas que se escuchan en un audio.

Figura 9: Pista de audio de una entrevista
en una discoteca extraida con Moises.ai
En este otro ejemplo utilizamos Moises.ai para separar en dos pistas una entrevista en una discoteca publicada en un vídeo de Youtube. En el audio de arriba tenéis la pista de voz, y en el de abajo la pista de fondo, donde se escuchan el resto de los ruidos.

Figura 10: Pista de fondo de la entrevista de la discoteca
Las diferentes opciones que antes he mencionado son un buen comienzo para construir nuestro propio detector y separador de pistas de sonido. Vamos a ver un ejemplo a continuación.


Cómo crear nuestro propio identificador de sonidos

Una vez tenemos ya nuestra implementación para separar los sonidos en diferentes pistas de audio, tocaría entonces identificarlos. Para esto existen multitud de datasets, modelos pre-entrenados, aplicaciones online, etcétera. De nuevo nos centraremos en una aplicación Open Source y creando nuestro propio código en Python para que pase a formar parte de nuestra mochila de herramientas OSINT.

En concreto usaremos YAMNet, un modelo de clasificación de audio preentrenado de Google, para identificar y clasificar sonidos. YAMNet está basado en la arquitectura de redes neuronales profundas y ha sido entrenado con el dataset AudioSet, que contiene una gran colección de todo tipo de sonidos etiquetados. El modelo está disponible a través de TensorFlow Hub, lo que permite su fácil integración en aplicaciones sin necesidad de entrenamiento desde cero.

Usaremos Librosa para cargar y preprocesar el audio, asegurando que esté en mono y a 16 kHz, que es la tasa de muestreo esperada por YAMNet. Después de procesar el audio, el modelo genera probabilidades para cada clase de sonido, seleccionando las cinco etiquetas más probables. Estas etiquetas se cargan desde un archivo CSV local, lo que permite personalizar las categorías que el modelo puede reconocer. 

Aquí tienes el código para implementarlo, sólo hay que añadir un fichero .wav con la pista de audio a reconocer (NOTA: una buena predicción depende de muchos factores, calidad del audio, ruidos de fondo, etcétera):

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
import librosa
import csv

# YAMNet desde TensorFlow Hub
yamnet_model_url = 'https://tfhub.dev/google/yamnet/1'
yamnet_model = hub.load(yamnet_model_url)

# Etiquetas de clase de YAMNet desde un archivo CSV local
# https://github.com/tensorflow/models/blob/
# /master/research/audioset/yamnet/yamnet_class_map.csv
labels_csv_path = 'yamnet_class_map.csv'  

# Aquí cargamos las etiquetas desde el archivo CSV
def load_labels(csv_path):
    with open(csv_path, 'r') as f:
        reader = csv.reader(f)
        labels = [row[2] for row in reader if len(row) > 2]
    return labels

yamnet_labels = load_labels(labels_csv_path)

# Esta función se encarga de predecir sonidos partiendo de un archivo de audio
def predict_yamnet(file_path):
    # Cargar el archivo de audio
    waveform, sample_rate = librosa.load(file_path, sr=16000, mono=True)
    
    # Nos aseguramos que el audio es mono y tiene la tasa de muestreo adecuada
    if len(waveform.shape) > 1:
        waveform = waveform.mean(axis=1)

    # Borrado de cualquier dimensión extra
    waveform = waveform.astype(np.float32)

    # Predicción
    scores, embeddings, spectrogram = yamnet_model(waveform)

    # Obtenemos las 5 etiquetas más probables
    mean_scores = np.mean(scores, axis=0)
    top5_indices = np.argsort(mean_scores)[-5:][::-1]
    top5_labels = [yamnet_labels[i] for i in top5_indices]
    top5_scores = mean_scores[top5_indices]
    
    return list(zip(top5_labels, top5_scores))

# Archivo a analizar
audio_file_path = 'subway_sound.wav'  

# Código principal para obtener predicciones
predictions = predict_yamnet(audio_file_path)
for label, score in predictions:
    print(f"{label}: {score:.4f}")

Al ejecutarlo obtendremos una salida similar a la siguiente, en la cual hemos pasado como parámetro un fichero .wav del sonido de un tren de metro, donde vemos que aparece como la etiqueta más probable (0.54) pero también nos ofrece otras interesantes y relacionadas como ”traqueteo” o “crujido” (Crackle) con 0.65:

Figura 13: Detección con YAMNet para sonido de metro.

Si pasamos el código por un fragmento del audio de ejemplo extraído anteriormente del ruido de fondo del tráfico (sin voz y sin procesar la calidad) que tenemos en la Figura 5, obtenemos este resultado:

Figura 14: Detección con YAMNet para sonido el
sonido del tráfico extraído anteriormente.

Como vemos, “Crackle” suele ser un elemento bastante común ya que se encuentra en este tipo de audios (en todos estos sonidos hay crujidos, traqueteos, etcérera), pero la segunda etiqueta sí que la identifica como un sonido de tráfico, muy cercano al ruido de un tren.

El pitido de los coches en este caso los ha confundido con el pitido de un tren, pero, aun así, es un buen comienzo para ir afinando y perfeccionando este código y también la calidad del audio (ya que esto influye mucho en su identificación). A partir de este punto ya podríamos construir nuestro propio pipeline de limpieza y reconocimiento de sonidos usando Inteligencia Artificial.


Conclusiones

La Inteligencia Artificial ha propiciado un salto sin precedentes en el procesamiento de audio, ofreciendo herramientas precisas que pueden separar y analizar pistas de audio en contextos musicales y de cualquier otra naturaleza. Esta capacidad de aislar sonidos específicos en una grabación es un gran paso adelante en el Análisis Forense Digital, permitiendo a los investigadores examinar pruebas sonoras con una gran precisión y detalle.

A medida que la tecnología avanza, podemos esperar una mayor integración de la IA en estos procesos, lo que mejorará la precisión y eficiencia de la investigación. El análisis de audio que darán lugar a nuevas herramientas de análisis de audio que casi son de ciencia ficción.

Happy Hacking Hackers!!!

Autor: Fran Ramírezes 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“, también de “Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.

 Contactar con Fran Ramírez en MyPublicInbox

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.