Tổng Hợp

Phân loại thể loại âm nhạc với Python

Hướng dẫn phân tích tín hiệu Âm thanh / Âm nhạc bằng Python

Ảnh của Jean trên Unsplash

Âm nhạc giống như một tấm gương, và nó cho mọi người biết rất nhiều điều về bạn là ai và bạn quan tâm đến điều gì, cho dù bạn muốn hay không. Chúng tôi muốn nói “bạn là những gì bạn phát trực tiếp”: Spotify

Spotify , với giá trị ròng 26 tỷ đô la đang thống trị nền tảng phát trực tuyến âm nhạc ngày nay. Nó hiện có hàng triệu bài hát trong cơ sở dữ liệu và tuyên bố có điểm âm nhạc phù hợp cho tất cả mọi người. Dịch vụ Discover Weekly của Spotify đã trở thành một hit với thế hệ thiên niên kỷ. Không cần phải nói, Spotify đã đầu tư rất nhiều vào nghiên cứu để cải thiện cách người dùng tìm và nghe nhạc. Học máy là cốt lõi trong nghiên cứu của họ. Từ NLP đến Lọc cộng tác đến Học sâu, Spotify sử dụng tất cả chúng. Các bài hát được phân tích dựa trên chữ ký số của chúng cho một số yếu tố, bao gồm nhịp độ, âm thanh, năng lượng, khả năng khiêu vũ, v.v. để trả lời câu hỏi ngày đầu tiên không thể cũ đó: Bạn yêu thích thể loại nhạc nào?

Mục tiêu

Các công ty ngày nay sử dụng phân loại nhạc để có thể đưa ra các đề xuất cho khách hàng của họ (chẳng hạn như Spotify, Soundcloud) hoặc đơn giản là một sản phẩm (ví dụ như Shazam). Xác định thể loại âm nhạc là bước đầu tiên theo hướng đó. Kỹ thuật Máy học đã tỏ ra khá thành công trong việc trích xuất các xu hướng và mẫu từ nguồn dữ liệu lớn. Các nguyên tắc tương tự cũng được áp dụng trong Phân tích âm nhạc.

Trong bài viết này, chúng ta sẽ nghiên cứu cách phân tích tín hiệu âm thanh / âm nhạc bằng Python. Sau đó, chúng tôi sẽ sử dụng các kỹ năng đã học để phân loại các clip nhạc thành các thể loại khác nhau.

Xử lý âm thanh bằng Python

Âm thanh được biểu diễn dưới dạng tín hiệu âm thanh có các tham số như tần số, băng thông, decibel, v.v … Một tín hiệu âm thanh điển hình có thể được biểu thị dưới dạng hàm của Biên độ và Thời gian.

nguồn

Những âm thanh này có sẵn ở nhiều định dạng giúp máy tính có thể đọc và phân tích chúng. Một số ví dụ:

  • định dạng mp3
  • Định dạng WMA (Windows Media Audio)
  • định dạng wav (Tệp âm thanh dạng sóng)

Xem Thêm :   Xem phim lắng nghe hạnh phúc tập 1 vietsub + thuyết minh full hd

Xem thêm :  Xem bói nốt ruồi ở ngón tay cái đàn ông và phụ nữ là tốt hay xấu?

Python có một số thư viện tuyệt vời để xử lý âm thanh như Librosa và PyAudio, cũng có các mô-đun tích hợp cho một số chức năng âm thanh cơ bản.

Chúng tôi chủ yếu sẽ sử dụng hai thư viện để thu nhận và phát lại âm thanh:

1. Librosa

Nó là một mô-đun Python để phân tích tín hiệu âm thanh nói chung nhưng hướng nhiều hơn đến âm nhạc. Nó bao gồm các đai ốc và bu lông để xây dựng một hệ thống MIR (Truy xuất thông tin âm nhạc). Nó đã được ghi lại rất đầy đủ cùng với rất nhiều ví dụ và hướng dẫn.

