Fix torchcodec issue

This commit is contained in:
2026-07-27 10:05:59 -07:00
parent 735513d048
commit eed2d51128
4 changed files with 46 additions and 2 deletions
+14
View File
@@ -0,0 +1,14 @@
from pathlib import Path
import soundfile as sf
import torch
def load_wav(path: Path) -> tuple[torch.Tensor, int]:
"""Load a WAV file as a (channels, samples) float32 tensor.
Reads via soundfile rather than torchaudio.load, whose default backend
now requires the separate torchcodec package.
"""
data, sr = sf.read(str(path), dtype="float32", always_2d=True)
return torch.from_numpy(data.T).contiguous(), sr
+3 -1
View File
@@ -23,7 +23,9 @@ def force_align_section(vocals_path: Path, start: float, end: float,
import torchaudio
from torchaudio.pipelines import MMS_FA as bundle
waveform, sr = torchaudio.load(str(vocals_path))
from ..audio_io import load_wav
waveform, sr = load_wav(vocals_path)
waveform = waveform.mean(0, keepdim=True)
lo, hi = int(start * sr), min(int(end * sr), waveform.shape[1])
waveform = torchaudio.functional.resample(
+3 -1
View File
@@ -9,7 +9,9 @@ def track_pitch(vocals_path: Path, model: str, device: str):
import torchaudio
import torchcrepe
waveform, sr = torchaudio.load(str(vocals_path))
from ..audio_io import load_wav
waveform, sr = load_wav(vocals_path)
waveform = waveform.mean(0, keepdim=True)
waveform = torchaudio.functional.resample(waveform, sr, 16000)
f0, periodicity = torchcrepe.predict(
+26
View File
@@ -0,0 +1,26 @@
import numpy as np
import soundfile as sf
from karaoke_maker.audio_io import load_wav
def test_load_wav_mono(tmp_path):
path = tmp_path / "mono.wav"
data = np.linspace(-0.5, 0.5, 1600, dtype=np.float32)
sf.write(path, data, 16000)
waveform, sr = load_wav(path)
assert sr == 16000
assert waveform.shape == (1, 1600)
assert np.allclose(waveform[0].numpy(), data, atol=1e-4)
def test_load_wav_stereo(tmp_path):
path = tmp_path / "stereo.wav"
left = np.linspace(-0.5, 0.5, 800, dtype=np.float32)
right = np.linspace(0.5, -0.5, 800, dtype=np.float32)
sf.write(path, np.stack([left, right], axis=1), 16000)
waveform, sr = load_wav(path)
assert sr == 16000
assert waveform.shape == (2, 800)
assert np.allclose(waveform[0].numpy(), left, atol=1e-4)
assert np.allclose(waveform[1].numpy(), right, atol=1e-4)