In deze post lees je hoe je audio bestanden om kan zetten naar data met behulp van Python. Een handige skill om te hebben. Steeds vaker worden muziek, spraakberichten en geluidsopnames gebruikt in apps en analyses.
De gebruikte scrips zijn gemaakt in een Jupyter notebook.
Inhoudsopgave
1) Waarom audio data gebruiken?
Geluid is een onmisbaar deel van ons leven en daarom worden audiobestanden voor allerlei zaken gebruikt. Denk bijvoorbeeld aan muziek van streamingsdiensten of spraakherkenning op je smartphone.
Voorbeeld 1
Een streamingsdienst als Spotify heeft van nieuwe muziek nog geen gebruikersdata. Toch kunnen deze liedjes al wel worden geanalyseerd door een datamodel. Door de data van een nieuw liedje te vergelijken met de bestaande database, kun je bijvoorbeeld classificeren. Zo kun je (steeds beter en beter) voorspellen aan wie je het nieuwe liedje wil aanraden in hun playlist.
Voorbeeld 2
Bijna elke smartphone heeft de mogelijkheid om geluidsopnames te maken. Als je deze geluidsopnames omzet in data, zijn er allerlei mogelijkheden. Denk bijvoorbeeld aan een app die het geluid van een huilende baby herkent en vervolgens labelt. Handig voor jonge ouders die willen weten of hun kroost honger of pijn heeft.
Om gebruik te maken van audiobestanden in applicaties of analyses moet deze eerst omgezet worden naar bruikbare data, oftewel getallen. Een computer kan namelijk geen geluid horen, maar wel getallen lezen. Gelukkig is dat door Python makkelijker dan je denkt.
2) Audio bestanden; Een korte intro
Eerst een korte introductie van audiobestanden. Veel gebruikte audiobestanden zijn .wav of .mp3 bestanden. Deze bestanden bevatten Hertz en bits. De Hertz signalen in combinatie met de bits zorgen voor de tonen en de kwaliteit van het geluid.
Hoe hoger het aantal Hertz per seconde, hoe hoger de kwaliteit van het audiobestand. Veel voorkomende aantallen zijn 11025, 22050 en 44100 Hertz per seconde. Dit is ook afhankelijk van een mono of stereo opname. Kort door de bocht heb je dan bijvoorbeeld 11025 datapunten in één seconde geluid.
3) Audiobestanden naar data in Python
3.1 Pyhton libraries
Dankzij de library ‘Librosa’ is het mogelijk om audiobestanden om te zetten naar Python arrays. Hoe makkelijk het werkt, is te zien aan het onderstaande voorbeeld.
#Importeer librosa en laad het .wav-bestand in onder de naam ‘filename’
import librosa
filename = ‘Muziek/Test_geluid.wav’
#Gebruik de librosa.load functie om het .wav-bestand om te zetten naar een dataset met bijbehorende sample rate
dataset, sample_rate=librosa.load(filename)
print(dataset)
De uitkomst van dit korte script is:
array([ 0.00027088, 0.00116878, -0.00029695, ..., -0.01894607,
-0.01573606, -0.00720371], dtype=float32)
De geluidsopname, Test_geluid.wav, is omgezet naar een array met cijfers en is gereed voor verder gebruik.
Een voordeel van Librosa ten opzichte van andere tools is dat Librosa de data gelijk normaliseert naar 22050 Hertz per seconde. Zo worden mono en stereo bestanden bij voorbaat al gelijk getrokken.
3.2 MFCC
Een audiobestand omzetten naar één array is vaak niet genoeg om bruikbare data te creëren. Librosa bevat daarom ook een MFCC functie. MFCC staat voor Mel-Frequency Cepstral Coefficients. De MFCC haalt meerdere coëfficiënten uit het audiobestand. Hierdoor is het mogelijk om zowel de frequentie als tijdskenmerken van een geluid verder te analyseren.
MFCC gebruiken doe je op de volgende manier:
#Importeer librosa en laad het .wav-bestand in onder de naam ‘filename’
import librosa
filename = ‘Muziek/Test_geluid.wav’
#Gebruik de librosa.load functie om het .wav-bestand om te zetten naar een dataset met bijbehorende sample rate
librosa_audio_data,librosa_sample_rate=librosa.load(filename)
#Pas de MFCC functie toe
mfcc_dataset = librosa.feature.mfcc(y=librosa_audio_data, sr=librosa_sample_rate, n_mfcc=40)
#Check de vorm van de nieuwe array
Print(mfcc_dataset.shape)
Het resultaat hiervan is (40, 173), wat betekent dat er 40 arrays met elk 173 waarden zijn. De dataset is een stuk uitgebreider dan in het vorige voorbeeld.
3.3 Meerdere bestanden in één keer inladen
Eén audiobestand omzetten naar data is natuurlijk leuk, maar natuurlijk niet erg bruikbaar. Gelukkig kun je op een makkelijke manier meerdere bestanden inladen met behulp van metadata.
Hiervoor heb je nodig:
- Een document met metadata
- Eén map waar je audiobestanden in staan
Een voorbeeld van metadata is:
Bestandsnaam_audio | Categorie |
Audio_fragment_1.wav | Kat |
Audio_fragment_2.wav | Hond |
Audio_fragment_xyz.wav | Vogel |
Audio_hond_1.wav | Hond |
Het onderstaande script leest de metadata en laadt vervolgens de bestanden in.
#Laad de benodigde libraries en bestanden in
import pandas as pd
import os
import librosa
audio_dataset_path='Audiobestanden/2021/'
metadata=pd.read_csv('Overzicht_audiobestanden.csv')
metadata.head()
#Maak de functie waarbij de geluidsbestanden worden omgezet naar data
def data_extractor(file):
audio, sample_rate = librosa.load(file_name, res_type='kaiser_fast')
mfccs_features = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)
mfccs_scaled_features = np.mean(mfccs_features.T,axis=0)
return mfccs_scaled_features
#Laat de functie zijn werk doen op basis van het metadata bestand
import numpy as np
from tqdm import tqdm
extracted_audiodata=[]
for index_num,row in tqdm(metadata.iterrows()):
file_name = os.path.join(os.path.abspath(audio_dataset_path),str(row["Bestandsnaam_audio"]))
final_class_labels=row["Categorie"]
data=data_extractor(file_name)
extracted_audiodata.append([data,final_class_labels])
#Maak een pandas dataframe aan met de nieuwe data uit de functie
audiodata_df = pd.DataFrame(extracted_audiodata,columns= ['feature','class'])
audiodata_df.head()
Het audiodata_df dataframe bevat twee kolommen; Eén met de MFCC audio data en één met de categorie van het geluid.
feature | Categorie | |
1 | [-502.07373, 65.88543, -25.886047, 8.8449545, .. | Kat |
2 | [-372.01904, 131.61201, 74.20674, 44.60242, 30… | Hond |
3 | [-595.2519, 105.06696, 31.385975, 19.99825, -1… | Vogel |
4 | [-685.38214, 31.79422, -38.54689, -6.550993, -… | Hond |
Nu is de data klaar voor verdere analyse of een algoritme van bijvoorbeeld Scikit-learn.
4) Zelf een audio classification project starten
Wil je meer weten over de mogelijkheden van audio data? De beste manier om er mee aan de slag te gaan is een testproject. YouTube’er Krish Naik heeft een serie gemaakt over het bouwen van een audio classificatie model.
In deze YouTube serie worden audio bestanden met behulp van Librosa omgezet naar gelabelde data arrays. Met deze arrays en scikit learn wordt vervolgens een classificatie model gemaakt. Dit model kan vervolgens nieuwe geluidsopnames herkennen en labelen. Zo bouw je een eigen geluidsherkenningsmodel.
Klik hier voor de YouTube serie ‘EDA Audio Classification Project Using Deep Learning‘
5) Librosa: Beat tracker en andere functies
Librosa is een uitgebreide library met allerlei functies om geluidsdata te analyseren. Zo is er bijvoorbeeld een functie om het aantal beats per minute (BPM) te analyseren. Handig voor het analyseren van muziek.
Alle functies van Librosa kan je nalezen op:
Leave a Reply