Để có phần giới thiệu nâng cao hơn mô tả các nguyên tắc thiết kế bao bì, vui lòng tham khảo tài liệu librosa tại SciPy 2015 .

Cài đặt

pip install librosa
or
conda install -c conda-forge librosa

2. IPython.display.Audio

IPython.display.Audio cho phép bạn phát âm thanh trực tiếp trong sổ ghi chép jupyter.

Đang tải tệp âm thanh

import librosa
audio_path = '../T08-violin.wav'
x , sr = librosa.load(audio_path)
print(type(x), type(sr))
<class 'numpy.ndarray'> <class 'int'>
print(x.shape, sr)
(396688,) 22050
librosa.load(audio_path, sr=44100)
librosa.load(audio_path, sr=None)

Tốc độ lấy mẫu là số lượng mẫu âm thanh được truyền trong một giây, được đo bằng Hz hoặc kHz.

Phát âm thanh

Sử dụng IPython.display.Audiođể phát âm thanh

import IPython.display as ipd
ipd.Audio(audio_path)

ảnh chụp màn hình của tiện ích âm thanh Ipython

Tiện ích này sẽ không hoạt động ở đây, nhưng nó sẽ hoạt động trong sổ ghi chép của bạn. Tôi đã tải bản tương tự lên SoundCloud để chúng ta có thể nghe nó.

Bạn thậm chí có thể sử dụng định dạng mp3 hoặc WMA cho ví dụ âm thanh.

Hình ảnh hóa âm thanh

Dạng sóng

Chúng ta có thể vẽ mảng âm thanh bằng cách sử dụng librosa.display.waveplot:

%matplotlib inline
import matplotlib.pyplot as plt
import librosa.display
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)



Quang phổ

Một ảnh phổ là một đại diện trực quan của quang phổ của tần số của âm thanh hoặc tín hiệu khác khi họ thay đổi theo thời gian. Máy quang phổ đôi khi được gọi là máy ghi âm , bản ghi giọng nói hoặc máy ghi âm . Khi dữ liệu được thể hiện dưới dạng biểu đồ 3D, chúng có thể được gọi là thác nước . Trong mảng 2 chiều, trục đầu tiên là tần số trong khi trục thứ hai là thời gian.

Chúng tôi có thể hiển thị một quang phổ bằng cách sử dụng. librosa.display.specshow.

X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
plt.figure(figsize=(14, 5))
librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar()



librosa.display.specshow(Xdb, sr=sr, x_axis='time', y_axis='log')
plt.colorbar()



librosa.output.write_wav lưu một mảng NumPy vào một tệp WAV.

librosa.output.write_wav('example.wav', x, sr)

Bây giờ chúng ta hãy tạo tín hiệu âm thanh ở tần số 220Hz. Tín hiệu âm thanh là một mảng phức tạp, vì vậy chúng ta sẽ tạo một tín hiệu và chuyển nó vào chức năng âm thanh.

import numpy as np
sr = 22050 # sample rate
T = 5.0    # seconds
t = np.linspace(0, T, int(T*sr), endpoint=False) # time variable
x = 0.5*np.sin(2*np.pi*220*t)# pure sine wave at 220 Hz
Playing the audio
ipd.Audio(x, rate=sr) # load a NumPy array
Saving the audio
librosa.output.write_wav('tone_220.wav', x, sr)
    

Xem Thêm :   Những giá trị tích cực và hạn chế trong học thuyết nho giáo

Xem thêm :  Công Thức Cách Tính Mét Khối Gỗ Đơn Giản, Chính Xác, Hæ°Á»›Ng DẫN – Lingocard.vn


Khai thác tính năng

Mọi tín hiệu âm thanh bao gồm nhiều tính năng. Tuy nhiên, chúng ta phải trích xuất các đặc điểm có liên quan đến vấn đề mà chúng ta đang cố gắng giải quyết. Quá trình trích xuất các tính năng để sử dụng chúng để phân tích được gọi là trích xuất tính năng. Hãy để chúng tôi nghiên cứu về một số tính năng một cách chi tiết.

  • Tỷ lệ cắt ngang bằng không

