huggingface/transformers · error · ValueError

Unknown log_mel option: {log_mel}

Error message

Unknown log_mel option: {log_mel}

What it means

Thrown by `spectrogram` when `log_mel` is not one of "log", "log10", or "dB" while `power` is not None. The log_mel parameter selects the post-processing applied to the mel spectrogram; an unrecognized string cannot be applied, so the function raises after the spectrogram has been computed but before returning.

Source

Thrown at src/transformers/audio_utils.py:1013

    spectrogram = spectrogram.T

    if mel_filters is not None:
        spectrogram = np.maximum(mel_floor, np.dot(mel_filters.T, spectrogram))

    if power is not None and log_mel is not None:
        if log_mel == "log":
            spectrogram = np.log(spectrogram)
        elif log_mel == "log10":
            spectrogram = np.log10(spectrogram)
        elif log_mel == "dB":
            if power == 1.0:
                spectrogram = amplitude_to_db(spectrogram, reference, min_value, db_range)
            elif power == 2.0:
                spectrogram = power_to_db(spectrogram, reference, min_value, db_range)
            else:
                raise ValueError(f"Cannot use log_mel option '{log_mel}' with power {power}")
        else:
            raise ValueError(f"Unknown log_mel option: {log_mel}")

        spectrogram = np.asarray(spectrogram, dtype)

    return spectrogram


def spectrogram_batch(
    waveform_list: list[np.ndarray],
    window: np.ndarray,
    frame_length: int,
    hop_length: int,
    fft_length: int | None = None,
    power: float | None = 1.0,
    center: bool = True,
    pad_mode: str = "reflect",
    onesided: bool = True,
    dither: float = 0.0,
    preemphasis: float | None = None,

View on GitHub (pinned to a597f97485)

Solutions

  1. Use exactly one of "log", "log10", or "dB"
  2. Set log_mel=None if you want the raw (mel) spectrogram without log compression
  3. Fix the config/preprocessor override that supplies the invalid string

Example fix

// before
spec = spectrogram(waveform, window, 400, 160, power=2.0, mel_filters=mel, log_mel="db")  # ValueError

// after
spec = spectrogram(waveform, window, 400, 160, power=2.0, mel_filters=mel, log_mel="dB")
Defensive patterns

Strategy: validation

Validate before calling

VALID_LOG_MEL = {None, "log", "log10", "dB"}
if log_mel not in VALID_LOG_MEL:
    raise ValueError(f"log_mel must be one of {sorted(v for v in VALID_LOG_MEL if v)}, got {log_mel!r}")
spec = spectrogram(waveform, window, frame_length, hop_length, power=2.0, mel_filters=mel, log_mel=log_mel)

Type guard

def is_valid_log_mel(v) -> bool:
    return v is None or v in {"log", "log10", "dB"}

Try / catch

try:
    spec = spectrogram(..., log_mel=log_mel)
except ValueError as e:
    if "Unknown log_mel option" in str(e):
        spec = spectrogram(..., log_mel="log")
    else:
        raise

Prevention

When it happens

Trigger: Calling `spectrogram(..., log_mel="ln")`, `log_mel="dBFS"`, `log_mel="Log"` (capitalized), or any typo, together with a non-None power. Feature-extractor configs that carry a log-mel mode string hit this if the vocabulary differs.

Common situations: Porting mode names from librosa/torchaudio (e.g. "log_mels", "db"); casing or abbreviation mistakes in JSON configs; values copied from another model's preprocessor config.

Related errors


AI-assisted analysis of huggingface/transformers@a597f97485 (2026-08-14). Data as JSON: /api/errors/9758809b90e8bd67. Report an issue: GitHub.