Sesin Öznitelik Çıkarımı — Librosa

A.Oğuzhan Durmaz
Data Runner
Published in
4 min readAug 29, 2019
Arctic Monkeys — Do I Wanna Know?

Bu yazımızda ses sınıflandırma, ses tanıma vb. yolunda temel oluşturabilecek bir Python kütüphanesine değineceğiz. Bu yazıyla birlikte sesi modellerimizde kullanabilecek hale getirmek için öznitelik çıkarımı yapacağız ve bu çıkarımların ne olduğunu inceleyeceğiz.

Librosa Nedir?

Librosa müzik ve ses analizi için kullanılan bir Python paketidir.

Librosa Kütüphanesinin Yüklenmesi

!pip install librosa

Ses Dosyasının Yüklenmesi

import librosa
ses = "ses_dosyası.wav"
x,sr = librosa.load(ses)
print("x type:",type(x),"sr type",type(sr))
x type: <class 'numpy.ndarray'> sr type: <class 'int'>
print(x.shape,sr)
(110250,) 22050

x → ses zaman serisi

sr →ses frekansı(Hz)

Aynı zamanda sesi yüklerken ses frekansını değiştirerek yükleyebilirsiniz.

x,sr = librosa.load(ses,sr=11025)print(x.shape,sr)
(110250,) 22050

librosa.load

Sesin Oynatılması

Sesi oynatmak için IPython kütüphanesinden yararlanıyoruz.

import IPython.display as ipd
ipd.Audio(ses)
ipd.Audio(x,rate=sr) #Bu şekilde de oynatılabiliyor.

Kodu çalıştırdıktan sonra bu şekilde bir arayüz geliyor ve sesimizi dinleyebiliyoruz.

IPython.display.Audio

Sesi Kaydetme

Librosa sesi okumamızı sağladığı gibi sesi kaydetmemize de olanak sağlıyor.

x, sr = librosa.load(librosa.util.example_audio_file())librosa.output.write_wav('ses_kayit.wav', x, sr)

librosa.output.write_wav

Sesi Görüntüleme

import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(10,2))
librosa.display.waveplot(x,sr=sr)

Spektrogram

Spektrogram, belirli bir dalga formunda bulunan çeşitli frekanslarda bir sinyalin sinyal gücünü veya yüksekliğini temsil eden görseldir. Aynı zamanda enerji seviyelerini zaman içinde nasıl değiştiğini de gösterir.

Short Time Fourier Transform: Ses sinyali işlemek için güçlü bir araçtır. Sinyaller için zamana ve frekansa göre karmaşık genliği belirten zaman frekansı dağılımını tanımlar.

Spektogram için Eğlenceli Bir Site

X=librosa.stft(x) #stft -> Short-time Fourier transform
Xdb=librosa.amplitude_to_db(abs(X)) #Genlikten Desibel değerine
plt.figure(figsize=(20,8))
librosa.display.specshow(Xdb,sr=sr,x_axis="time",y_axis="hz")
plt.colorbar()

librosa.display.specshow()

Feature Extraction — Öznitelik Çıkarımı

Mel-Frekans Kepstral Katsayıları (Mel-Frequency Cepstral Coefficients)

Mel frekans ölçeği, insan kulağının ses frekanslarındaki değişimi algılayışını gösteren bir ölçektir. MFCC(Mel-Frequency Cepstral Coefficients), ses sinyalinin kısa zamanlı güç spektrumunun Mel ölçeği üzerindeki ifadesidir.

Frekanstan Mel ölçeğine dönüşüm formülü;

M ═ 1125 × ln(1+(f÷700))

M → Mel ölçeği

f → Frekans(Hz)

mfkk=librosa.feature.mfcc(x,sr=sr)
print(mfkk.shape)
(20, 216)
plt.figure(figsize=(15,6))
librosa.display.specshow(mfkk,x_axis="s")
plt.colorbar()

librosa.feature.mfcc

Zero Crossing Rate

Zero crossing rate bir sinyalin sıfır çizgisinden geçişi yani işaret değişiminin oranıdır.

zero_crossing=librosa.zero_crossings(x)
print(sum(zero_crossing)) #Toplam sıfır geçişi sayısı
1908
plt.plot(x[5000:5100])
plt.grid()

Spectral Centroid

Spektrumun kütle merkezinin nerede olduğunu gösterir.

spec_cent=librosa.feature.spectral_centroid(x)
print(spec_cent.shape)
(1, 216)
plt.semilogy(spec_cent.T)
plt.ylabel("Hz")

Spectral Rolloff

Sinyal şeklinin ölçüsü. Toplam spektral enerjisinin belli bir yüzdesini temsil eder.

spec_roll=librosa.feature.spectral_rolloff(x,sr=sr)
print(spec_roll.shape)
(1, 216)
plt.semilogy(spec_roll.T,"r")
plt.ylabel("Hz")

librosa.feature.spectral_rolloff

Chroma Frekansı

Spektrum müzikal oktavının 12 farklı yarı tonunu(chroma) temsil eden 12 parçanın belirtildiği ses için güçlü bir sunumudur.

chroma=librosa.feature.chroma_stft(x,sr=sr)
print(chroma.shape)
(12, 216)
librosa.display.specshow(chroma,y_axis="chroma",x_axis="time")
plt.colorbar()

Spektral Bant Genişliği

Ses sinyalinin dalga genişliğinin maksimum tepe noktasının yarısını tanımlar.

spec_band=librosa.feature.spectral_bandwidth(x,sr=sr)print(spec_band,spec_band.shape)
[[3485.33953975 1440.92475081 1564.93918585 ... 4094.54535891
4112.77024258 4179.68287521]]
(1, 2647)

librosa.feature.spectral_bandwidth

Böylece bu yazımızda da modellerimizde kullanmak için sesin öznitelik çıkarımı yaptık. Kodun tamamına buradan ulaşabilirsiniz.

Bir sonraki yazıda görüşmek üzere. Başarılar.

Kaynakça:

1- What is a Spectrogram?

2- THE SHORT-TIME FOURIER TRANSFORM

3- Zero crossing rate and Energy of the Speech Signal of Devanagari Script— D.S.Shete, Prof. S.B. Patil, Prof. S.B. Patil

4- MEL-FREKANS KEPSTRAL KATSAYILARI VE DİNAMİK ZAMAN BÜKMESİ YÖNTEMİ KULLANILARAK KONUŞMA-DIŞI SESLERİN TANINMASI

5- Chroma Feature Analysis and Synthesis

6- Music Genre Classification with Python by Parul Pandey

--

--