Hãy để chúng tôi tính toán tỷ lệ vượt qua 0 cho đoạn âm thanh mẫu của chúng tôi.

# Load the signal
x, sr = librosa.load('../T08-violin.wav')
#Plot the signal:
plt.figure(figsize=(14, 5))
librosa.display.waveplot(x, sr=sr)



# Zooming in
n0 = 9000
n1 = 9100
plt.figure(figsize=(14, 5))
plt.plot(x[n0:n1])
plt.grid()

zero_crossings = librosa.zero_crossings(x[n0:n1], pad=False)
print(sum(zero_crossings))
6

Nó cho biết vị trí của “khối tâm” của một âm thanh và được tính là giá trị trung bình có trọng số của các tần số có trong âm thanh. Hãy xem xét hai bài hát, một bài thuộc thể loại blues và bài hát kia thuộc thể loại metal. Bây giờ so với bài hát thể loại blues có cùng chiều dài, bài hát metal có nhiều tần số hơn về cuối. Vì vậy, trung tâm quang phổ cho bài hát blues sẽ nằm ở đâu đó gần giữa phổ của nó trong khi trung tâm của một bài hát metal sẽ nằm ở cuối.

librosa.feature.spectral_centroid tính toán trung tâm quang phổ cho mỗi khung hình trong một tín hiệu:

spectral_centroids = librosa.feature.spectral_centroid(x, sr=sr)[0]
spectral_centroids.shape
(775,)
# Computing the time variable for visualization
frames = range(len(spectral_centroids))
t = librosa.frames_to_time(frames)
# Normalising the spectral centroid for visualisation
def normalize(x, axis=0):
    return sklearn.preprocessing.minmax_scale(x, axis=axis)
#Plotting the Spectral Centroid along the waveform
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_centroids), color='r')



  • Spectral Rolloff

librosa.feature.spectral_rolloff tính toán tần số cuộn cho mỗi khung trong một tín hiệu:

spectral_rolloff = librosa.feature.spectral_rolloff(x+0.01, sr=sr)[0]
librosa.display.waveplot(x, sr=sr, alpha=0.4)
plt.plot(t, normalize(spectral_rolloff), color='r')



Hệ số cepstral tần số Mel (MFCC) của một tín hiệu là một tập hợp nhỏ các đặc trưng (thường là khoảng 10–20) mô tả chính xác hình dạng tổng thể của một đường bao quang phổ. Nó mô hình hóa các đặc điểm của giọng nói con người.

Lần này, hãy làm việc với một wave loop đơn giản.

x, fs = librosa.load('../simple_loop.wav')
librosa.display.waveplot(x, sr=sr)
mfccs = librosa.feature.mfcc(x, sr=fs)
print mfccs.shape
(20, 97)
#Displaying  the MFCCs:
librosa.display.specshow(mfccs, sr=sr, x_axis='time')



Chúng tôi cũng có thể thực hiện chia tỷ lệ đối tượng sao cho mỗi thứ nguyên hệ số có phương sai đơn vị và giá trị trung bình bằng 0:

import sklearn
mfccs = sklearn.preprocessing.scale(mfccs, axis=1)
print(mfccs.mean(axis=1))
print(mfccs.var(axis=1))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')



Các tính năng của Chroma là một đại diện thú vị và mạnh mẽ cho âm thanh âm nhạc trong đó toàn bộ phổ được chiếu vào 12 thùng đại diện cho 12 nửa cung (hoặc sắc độ) riêng biệt của quãng tám âm nhạc.

librosa.feature.chroma_stft được sử dụng để tính toán

