Codec Modes

Opus contains two independent audio codecs that it combines to cover every use case from 6 kbps narrowband phone calls to 512 kbps transparent music archival. Understanding the three modes (SILK-only, CELT-only, and hybrid) helps you pick the right encoder settings.

The Three Modes

SILK-Only

SILK is a wideband speech codec (LP-based, similar in heritage to iSAC). It operates at internal rates of 8, 12, or 16 kHz and is optimised for speech at low-to-medium bitrates.

  • Best for: speech, voice calls, VoIP at 6-32 kbps

  • Frame sizes: 10, 20, 40, or 60 ms

  • Bandwidth: narrowband (NB), medium-band (MB), or wideband (WB)

enc = ruopus.OpusEncoder(
    1,
    bitrate=16_000,
    application=ruopus.Application.Voip,
    signal=ruopus.Signal.Voice,
)
packet = enc.encode_silk(frame)    # force SILK-only for this frame

CELT-Only

CELT is an MDCT-based codec (similar in heritage to Vorbis). It operates at the full 48 kHz sample rate and excels at music, wideband audio, and low-latency applications.

  • Best for: music, game audio, low-delay voice at 32+ kbps

  • Frame sizes: 2.5, 5, 10, or 20 ms

  • Bandwidth: narrowband through fullband

enc = ruopus.OpusEncoder(
    2,
    bitrate=96_000,
    application=ruopus.Application.Audio,
    signal=ruopus.Signal.Music,
)
packet = enc.encode(frame)    # encode() always uses CELT

Hybrid

Hybrid coding uses SILK for the low band (below 8 kHz) and CELT for the high band above it. This gives SILK’s speech quality at low bitrates while preserving fullband presence.

  • Best for: super-wideband or fullband speech at 16-32 kbps

  • Frame sizes: 10 or 20 ms

  • Bandwidth: super-wideband (SWB) or fullband (FB)

packet = enc.encode_hybrid(frame)    # force hybrid for this frame

Automatic Mode Selection

encode_auto() is the right choice for most applications. The encoder runs a signal classifier on every frame and selects SILK, hybrid, or CELT based on:

  • The signal hint (Auto, Voice, Music)

  • The application profile

  • The target bitrate and forced/maximum bandwidth

  • Cross-frame hysteresis (to avoid rapid mode flipping)

enc = ruopus.OpusEncoder(2, bitrate=32_000)
# Auto mode: classifier picks SILK/hybrid/CELT per frame
packet = enc.encode_auto(frame)

Checking the Mode of a Decoded Packet

After encoding, inspect the TOC byte to confirm which mode was used:

pkt = ruopus.Packet(packet)
print(pkt.toc.mode)        # Mode.SilkOnly / Mode.Hybrid / Mode.CeltOnly
print(pkt.toc.bandwidth)   # Bandwidth.FullBand, etc.
print(pkt.toc.frame_size)  # FrameSize.Ms20, etc.

See Packet Inspection for the full packet introspection API.

Application Profiles

The Application enum nudges the automatic classifier:

Value

Effect

Application.Audio

Balanced default. Suitable for music and general audio.

Application.Voip

Biases toward SILK / hybrid; adds noise suppression tuned for speech.

Application.RestrictedLowDelay

Forces CELT-only on every frame. Lowest latency (encoder lookahead = 2.5 ms). Never uses SILK.

Signal Hints

The Signal enum biases the speech/music classifier:

Value

Effect

Signal.Auto

Run the built-in classifier (default).

Signal.Voice

Treat the source as speech; push toward SILK / hybrid modes.

Signal.Music

Treat the source as music; push toward CELT.

Bandwidth Control

Bandwidth controls the coded audio bandwidth:

Enum value

Audio BW

Sample rate

Notes

Bandwidth.NarrowBand

4 kHz

8 kHz

SILK-only

Bandwidth.MediumBand

6 kHz

12 kHz

SILK-only

Bandwidth.WideBand

8 kHz

16 kHz

SILK or hybrid

Bandwidth.SuperWideBand

12 kHz

24 kHz

Hybrid or CELT

Bandwidth.FullBand

20 kHz

48 kHz

CELT or hybrid

Set max_bandwidth to cap automatic selection, or bandwidth to pin it. Call set_auto_bandwidth() to restore automatic selection.