Skip to main content
NewsProgramming LanguagePython

มาทำความรู้จักกับ Librosa

เขียนโดย
Sirasit Boonklang – BorntoDev Co., Ltd.

 

🔥 librosa คืออะไร ?! 

Librosa เป็นแพ็คเกจ python ใช้สำหรับการวิเคราะห์เพลงและเสียง สามารถสร้างระบบดึงข้อมูลเพลงได้

💻 คำแนะนำในการติดตั้ง ?!

สามารถติดตั้งไลบรารี librosa ผ่านการใช้ Python Package Index (PyPI) ด้วยคำสั่งต่อไปนี้
pip install librosa หรือ sudo pip install librosa

🎼 แล้ว librosa ทำอะไรได้บ้างล่ะ ?!

  • โหลดอินพุตเสียง
  • คำนวณ Mel Spectrogram
  • คำนวณ Chroma
  • Beat tracking

สามารถดูตัวอย่างโค้ดจากผู้พัฒนา librosa ได้ที่ librosa/examples at main · librosa/librosa · GitHub

1. การโหลดอินพุตเสียง

นำเข้าไลบรารีที่เกี่ยวข้อง 

#numpyสำหรับการดำเนินการทางคณิตศาสตร์
#matplotlib สำหรับแสดงผล
#IPython.display สำหรับเอาต์พุตเสียง
#Librosa สำหรับเสียง
#โมดูลการแสดงผลสำหรับการแสดงภาพ

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import IPython.display
import librosa
import librosa.display

นำไฟล์เสียงที่ต้องการใช้งานอัปโหลดเข้ามาใน Google Colab การไปที่โฟลเดอร์ด้านซ้ายมือแล้วกดปุ่มอัพโหลด

จะเห็นได้ว่ามีไฟล์เสียง ที่เราได้ทำการอัพโหลดขึ้นมาเรียบร้อยแล้ว

เราจะใช้คำสั่ง librosa.load(‘ชื่อไฟล์เสียง’) ซึ่งจะได้ออกมา 2 ค่าคือ y1 และ sr1 

y1 คือ ค่าความถี่เทียบกับเวลา 

sr1 คือค่า sampling rate 

sampling rate คือ อัตราการสุ่มตัวอย่างเสียงแอนาลอก เพื่อที่จะแปลงให้เป็นดิจิตอล

ตัวอย่าง y1, sr1 = librosa.load(‘borntodev.m4a’)

ทำการใช้คำสั่ง matlplotlib เพื่อแสดง waveform ของเสียงที่ใช้

plt.plot(y1);

plt.title('Signal');

plt.xlabel('Time (samples)');

plt.ylabel('Amplitude');

และเรายังสามารถนำตัวอย่างเสียงที่มีมากับไลบรารีมาใช้ในการวิเคราะห์เสียงได้ด้วยโดยใช้คำสั่ง librosa.util.example_audio_file() และแสดง Waveform ดังตัวอย่าง

audio_path = librosa.util.example_audio_file()

y, sr = librosa.load(audio_path)

plt.plot(y2);

plt.title('Signal');

plt.xlabel('Time (samples)');

plt.ylabel('Amplitude');

 

sampling rate ตามค่าเริ่มต้น librosa จะสุ่มสัญญาณใหม่เป็น 22050Hz

เราสามารถ แก้ไขค่า sampling rate ได้โดยการเพิ่มพารามิเตอร์ sr แล้วกำหนดค่าลงไปเช่น y, sr = librosa.load(audio_path, sr=44100) ค่า sr ก็จะเท่ากับ 44.1KHz

 

2. ใช้คำนวณ Mel spectrogram

เพื่อน ๆ สงสัยกันใช่มั้ยครับว่า Mel spectrogram  คืออะไร เพื่อไม่ให้งง ก่อนอื่นเรามาทำความเข้าใจกับสัญญาณกันก่อนดีกว่าครับผม 

สัญญาณ (Signal) เป็นการแปรผันของปริมาณหนึ่ง ๆ เมื่อเวลาผ่านไป

สัญญาณมีหลายแบบในที่นี้เราจะพูดถึง Continuous-time signal และ Discrete-time signal

Continuous-time signal คือ “ฟังก์ชันของตัวแปรเวลาต่อเนื่องที่มีชุดตัวเลขที่นับไม่ได้

ตัวอย่างสัญญาณเวลาต่อเนื่อง ได้แก่ คลื่นไซน์ คลื่นโคไซน์ คลื่นสามเหลี่ยม และอื่นๆ สัญญาณไฟฟ้ายังทำหน้าที่เป็นสัญญาณเวลาต่อเนื่องด้วย เมื่อสิ่งเหล่านี้ได้รับตามสัดส่วนกับพารามิเตอร์ทางกายภาพ เช่น ความดัน อุณหภูมิ เสียง และอื่นๆ

