File size: 2,526 Bytes
e275025 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
"""
Audio processing utilities
"""
import logging
from pathlib import Path
import librosa
import numpy as np
logger = logging.getLogger(__name__)
TARGET_SAMPLE_RATE = 16000
def load_audio(audio_path: Path, sr: int = TARGET_SAMPLE_RATE) -> np.ndarray:
"""
Загрузить аудио файл.
Args:
audio_path: Путь к аудио файлу
sr: Целевая частота дискретизации
Returns:
Аудио данные как numpy array
"""
try:
logger.debug(f"Loading audio: {audio_path}")
audio, original_sr = librosa.load(str(audio_path), sr=None)
# Ресемплинг если необходимо
if original_sr != sr:
logger.debug(f"Resampling from {original_sr}Hz to {sr}Hz")
audio = librosa.resample(audio, orig_sr=original_sr, target_sr=sr)
logger.info(f"Audio loaded: {len(audio)} samples, {sr}Hz")
return audio
except Exception as e:
logger.error(f"Error loading audio: {e}")
raise
def resample_audio(audio: np.ndarray, orig_sr: int, target_sr: int) -> np.ndarray:
"""
Изменить частоту дискретизации аудио.
Args:
audio: Аудио данные
orig_sr: Исходная частота
target_sr: Целевая частота
Returns:
Обработанные аудио данные
"""
if orig_sr == target_sr:
return audio
logger.debug(f"Resampling: {orig_sr}Hz -> {target_sr}Hz")
return librosa.resample(audio, orig_sr=orig_sr, target_sr=target_sr)
def get_audio_duration(audio: np.ndarray, sr: int = TARGET_SAMPLE_RATE) -> float:
"""
Получить длительность аудио в секундах.
Args:
audio: Аудио данные
sr: Частота дискретизации
Returns:
Длительность в секундах
"""
return len(audio) / sr
def validate_audio(audio_path: Path) -> bool:
"""
Проверить валидность аудио файла.
Args:
audio_path: Путь к файлу
Returns:
True если файл валиден
"""
try:
audio = load_audio(audio_path)
return len(audio) > 0
except Exception as e:
logger.error(f"Audio validation failed: {e}")
return False
|