이 글에서는 텐서플로우를 사용하여 음악 스타일을 예측하는 방법을 보여줍니다.
제 예에서는 테크노와 클래식 음악을 비교합니다.
내 Github에서 코드를 찾을 수 있습니다.
https://github.com/victordalet/sound_to_partition
첫 번째 단계에서는 하나의 데이터 세트를 생성하고 내부에 음악 스타일에 대한 하나의 폴더를 추가해야 합니다. 예를 들어 내 wav 음악을 넣을 하나의 테크노 폴더와 클래식 폴더를 추가합니다.
완료할 인수 max_epochs를 사용하여 열차 파일을 생성합니다.
데이터 세트 폴더의 디렉터리에 해당하는 생성자의 클래스를 수정합니다.
로딩 및 처리 방법에서는 다른 디렉토리에서 wav 파일을 검색하여 스펙토그램을 얻습니다.
교육 목적으로 Keras 컨볼루션과 모델을 사용합니다.
import os import sys from typing import List import librosa import numpy as np from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from sklearn.model_selection import train_test_split from tensorflow.keras.utils import to_categorical from tensorflow.image import resize class Train: def __init__(self): self.X_train = None self.X_test = None self.y_train = None self.y_test = None self.data_dir: str = 'dataset' self.classes: List[str] = ['techno','classic'] self.max_epochs: int = int(sys.argv[1]) @staticmethod def load_and_preprocess_data(data_dir, classes, target_shape=(128, 128)): data = [] labels = [] for i, class_name in enumerate(classes): class_dir = os.path.join(data_dir, class_name) for filename in os.listdir(class_dir): if filename.endswith('.wav'): file_path = os.path.join(class_dir, filename) audio_data, sample_rate = librosa.load(file_path, sr=None) mel_spectrogram = librosa.feature.melspectrogram(y=audio_data, sr=sample_rate) mel_spectrogram = resize(np.expand_dims(mel_spectrogram, axis=-1), target_shape) data.append(mel_spectrogram) labels.append(i) return np.array(data), np.array(labels) def create_model(self): data, labels = self.load_and_preprocess_data(self.data_dir, self.classes) labels = to_categorical(labels, num_classes=len(self.classes)) # Convert labels to one-hot encoding self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(data, labels, test_size=0.2, random_state=42) input_shape = self.X_train[0].shape input_layer = Input(shape=input_shape) x = Conv2D(32, (3, 3), activation='relu')(input_layer) x = MaxPooling2D((2, 2))(x) x = Conv2D(64, (3, 3), activation='relu')(x) x = MaxPooling2D((2, 2))(x) x = Flatten()(x) x = Dense(64, activation='relu')(x) output_layer = Dense(len(self.classes), activation='softmax')(x) self.model = Model(input_layer, output_layer) self.model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy']) def train_model(self): self.model.fit(self.X_train, self.y_train, epochs=self.max_epochs, batch_size=32, validation_data=(self.X_test, self.y_test)) test_accuracy = self.model.evaluate(self.X_test, self.y_test, verbose=0) print(test_accuracy[1]) def save_model(self): self.model.save('weight.h5') if __name__ == '__main__': train = Train() train.create_model() train.train_model() train.save_model()
모델을 테스트하고 사용하기 위해 가중치를 검색하고 음악 스타일을 예측하는 이 클래스를 만들었습니다.
생성자에 올바른 클래스를 추가하는 것을 잊지 마세요.
from typing import List import librosa import numpy as np from tensorflow.keras.models import load_model from tensorflow.image import resize import tensorflow as tf class Test: def __init__(self, audio_file_path: str): self.model = load_model('weight.h5') self.target_shape = (128, 128) self.classes: List[str] = ['techno','classic'] self.audio_file_path: str = audio_file_path def test_audio(self, file_path, model): audio_data, sample_rate = librosa.load(file_path, sr=None) mel_spectrogram = librosa.feature.melspectrogram(y=audio_data, sr=sample_rate) mel_spectrogram = resize(np.expand_dims(mel_spectrogram, axis=-1), self.target_shape) mel_spectrogram = tf.reshape(mel_spectrogram, (1,) self.target_shape (1,)) predictions = model.predict(mel_spectrogram) class_probabilities = predictions[0] predicted_class_index = np.argmax(class_probabilities) return class_probabilities, predicted_class_index def test(self): class_probabilities, predicted_class_index = self.test_audio(self.audio_file_path, self.model) for i, class_label in enumerate(self.classes): probability = class_probabilities[i] print(f'Class: {class_label}, Probability: {probability:.4f}') predicted_class = self.classes[predicted_class_index] accuracy = class_probabilities[predicted_class_index] print(f'The audio is classified as: {predicted_class}') print(f'Accuracy: {accuracy:.4f}')
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3