ในที่นี้เสียงต้นฉบับของเราเป็นสัญญาณแอนนาล็อกที่อยู่ในรูป Continuous-time signal

 

 

(ภาพจาก: Definition of Continuous And Discrete Signals | Chegg.com)

 

Discrete-time signal คือ สัญญาณตัวแปรที่มีชุดตัวเลขที่นับได้หรือจำกัดในลำดับของมัน” เป็นการแสดงสัญญาณเวลาต่อเนื่องแบบดิจิตอล

(ภาพจาก: Definition of Continuous And Discrete Signals | Chegg.com)

 

จากสัญญาณเสียงดนตรีที่เราได้ใช้ librosa โหลดมาแล้วแสดงเป็นกราฟของสัญญาณ

จะเห็นได้ว่าสัญญาณของเรามันอยู่ในโดเมนเวลา ซึ่งภาพในกราฟนี้เป็นการรวมกันของความถี่หลาย ๆ ความถี่ (เสียงจากเครื่องดนตรีต่าง ๆ รวมกันอยู่) แล้วต้องการแยกความถี่ของเสียงเครื่องดนตรีนั้น ๆ จะทำยังไงล่ะ สิ่งที่จะทำได้คือการแปลงสัญญาณจากโดเมนให้อยู่ในรูปของโดเมนความถี่โดยใช้ Fourier Transform 

 

แล้วเจ้า Fourier Transform คืออะไรอีกล่ะ !?

Fourier Transform (FT) เป็นสูตรทางคณิตศาสตร์ที่ช่วยให้เราสามารถแยกสัญญาณออกเป็นความถี่เดี่ยวและแอมพลิจูดของความถี่ได้ กล่าวคือจะแปลงสัญญาณจากโดเมนเวลาเป็นโดเมนความถี่ ผลลัพธ์เรียกว่าสเปกตรัม 

(ภาพจาก Fourier transform – AAVOS International)

 

และยังมีอัลกอริทึมที่สามารถคำนวณการแปลงฟูริเยร์อย่างมีประสิทธิภาพ มีการใช้กันอย่างแพร่หลายในการประมวลผลสัญญาณ เรียกว่า Fast Fourier transform (FFT) 

ซึ่งหากเราใช้ librosa เราก็จะไม่ต้องมาคำนวณแก้สมการเองเอง สามารถเรียกใช้งานได้เลย 

n_fft = 2048

ft = np.abs(librosa.stft(y2[:n_fft], hop_length = n_fft+1))

plt.plot(ft);

plt.title('Spectrum');

plt.xlabel('Frequency Bin');

plt.ylabel('Amplitude');

ใช้ fast Fourier transform (FFT) แปลงเป็น spectrum แล้วยังไงต่อล่ะ

สเปกโตรแกรมเป็นกลุ่มของ FFT ที่ซ้อนกัน เป็นการแสดงความดังของสัญญาณหรือแอมพลิจูดของสัญญาณด้วยภาพ จะแตกต่างกันไปตามความถี่ที่ต่างกัน ตามเวลา เมื่อคำนวณสเปกโตรแกรม แกน y จะถูกแปลงเป็น log scale และ color dimension จะถูกแปลงเป็นเดซิเบล เนื่องจากมนุษย์สามารถรับรู้ช่วงความถี่และแอมพลิจูดที่มีขนาดเล็กและเข้มข้นเท่านั้น

 

แต่เอ๊ะ สงสัยมั้ยว่าเราจะดึงข้อมูลเสียงนี้มาทำให้ยุ่งเหยิงวุ่นวายทำไม เราได้ประโยชน์จากสิ่งนี้อย่างไร 🤔 มาหาคำตอบได้เลย

 

สเปกตรัมถูกนำมาใช้อย่างกว้างขวางในด้านดนตรี ภาษาศาสตร์ โซนาร์ เรดาร์ การประมวลผลเสียงพูด แผ่นดินไหววิทยา และอื่นๆ สเปกตรัมของเสียงสามารถใช้เพื่อระบุคำพูดตามสัทศาสตร์ และเพื่อวิเคราะห์เสียงเรียกต่างๆ ของสัตว์ได้ มาถึงตรงนี้เพื่อน ๆ น่าจะพอเข้าใจกันพอสมควรแล้วกับ “Spectrogram ” แต่เอ๊ะ แล้ว “Mel” ล่ะ คืออะไรกัน

