huggingface/transformers · error · ValueError

Cannot use log_mel option '{log_mel}' with power {power}

Error message

Cannot use log_mel option '{log_mel}' with power {power}

What it means

Thrown by `spectrogram` when `log_mel="dB"` but `power` is neither 1.0 nor 2.0. The dB conversion delegates to `amplitude_to_db` for power==1.0 and `power_to_db` for power==2.0; any other exponent (e.g. 1.5, 3.0) has no defined dB reference, so it is rejected at the log-mel stage.

Source

Thrown at src/transformers/audio_utils.py:1011

        spectrogram = np.abs(spectrogram, dtype=np.float64) ** power

    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,

View on GitHub (pinned to a597f97485)

Solutions

  1. Use power=2.0 (power spectrogram, standard for log-mel) or power=1.0 (magnitude) when log_mel="dB"
  2. If you need a non-standard power, use log_mel="log" or "log10" instead of "dB"
  3. Check the processor config for the power/log_mel pair

Example fix

// before
spec = spectrogram(waveform, window, 400, 160, power=1.5, 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

if log_mel == "dB":
    if power not in (1.0, 2.0):
        raise ValueError(f"log_mel='dB' requires power 1.0 or 2.0, got {power}")
spec = spectrogram(waveform, window, frame_length, hop_length, power=power, mel_filters=mel, log_mel=log_mel)

Type guard

def db_log_mel_supported(power: float, log_mel) -> bool:
    return log_mel != "dB" or power in (1.0, 2.0)

Try / catch

try:
    spec = spectrogram(..., power=power, mel_filters=mel, log_mel="dB")
except ValueError as e:
    if "Cannot use log_mel option" in str(e):
        spec = spectrogram(..., power=2.0, mel_filters=mel, log_mel="dB")
    else:
        raise

Prevention

When it happens

Trigger: Calling `spectrogram(..., power=1.5, mel_filters=..., log_mel="dB")` or any non-{1.0, 2.0} power combined with log_mel="dB". Feature extractors that expose both power and log_mel in config can produce this pair.

Common situations: Custom processors experimenting with fractional spectrogram exponents; porting Whisper-style dB logs while keeping an exotic power value; configs edited so power no longer matches the 1.0/2.0 convention.

Related errors


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