# Loadign the file
x, sr = librosa.load('../simple_piano.wav')
hop_length = 512
chromagram = librosa.feature.chroma_stft(x, sr=sr, hop_length=hop_length)
plt.figure(figsize=(15, 5))
librosa.display.specshow(chromagram, x_axis='time', y_axis='chroma', hop_length=hop_length, cmap='coolwarm')



Sau khi có cái nhìn tổng quan về tín hiệu âm thanh, các tính năng của chúng và quy trình trích xuất tính năng của chúng, đã đến lúc sử dụng kỹ năng mới được phát triển của chúng tôi để giải quyết vấn đề Máy học.

Xem Thêm :   Xem kỹ chiếc oto cũ taxi hoàn lương giá rẻ chỉ 195tr giấy tờ đầy đủ bao chạy ngon tiện nghi vừa đủ

Xem thêm :  Cấu trúc câu cảm thán với what và how

Mục tiêu

Trong phần của anh ấy, chúng tôi sẽ cố gắng lập mô hình phân loại để phân loại các bài hát thành các thể loại khác nhau. Chúng ta hãy giả sử một tình huống trong đó, vì một lý do nào đó, chúng ta tìm thấy một loạt các tệp MP3 được đặt tên ngẫu nhiên trên đĩa cứng của chúng ta, chúng được cho là chứa nhạc. Nhiệm vụ của chúng ta là sắp xếp chúng theo thể loại nhạc vào các thư mục khác nhau như jazz, cổ điển, đồng quê, pop, rock và metal.

Dataset

Chúng tôi sẽ sử dụng tập dữ liệu GITZAN nổi tiếng cho nghiên cứu điển hình của chúng tôi. Tập dữ liệu này đã được sử dụng cho bài báo nổi tiếng về phân loại thể loại “Phân loại thể loại nhạc của tín hiệu âm thanh ” của G. Tzanetakis và P. Cook trong IEEE Trans Transaction on Audio and Speech Processing 2002.

Tập dữ liệu bao gồm 1000 đoạn âm thanh mỗi đoạn dài 30 giây. Nó bao gồm 10 thể loại cụ thể là, blues, cổ điển, đồng quê, disco, hiphop, jazz, reggae, rock, metal và pop. Mỗi thể loại bao gồm 100 đoạn âm thanh.

Xử lý trước dữ liệu

Trước khi đào tạo mô hình phân loại, chúng ta phải chuyển đổi dữ liệu thô từ các mẫu âm thanh thành các biểu diễn có ý nghĩa hơn. Các đoạn âm thanh cần được chuyển đổi từ định dạng .au sang định dạng .wav để làm cho nó tương thích với mô-đun wave của python để đọc các tệp âm thanh. Tôi đã sử dụng mô-đun SoX mã nguồn mở để chuyển đổi. Đây là một bảng gian lận tiện dụng để chuyển đổi SoX.

sox input.au output.wav
  • Khai thác tính năng
  • Phân loại

Dù bằng cách nào, rất nhiều thử nghiệm có thể được thực hiện về mô hình. Bạn có thể tự do thử nghiệm và cải thiện kết quả của mình. Sử dụng mô hình CNN (trên hình ảnh quang phổ) mang lại độ chính xác cao hơn và đáng để thử.

Bước tiếp theo

Phân loại Thể loại Âm nhạc là một trong nhiều nhánh của Truy xuất Thông tin Âm nhạc . Từ đây, bạn có thể thực hiện các tác vụ khác trên dữ liệu âm nhạc như theo dõi nhịp, tạo nhạc, hệ thống giới thiệu, tách bản nhạc và nhận dạng nhạc cụ, v.v. Phân tích âm nhạc là một lĩnh vực đa dạng và cũng là một lĩnh vực thú vị. Một phiên âm nhạc bằng cách nào đó thể hiện một khoảnh khắc cho người dùng. Tìm kiếm những khoảnh khắc này và mô tả chúng là một thách thức thú vị trong lĩnh vực Khoa học dữ liệu.

Xem thêm bài viết thuộc chuyên mục: Kiến Thức Chung

Related Articles

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Back to top button