Replace torchaudio.save with soundfile.write; add EPUB loader node

- nodes/generator.py: swap torchaudio.save for soundfile.write to avoid
  torchcodec/FFmpeg dependency crash in environments without FFmpeg shared libs
- nodes/epub_loader.py: new OmniVoiceEpubLoader node for loading EPUB chapters
- tests/test_epub_loader.py: 8 tests for the EPUB loader
- install.py: add beautifulsoup4 to runtime deps
- __init__.py, nodes/__init__.py: register OmniVoiceEpubLoader

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-05 17:24:18 +02:00
parent 5366f6992e
commit 5dfaa0b300
8 changed files with 254 additions and 6 deletions
+2 -2
View File
@@ -75,7 +75,7 @@ def test_generate_voice_cloning():
ref_waveform = torch.zeros(1, 1, 24000)
ref_audio_input = {"waveform": ref_waveform, "sample_rate": 24000}
with patch("nodes.generator.torchaudio.save") as mock_save:
with patch("nodes.generator.sf.write") as mock_write:
result = node.generate(
model=mock_model,
text="Hello world",
@@ -86,7 +86,7 @@ def test_generate_voice_cloning():
num_step=32,
)
assert mock_save.called
assert mock_write.called
call_kwargs = mock_model.generate.call_args[1]
assert call_kwargs["ref_text"] == "reference text"
assert "ref_audio" in call_kwargs