pytorch_utils.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import torch
  2. import torch.nn as nn
  3. from torch.utils.data import Dataset
  4. from utils.file_utils import list_files_in_directory
  5. import numpy as np
  6. import wave
  7. import logging
  8. from pydub import AudioSegment
  9. import matplotlib.pyplot as plt
  10. import pandas as pd
  11. import librosa.display
  12. class WakeWordDataset(Dataset):
  13. def __init__(self, features, labels):
  14. self.features = features
  15. self.labels = labels
  16. def __len__(self):
  17. return len(self.features)
  18. def __getitem__(self, idx):
  19. return self.features[idx], self.labels[idx]
  20. class CNNNetwork(nn.Module):
  21. def __init__(self):
  22. super(CNNNetwork, self).__init__()
  23. self.network = nn.Sequential(
  24. nn.Conv1d(in_channels=1, out_channels=32, kernel_size=5, stride=1, padding=2),
  25. nn.ReLU(),
  26. nn.MaxPool1d(kernel_size=2, stride=2),
  27. nn.Conv1d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2),
  28. nn.ReLU(),
  29. nn.MaxPool1d(kernel_size=2, stride=2),
  30. nn.Flatten(),
  31. nn.Linear(64 * 10, 128),
  32. nn.ReLU(),
  33. nn.Dropout(0.5),
  34. nn.Linear(128, 1)
  35. )
  36. def forward(self, x):
  37. return self.network(x)
  38. def preprocess_training_data(training_directories, background_directory, model_path, update_progress_callback):
  39. import librosa
  40. import pandas as pd
  41. data_path_dict = {}
  42. data_path_dict[0] = list_files_in_directory(background_directory, extension=['.wav','mp3','.m4a'],deep=5)
  43. for idx, directory in enumerate(training_directories):
  44. data_path_dict[idx+1] = list_files_in_directory(directory, extension=['.wav','mp3','.m4a'],deep=5)
  45. all_data = []
  46. total_files = sum(len(files) for files in data_path_dict.values())
  47. processed_files = 0
  48. for class_label, list_of_files in data_path_dict.items():
  49. for single_file in list_of_files:
  50. try:
  51. audio, sample_rate = librosa.load(single_file)
  52. mfcc = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40)
  53. mfcc_processed = np.mean(mfcc.T, axis=0)
  54. all_data.append([mfcc_processed, class_label])
  55. processed_files += 1
  56. update_progress_callback((processed_files / total_files) * 100)
  57. except Exception as e:
  58. print(f"Exception: {str(e)}")
  59. df = pd.DataFrame(all_data, columns=["feature", "class_label"])
  60. df.to_pickle(model_path + "audio_data.csv")
  61. def train_model(model, train_loader, optimizer, criterion, epoch, total_epochs, device):
  62. model.train()
  63. running_loss = 0.0
  64. correct = 0
  65. total = 0
  66. for batch_X, batch_y in train_loader:
  67. batch_X, batch_y = batch_X.to(device), batch_y.to(device)
  68. optimizer.zero_grad()
  69. outputs = model(batch_X.float())
  70. loss = criterion(outputs, batch_y.unsqueeze(1).float())
  71. loss.backward()
  72. optimizer.step()
  73. global current_loss, current_accuracy, total_batches
  74. current_loss = loss.item()
  75. current_accuracy = (outputs.argmax(dim=1) == batch_y).float().mean().item()
  76. running_loss += loss.item()
  77. _, predicted = torch.max(outputs.data, 1)
  78. total += batch_y.size(0)
  79. correct += (predicted == batch_y).sum().item()
  80. epoch_loss = running_loss / len(train_loader)
  81. epoch_acc = 100 * correct / total
  82. print(f'Epoch [{epoch + 1}/{total_epochs}], Loss: {epoch_loss:.4f}, Accuracy: {epoch_acc:.2f}%')
  83. def optimize_graph(model, device, optimizer, criterion, dataloader):
  84. pass