| from typing import Dict, Tuple, List | |
| import numpy as np | |
| import librosa | |
| from .preprocessing import load_audio, trim_silence, normalize_audio | |
| def extract_mfcc(y: np.ndarray, sr: int, n_mfcc: int = 13) -> np.ndarray: | |
| mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=n_mfcc) | |
| # aggregate statistics: mean and std for each coefficient | |
| return np.concatenate([np.mean(mfccs, axis=1), np.std(mfccs, axis=1)]) | |
| def extract_chroma(y: np.ndarray, sr: int) -> np.ndarray: | |
| chroma = librosa.feature.chroma_stft(y=y, sr=sr) | |
| return np.concatenate([np.mean(chroma, axis=1), np.std(chroma, axis=1)]) | |
| def extract_spectral_contrast(y: np.ndarray, sr: int) -> np.ndarray: | |
| contrast = librosa.feature.spectral_contrast(y=y, sr=sr) | |
| return np.concatenate([np.mean(contrast, axis=1), np.std(contrast, axis=1)]) | |
| def extract_zcr(y: np.ndarray) -> np.ndarray: | |
| z = librosa.feature.zero_crossing_rate(y) | |
| return np.array([np.mean(z), np.std(z)]) | |
| def extract_rms(y: np.ndarray) -> np.ndarray: | |
| rms = librosa.feature.rms(y=y) | |
| return np.array([np.mean(rms), np.std(rms)]) | |
| def extract_features(path: str) -> Tuple[np.ndarray, List[str]]: | |
| """ | |
| Extract a consolidated feature vector from an audio file. | |
| Returns: | |
| features: 1D numpy array | |
| feature_names: list of feature labels (helpful for DataFrame) | |
| """ | |
| y, sr = load_audio(path) | |
| y = trim_silence(y) | |
| y = normalize_audio(y) | |
| parts = [] | |
| names: List[str] = [] | |
| mfcc_feats = extract_mfcc(y, sr) | |
| parts.append(mfcc_feats) | |
| names.extend([f"mfcc_mean_{i+1}" for i in range(len(mfcc_feats)//2)]) | |
| names.extend([f"mfcc_std_{i+1}" for i in range(len(mfcc_feats)//2)]) | |
| chroma_feats = extract_chroma(y, sr) | |
| parts.append(chroma_feats) | |
| names.extend([f"chroma_mean_{i+1}" for i in range(len(chroma_feats)//2)]) | |
| names.extend([f"chroma_std_{i+1}" for i in range(len(chroma_feats)//2)]) | |
| contrast_feats = extract_spectral_contrast(y, sr) | |
| parts.append(contrast_feats) | |
| names.extend([f"contrast_mean_{i+1}" for i in range(len(contrast_feats)//2)]) | |
| names.extend([f"contrast_std_{i+1}" for i in range(len(contrast_feats)//2)]) | |
| zcr_feats = extract_zcr(y) | |
| parts.append(zcr_feats) | |
| names.extend(["zcr_mean", "zcr_std"]) | |
| rms_feats = extract_rms(y) | |
| parts.append(rms_feats) | |
| names.extend(["rms_mean", "rms_std"]) | |
| feature_vector = np.concatenate(parts) | |
| return feature_vector, names | |
Xet Storage Details
- Size:
- 2.45 kB
- Xet hash:
- f02294e8a5cd3b042a1f8cdd86a33c0ea13e7aac50552636b1905f2b59e3dcfd
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.