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
signalhint (Auto,Voice,Music)The
applicationprofileThe 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 |
|---|---|
|
Balanced default. Suitable for music and general audio. |
|
Biases toward SILK / hybrid; adds noise suppression tuned for speech. |
|
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 |
|---|---|
|
Run the built-in classifier (default). |
|
Treat the source as speech; push toward SILK / hybrid modes. |
|
Treat the source as music; push toward CELT. |
Bandwidth Control
Bandwidth controls the coded audio bandwidth:
Enum value |
Audio BW |
Sample rate |
Notes |
|---|---|---|---|
|
4 kHz |
8 kHz |
SILK-only |
|
6 kHz |
12 kHz |
SILK-only |
|
8 kHz |
16 kHz |
SILK or hybrid |
|
12 kHz |
24 kHz |
Hybrid or CELT |
|
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.