@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 5aeb925452
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 14, 05:30 UTC

Multimodal - audio tests (#25285)

Signed-off-by: Debolina Roy <debroy@redhat.com>

Deboleina committed Sep 21, 2025 at 19:07 UTC 5aeb9254521023f97aca292b3478aa7ff485ffb2
1 file changed +140
tests/multimodal/test_audio.py new
+140
@@ -0,0 +1,140 @@
1 +# SPDX-License-Identifier: Apache-2.0
2 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +# test_audio.py
4 +import base64
5 +from pathlib import Path
6 +from unittest.mock import patch
7 +
8 +import numpy as np
9 +import pytest
10 +
11 +from vllm.multimodal.audio import (AudioMediaIO, AudioResampler,
12 + resample_audio_librosa,
13 + resample_audio_scipy)
14 +
15 +
16 +@pytest.fixture
17 +def dummy_audio():
18 + return np.array([0.0, 0.1, 0.2, 0.3, 0.4], dtype=float)
19 +
20 +
21 +def test_resample_audio_librosa(dummy_audio):
22 + with patch("vllm.multimodal.audio.librosa.resample") as mock_resample:
23 + mock_resample.return_value = dummy_audio * 2
24 + out = resample_audio_librosa(dummy_audio,
25 + orig_sr=44100,
26 + target_sr=22050)
27 + mock_resample.assert_called_once_with(dummy_audio,
28 + orig_sr=44100,
29 + target_sr=22050)
30 + assert np.all(out == dummy_audio * 2)
31 +
32 +
33 +def test_resample_audio_scipy(dummy_audio):
34 + out_down = resample_audio_scipy(dummy_audio, orig_sr=4, target_sr=2)
35 + out_up = resample_audio_scipy(dummy_audio, orig_sr=2, target_sr=4)
36 + out_same = resample_audio_scipy(dummy_audio, orig_sr=4, target_sr=4)
37 +
38 + assert len(out_down) == 3
39 + assert len(out_up) == 10
40 + assert np.all(out_same == dummy_audio)
41 +
42 +
43 +@pytest.mark.xfail(
44 + reason="resample_audio_scipy is buggy for non-integer ratios")
45 +def test_resample_audio_scipy_non_integer_ratio(dummy_audio):
46 + out = resample_audio_scipy(dummy_audio, orig_sr=5, target_sr=3)
47 +
48 + expected_len = int(round(len(dummy_audio) * 3 / 5))
49 + assert len(out) == expected_len
50 +
51 + assert isinstance(out, np.ndarray)
52 + assert np.isfinite(out).all()
53 +
54 +
55 +def test_audio_resampler_librosa_calls_resample(dummy_audio):
56 + resampler = AudioResampler(target_sr=22050, method="librosa")
57 + with patch(
58 + "vllm.multimodal.audio.resample_audio_librosa") as mock_resample:
59 + mock_resample.return_value = dummy_audio
60 + out = resampler.resample(dummy_audio, orig_sr=44100)
61 + mock_resample.assert_called_once_with(dummy_audio,
62 + orig_sr=44100,
63 + target_sr=22050)
64 + assert np.all(out == dummy_audio)
65 +
66 +
67 +def test_audio_resampler_scipy_calls_resample(dummy_audio):
68 + resampler = AudioResampler(target_sr=22050, method="scipy")
69 + with patch("vllm.multimodal.audio.resample_audio_scipy") as mock_resample:
70 + mock_resample.return_value = dummy_audio
71 + out = resampler.resample(dummy_audio, orig_sr=44100)
72 + mock_resample.assert_called_once_with(dummy_audio,
73 + orig_sr=44100,
74 + target_sr=22050)
75 + assert np.all(out == dummy_audio)
76 +
77 +
78 +def test_audio_resampler_invalid_method(dummy_audio):
79 + resampler = AudioResampler(target_sr=22050, method="invalid")
80 + with pytest.raises(ValueError):
81 + resampler.resample(dummy_audio, orig_sr=44100)
82 +
83 +
84 +def test_audio_resampler_no_target_sr(dummy_audio):
85 + resampler = AudioResampler(target_sr=None)
86 + with pytest.raises(RuntimeError):
87 + resampler.resample(dummy_audio, orig_sr=44100)
88 +
89 +
90 +@pytest.fixture
91 +def dummy_audio_bytes():
92 + return b"FAKEAUDIOBYTES"
93 +
94 +
95 +def test_audio_media_io_load_bytes(dummy_audio_bytes):
96 + audio_io = AudioMediaIO()
97 + with patch("vllm.multimodal.audio.librosa.load") as mock_load:
98 + mock_load.return_value = (np.array([0.1, 0.2]), 16000)
99 + out = audio_io.load_bytes(dummy_audio_bytes)
100 + mock_load.assert_called_once()
101 + assert isinstance(out[0], np.ndarray)
102 + assert out[1] == 16000
103 +
104 +
105 +def test_audio_media_io_load_base64(dummy_audio_bytes):
106 + audio_io = AudioMediaIO()
107 + encoded = base64.b64encode(dummy_audio_bytes).decode("utf-8")
108 + with patch.object(AudioMediaIO, "load_bytes") as mock_load_bytes:
109 + mock_load_bytes.return_value = (np.array([0.1, 0.2]), 16000)
110 + out = audio_io.load_base64("audio/wav", encoded)
111 + mock_load_bytes.assert_called_once()
112 + assert isinstance(out[0], np.ndarray)
113 + assert out[1] == 16000
114 +
115 +
116 +def test_audio_media_io_load_file():
117 + audio_io = AudioMediaIO()
118 + path = Path("/fake/path.wav")
119 + with patch("vllm.multimodal.audio.librosa.load") as mock_load:
120 + mock_load.return_value = (np.array([0.1, 0.2]), 16000)
121 + out = audio_io.load_file(path)
122 + mock_load.assert_called_once_with(path, sr=None)
123 + assert isinstance(out[0], np.ndarray)
124 + assert out[1] == 16000
125 +
126 +
127 +def test_audio_media_io_encode_base64(dummy_audio):
128 + audio_io = AudioMediaIO()
129 + media = (dummy_audio, 16000)
130 + with patch("vllm.multimodal.audio.soundfile.write") as mock_write:
131 +
132 + def write_to_buffer(buffer, *_args, **_kwargs):
133 + buffer.write(b"dummy_wav_data")
134 +
135 + mock_write.side_effect = write_to_buffer
136 +
137 + out = audio_io.encode_base64(media)
138 + decoded = base64.b64decode(out)
139 + assert decoded == b"dummy_wav_data"
140 + mock_write.assert_called_once()