Input Types

audio_samples_qoe.visqol() and audio_samples_qoe.Scoreq accept two kinds of input for each signal argument: a file path or an in-memory audio_samples.AudioSamples. Any combination across arguments is valid.

File Paths

Pass a str or any os.PathLike (including pathlib.Path). The file is decoded with audio_samples.read().

from pathlib import Path
from audio_samples_qoe import visqol

score = visqol("reference.wav", Path("degraded.flac"))

Supported formats: WAV (PCM 16/24/32-bit, float) and FLAC.

AudioSamples

In-memory signals are passed as audio_samples.AudioSamples. A signal produced by an audio_samples generator or loader is already an AudioSamples and can be passed straight in:

from audio_samples import sine_wave
from audio_samples_qoe import visqol

ref = sine_wave(440, 5.0, 48_000)
score = visqol(ref, "degraded.wav")

To use a raw NumPy array you already hold, attach a sample rate with new_mono (1-D) or new_multi (2-D, shape (channels, samples)):

from audio_samples import AudioSamples

signal = AudioSamples.new_mono(samples, 48_000)
signal = AudioSamples.new_multi(channels, 48_000)

Any NumPy integer or float dtype is accepted. Integer formats (int16, int32, …) are normalised to [-1, 1] internally before scoring.

Sample Rates

Signals at any sample rate are accepted. In audio mode both signals are resampled to 48 kHz internally. In speech mode the reference runs at its native rate and the degraded signal is resampled to match. Providing 16 kHz speech input directly is recommended.

ref = AudioSamples.new_mono(ref_arr, 48_000)
deg = AudioSamples.new_mono(deg_arr, 16_000)   # resampled to 48 kHz in audio mode
score = visqol(ref, deg)

Channel Count

Any channel count is accepted. All signals are mixed down to mono by averaging the channels before scoring.

What Is Not Accepted

Raw NumPy arrays without a sample rate are rejected with a TypeError that explains how to fix it:

import numpy as np
arr = np.zeros(48_000 * 5)
visqol(arr, arr)
# TypeError: reference must be an audio_samples.AudioSamples, str, or
# os.PathLike, got ndarray; wrap raw sample arrays with
# audio_samples.AudioSamples.new_mono(arr, sample_rate) or new_multi

The sample rate is meaningful to the metric, so it must be attached explicitly rather than guessed.