v0.8.0

thevoiceguy/siphon-aiv0.8.0Jun 17, 2026by thevoiceguy

Upgrading?

AI Summary

This release adds Opus codec support, allowing SiphonAI to negotiate Opus audio (wire rate 48kHz, bridge rate 16kHz) alongside its existing G.711 and G.722 codecs.

Key Highlights

  • End-to-end Opus negotiation with dynamic payload type preservation.
  • Wire format is `opus/48000/2` (48 kHz), but the internal bridge rate is 16 kHz to match the PCM16 contract.
  • New native build dependency: `libopus` (via `audiopus_sys`) requires a C toolchain and CMake.
  • Off-by-default feature; requires adding `"opus"` to `[media].codecs`.

New Features

  • Opus codec support
  • Updated `forge-media` pin for 16 kHz Opus bridge rate

Full Release Notes

**Theme: Opus codec support.** SiphonAI previously advertised only G.711/G.722 and rejected Opus at config load. Opus is now negotiable.

Opus runs at a **16 kHz bridge rate** — `opus/48000/2` on the wire, but the WS path sees a 16 kHz session (`start.audio.sample_rate = 16000`), so the fixed 8/16 kHz PCM16 audio contract is unchanged and the **WS protocol stays `version: "1"`**. The RTP clock stays 48 kHz per RFC 7587; only the WS-facing PCM is 16 kHz. libopus handles the 48↔16 resample and stereo→mono downmix internally.

**Off by default** — add `"opus"` to `[media].codecs`.

### Highlights
- **Opus negotiation** end-to-end: a peer offering `opus/48000/2` (or an outbound route listing `"opus"`) now negotiates Opus; the dynamic payload type is preserved on the answer (RFC 3264).
- **First native build dependency: libopus** (via `audiopus_sys`, built from source) — building now needs a C toolchain + CMake; the shipped Dockerfile already has them. Runtime image unaffected. This is why it's a minor bump.
- **forge-media pin bumped** to add the 16 kHz Opus bridge rate (forge-media#75, mirroring G.722's wire-clock-vs-PCM-rate split).
- **SIPp `opus` regression phase** asserts the 200 OK answers Opus and the call comes up at 16 kHz.

### Notes
- **SDP `fmtp` (`stereo=0` / `useinbandfec` / `maxplaybackrate`) is a follow-up** — Opus is correct without it; the params want real-device validation.

PRs: #184 (design) → #185 (enable) → #186 (harness + docs + release).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Related Repositories