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_columns
de 🤗 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)
¡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.