Este documento descreve a organização interna de backend/src, responsável por toda a cadeia de pré-processamento de áudio e inferência de modelos de vibração háptica.
Stems separados (WAV)
│
▼
audio_processing.py ← carrega, reamostra, janela, gera Mel spectrograms
│
▼
[Num_Windows, 4, N_MELS, Time_Steps]
│
▼
models/ ← redes neurais recebem o tensor acima
│
▼
[Batch_Size, 4] ← intensidades hápticas por zona
O pipeline assume que a separação de stems já foi realizada por outra etapa (ex.: Demucs). Cada módulo deste pacote tem responsabilidade única e não acessa a API web diretamente.
Centraliza todos os hiperparâmetros de pré-processamento. Nenhuma constante de áudio ou modelo deve ser definida fora deste arquivo.
Parâmetros principais:
| Constante | Valor padrão | Descrição |
|---|---|---|
SAMPLE_RATE |
22050 | Taxa de reamostragem alvo (Hz) |
N_MELS |
64 | Bins do Mel spectrogram |
WINDOW_SECONDS |
1.0 | Duração de cada janela de contexto (s) |
WINDOW_HOP_SECONDS |
0.1 | Passo entre janelas consecutivas (s) |
N_FFT |
1024 | Tamanho da FFT |
HOP_LENGTH |
441 | Hop do Mel spectrogram (samples) |
STEM_ORDER |
[drums, bass, vocals, other] |
Ordem fixa dos canais |
DEVICE |
cuda |
Dispositivo preferido (fallback: CPU) |
SPECTROGRAM_TIME_STEPS |
WINDOW_SIZE_SAMPLES // HOP_LENGTH |
Passos temporais por janela |
Pré-processamento de stems separados. Entrada: dicionário {stem_name: path}. Saída: tensor [Num_Windows, 4, N_MELS, Time_Steps].
Funções públicas:
| Função | Descrição |
|---|---|
process_stems(stem_paths) |
Ponto de entrada principal; encadeia todas as etapas abaixo |
load_stem(path) |
Carrega um stem, converte para mono e reamostra |
load_stems(stem_paths) |
Carrega os 4 stems em paralelo e empilha em tensor padded |
align_stem_lengths(stems) |
Apareia todos os stems ao mais curto (evita silêncio artificial) |
split_stems_into_windows(stems) |
Divide o tensor alinhado em janelas sobrepostas |
create_mel_spectrogram_windows(windows) |
Gera Mel spectrograms com nnAudio (log1p) |
normalize_spectrograms(spectrograms) |
Z-score por janela e canal de stem |
Exceção personalizada: AudioProcessingError (subclasse de ValueError).
Carrega o dataset para treino a partir de um manifest.csv. Implementa torch.utils.data.Dataset com crop aleatório (data augmentation) e normalização z-score baseada em estatísticas pré-calculadas.
Classes e funções:
| Nome | Tipo | Descrição |
|---|---|---|
StemDataset |
Dataset |
Carrega chunks de 1 s de 4 stems + ground truth de vibração |
compute_mel_stats() |
função | Calcula média/std das Mels no split de treino (Welford online) |
build_dataloaders() |
função | Cria DataLoaders para train/val/test |
Formato de saída de StemDataset.__getitem__:
{
"mel": Tensor[4, N_MELS, N_TIME_FRAMES], # log-Mel spectrograms
"vibration": Tensor[GT_FRAMES, N_REGIONS], # ground truth de vibração
"song_id": str,
}Script de validação de integração: gera stems sintéticos (senos de frequências determinísticas) e executa process_stems para verificar o shape do tensor de saída sem depender de áudio real.
Útil para verificar a instalação do ambiente e confirmar que as dependências de processamento de áudio estão funcionando.
python -m backend.src.synthetic_stem_example
# Synthetic stem validation passed: shape=(11, 4, 64, 50)| Arquivo | Descrição |
|---|---|
evaluation.py |
Loop de avaliação com dados sintéticos; mede MSE e latência média |
inference.py |
Prepara tensores para inferência e carrega checkpoint do modelo |
O módulo inference.py expõe:
prepare_inference_input(drums, bass, vocals, other)— wrapper sobreprocess_stemsprepare_inference_input_from_directory(dir)— assume nomes canônicosdrums.wavetc.load_inference_model(path)— carregaCNN2DMultichannelde um.pte retorna em modoeval()
Status: a etapa de predição em batch e geração da matriz final de vibração
[Total_Frames, 4]ainda está em desenvolvimento (ver TODOs eminference.py).
| Biblioteca | Uso |
|---|---|
torch / torchaudio |
Tensores, carregamento de áudio, reamostragem |
nnAudio |
Mel spectrogram diferenciável (GPU-friendly) |
librosa |
Fallback e utilitários de análise de áudio |
pandas |
Leitura do manifest CSV |
numpy |
Operações numéricas no dataset loader |