(ภาพจาก: https://www.sfu.ca/sonic-studio-webdav/handbook/Mel.html)

มนุษย์ไม่รับรู้ความถี่ในระดับเชิงเส้น เราสามารถบอกความแตกต่างของความถี่ที่ต่ำได้ดีกว่าความถี่ที่สูง ตัวอย่างเช่น เราสามารถบอกความแตกต่างระหว่าง 500 และ 1000 Hz ได้อย่างง่ายดาย แต่เราแทบจะไม่สามารถบอกความแตกต่างระหว่าง 10,000 ถึง 10,500 Hz ได้ แม้ว่าระยะห่างระหว่างสองคู่จะเท่ากัน

 

ในปี ค.ศ. 1937 Stevens, Volkmann และ Newmann ได้เสนอหน่วยของระดับเสียงที่ระยะห่างเท่ากันในระดับเสียงฟัง นี่เรียกว่ามาตราส่วนเมล หรือ Mel scale เราสามารถทำการคำนวณทางคณิตศาสตร์เกี่ยวกับความถี่เพื่อแปลงให้เป็น Mel scale ได้

 

ก็จะสรุปได้ว่า Mel Spectrogram ก็คือสเปกโตรแกรมที่ความถี่ถูกแปลงเป็นสเกลเมลนั้นเอง

และเราสามารถใช้ librosa แสดงแผนภาพ heat map ของ  Mel Spectrogram ได้ดังนี้

S = librosa.feature.melspectrogram(y2, sr=sr2, n_mels=128)

log_S = librosa.power_to_db(S, ref=np.max)

plt.figure(figsize=(12,4))

librosa.display.specshow(log_S, sr=sr2, x_axis='time', y_axis='mel')

plt.title('mel power spectrogram')

plt.colorbar(format='%+02.0f dB')

plt.tight_layout()

 

3. ใช้คำนวณ Chromagram 

ในดนตรีตะวันตก chromagram มีความเกี่ยวข้องกับ pitch class 12 class ที่แตกต่างกัน คุณลักษณะที่อิงตาม Chroma ซึ่งเรียกอีกอย่างว่า “pitch class profiles”   Pitch = ความถี่ของคลื่นเสียง   Chromagram เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการวิเคราะห์เพลงซึ่งสามารถจัดหมวดหมู่ระดับเสียงที่มีความหมายได้ (มักเป็นสิบสองประเภท) และการปรับจูนนั้นใกล้เคียงกับระดับอารมณ์ที่เท่ากัน คุณสมบัติหลักประการหนึ่งของคุณสมบัติของโครมาคือคุณสมบัติเหล่านี้จับลักษณะฮาร์โมนิกและไพเราะของดนตรี ในขณะที่ยังคงแข็งแกร่งต่อการเปลี่ยนแปลงของเสียงต่ำและเครื่องมือวัด ซึ่งเราสามารถใช้ librosa แยกและแสดง Chromagram ของเสียงได้ดังนี้

C = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr, bins_per_octave=36)

plt.figure(figsize=(12,4))

librosa.display.specshow(C, sr=sr, x_axis='time', y_axis='chroma', vmin=0, vmax=1)

plt.title('Chromagram')

plt.colorbar()

plt.tight_layout()

4. Beat tracking

เราสามารถทำตัวติดตามจังหวะ ซึ่งจะส่งกลับค่าประมาณของจังหวะ (เป็นครั้งต่อนาที) และดัชนีเฟรมของเหตุการณ์จังหวะ อินพุตสามารถเป็นอนุกรมเวลาของเสียง (ดังที่เราทำด้านบน) สามารถคำนวณโดย librosa.onset.onset_strength()

plt.figure(figsize=(12, 6))

tempo, beats = librosa.beat.beat_track(y=y_percussive, sr=sr)

plt.figure(figsize=(12,4))

librosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel')

plt.vlines(librosa.frames_to_time(beats),

           1, 0.5 * sr,

           colors='w', linestyles='-', linewidth=2, alpha=0.5)

 

plt.axis('tight')

plt.colorbar(format='%+02.0f dB')

plt.tight_layout();

 

 

ตัวอย่าง การนำ Beat tracking ไปใช้ในเกม https://www.freecodecamp.org/news/use-python-to-detect-music-onsets/

 

นอกจากนั้นเรายังสามารถใช้ librosa ร่วมกับ Deep Learning ในการทำ Speech Recognition

เพื่อให้เราพูดกับคอมพิวเตอร์ได้อีกด้วยครับผม 😊 GitHub – jayeshsaita/Speech-Commands-Recognition: Speech Commands Recognition in PyTorch

**หากคุณสนใจพัฒนา สตาร์ทอัพ แอปพลิเคชัน

และ เทคโนโลยีของตัวเอง ?**

อย่ารอช้า ! เรียนรู้ทักษะด้านดิจิทัลเพื่ออัพเกรดความสามารถของคุณ
เริ่มตั้งแต่พื้นฐาน พร้อมปฏิบัติจริงในรูปแบบหลักสูตรออนไลน์วันนี้

Sirasit Boonklang

Author Sirasit Boonklang

More posts by Sirasit Boonklang

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า