Audio Course documentation

Cargar y explorar una base de datos de audio

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Cargar y explorar una base de datos de audio

En este curso usaremos la libreria 🤗 Datasets para trabajar con bases de datos de audio. 🤗 Datasets es una libreria de código abierto para descargar y preparar conjuntos de datos de todos los tipos, incluyendo audio. La libreria ofrece un acceso fácil a una gran cantidad de conjuntos de datos públicos almacenados en el Hugging Face Hub. Además, 🤗 Datasets incluye multiples funcionalidades pensadas para simplificar el trabajo con conjuntos de datos de audio para investigadores y desarrolladores.

Para empezar a trabajar con bases de datos de audio, asegurate de tener la librería 🤗 Datasets instalada:

pip install datasets[audio]

Una de las principales características de 🤗 Datasets es la posibilidad de descargar y preparar un conjunto de datos en una sola linea de código usando la función load_dataset()

Carguemos y exploremos un conjunto de audios llamado MINDS-14, el cual contiene grabaciones de personas haciendo preguntas sobre sistemas electrónicos bancarios en diferentes lenguajes y dialectos.

Para cargar MINDS-14, necesitamos copiar el identificador de la base de datos que aparece en el Hub (PolyAI/minds14) y pasarlo como argumento a la función load_dataset. Tambien especificaremos que solo estamos interesados en el subconjunto de inglés Australiano(en-AU) y la partición de entrenamiento(“train”):

from datasets import load_dataset

minds = load_dataset("PolyAI/minds14", name="en-AU", split="train")
minds

Output:

Dataset(
    {
        features: [
            "path",
            "audio",
            "transcription",
            "english_transcription",
            "intent_class",
            "lang_id",
        ],
        num_rows: 654,
    }
)

El conjunto de datos contiene 654 audios, cada uno acompañado de su transcripción, una transcripción en inglés, y una etiqueta que indica la intención de la pregunta de la persona. La columna de audio, contiene la información en bruto del audio. Examinemos ahora uno de los ejemplos:

example = minds[0]
example

Output:

{
    "path": "/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav",
    "audio": {
        "path": "/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav",
        "array": array(
            [0.0, 0.00024414, -0.00024414, ..., -0.00024414, 0.00024414, 0.0012207],
            dtype=float32,
        ),
        "sampling_rate": 8000,
    },
    "transcription": "I would like to pay my electricity bill using my card can you please assist",
    "english_transcription": "I would like to pay my electricity bill using my card can you please assist",
    "intent_class": 13,
    "lang_id": 2,
}

Puedes ver que la columna de audio se compone de las siguiente información:

  • path: La ruta al archivo de audio (*.wav en este caso).
  • array: Los datos decodificados de audios, representedos como un NumPy array de 1 dimensión.
  • sampling_rate. La frecuencia de muestreo del archivo (8,000 Hz en este ejemplo).

La columna intent_class es de tipo categórico codificado en enteros. Para convertir este número en una texto con significado podemos usar el método int2str():

id2label = minds.features["intent_class"].int2str
id2label(example["intent_class"])

Output:

"pay_bill"

Si miras la columna de transcription, puedes ver que en efecto la persona ha grabado un audio haciendo una pregunta sobre pagar una cuenta.

Si planeas entrenar un clasificador de audio en este subconjunto de datos, no necesitas toda la información contenida en las columnas del conjunto de datos. Por ejemplo, la información en lang_id sera igual para todos los ejemplos y no nos será útil. La columna english_transcription' seguramente sera un duplicado de la columna transcription` en este subconjunto, por lo que podemos removerla tambien.

Puedes eliminar características irrelevantes usando el método `remove_columnsde 🤗 Datasets

columns_to_remove = ["lang_id", "english_transcription"]
minds = minds.remove_columns(columns_to_remove)
minds

Output:

Dataset({features: ["path", "audio", "transcription", "intent_class"], num_rows: 654})

Ahora que hemos cargado e inspeccionado los contenidos del conjunto de datos, ¡escuchemos algunos ejemplos! Usaremos Blocks y Audio de Gradio para cargar algunos ejemplos del dataset.

import gradio as gr


def generate_audio():
    example = minds.shuffle()[0]
    audio = example["audio"]
    return (
        audio["sampling_rate"],
        audio["array"],
    ), id2label(example["intent_class"])


with gr.Blocks() as demo:
    with gr.Column():
        for _ in range(4):
            audio, label = generate_audio()
            output = gr.Audio(audio, label=label)

demo.launch(debug=True)

Podemos visulizar tambien algunos de los ejemplos. Grafiquemos ahora la forma de onda del primer ejemplo.

import librosa
import matplotlib.pyplot as plt
import librosa.display

array = example["audio"]["array"]
sampling_rate = example["audio"]["sampling_rate"]

plt.figure().set_figwidth(12)
librosa.display.waveshow(array, sr=sampling_rate)
Waveform plot

¡Pruebalo! Decarga otro dialecto o lenguaje del conjunto MINDS-14, escucha y visualiza ajgunos ejemplos para tener un sentido de la variación de toda la base de datos. Puedes ver una lista de todos los lenguajes aqui.