arch: extract cf_voice to standalone cf-voice repo (do not build inside cf-core) #35

Closed
opened 2026-04-06 13:43:00 -07:00 by pyr0ball · 2 comments
Owner

Decision

Linnet (real-time tone annotation) and Osprey (hold-line IVR) both need a shared audio processing layer. After scoping Linnet, the right architecture is a standalone cf-voice repo rather than a module inside circuitforge-core.

Rationale

  • cf-core should stay lightweight and domain-agnostic (db, llm, tiers, config, hardware, tasks)
  • cf-voice brings heavy, specialized dependencies: YAMNet, wav2vec2, pyannote.audio, whisper.cpp, optional FreeSWITCH -- none of these belong in cf-core dependency tree
  • Audio is PII-sensitive and deserves its own security/privacy boundary and release cadence
  • cf-voice is a shared dependency for at minimum: Linnet, Osprey, Falcon, Ibis, Harrier

Scope for new cf-voice repo

  • cf_voice.io -- VAD (Voice Activity Detection), noise gate, ring buffer
  • cf_voice.context -- YAMNet AME (Acoustic Mood Estimation), wav2vec2 paralinguistic, pyannote.audio speaker diarization
  • cf_voice.telephony -- FreeSWITCH/SIP/PSTN bridge (optional, for Osprey path)
  • VoiceFrame output type -- the only integration surface Linnet touches

Action items

  • Remove the module:voice label concept from cf-core (no voice module will live here)
  • Create Circuit-Forge/cf-voice repo
  • Define VoiceFrame type as the primary API surface
  • Wire into Linnet Notation v0.1.x as first consumer
  • Wire into Osprey as second consumer

Blocking

Linnet issue Circuit-Forge/linnet#3 is blocked on this work.

## Decision Linnet (real-time tone annotation) and Osprey (hold-line IVR) both need a shared audio processing layer. After scoping Linnet, the right architecture is a **standalone `cf-voice` repo** rather than a module inside circuitforge-core. ## Rationale - cf-core should stay lightweight and domain-agnostic (db, llm, tiers, config, hardware, tasks) - cf-voice brings heavy, specialized dependencies: YAMNet, wav2vec2, pyannote.audio, whisper.cpp, optional FreeSWITCH -- none of these belong in cf-core dependency tree - Audio is PII-sensitive and deserves its own security/privacy boundary and release cadence - cf-voice is a shared dependency for at minimum: Linnet, Osprey, Falcon, Ibis, Harrier ## Scope for new `cf-voice` repo - `cf_voice.io` -- VAD (Voice Activity Detection), noise gate, ring buffer - `cf_voice.context` -- YAMNet AME (Acoustic Mood Estimation), wav2vec2 paralinguistic, pyannote.audio speaker diarization - `cf_voice.telephony` -- FreeSWITCH/SIP/PSTN bridge (optional, for Osprey path) - `VoiceFrame` output type -- the only integration surface Linnet touches ## Action items - [ ] Remove the `module:voice` label concept from cf-core (no voice module will live here) - [ ] Create `Circuit-Forge/cf-voice` repo - [ ] Define `VoiceFrame` type as the primary API surface - [ ] Wire into Linnet Notation v0.1.x as first consumer - [ ] Wire into Osprey as second consumer ## Blocking Linnet issue `Circuit-Forge/linnet#3` is blocked on this work.
pyr0ball added the
priority:backlog
architecture
module:voice
labels 2026-04-06 13:43:00 -07:00
Author
Owner

Done — cf_voice extracted to Circuit-Forge/cf-voice (standalone repo, v0.1.0, shipped 2026-04-06). Install: pip install -e ../cf-voice.

Done — cf_voice extracted to Circuit-Forge/cf-voice (standalone repo, v0.1.0, shipped 2026-04-06). Install: pip install -e ../cf-voice.
Author
Owner

Status update (2026-04-12): All action items from this issue are now complete.

  • Circuit-Forge/cf-voice repo is live with a full implementation: io (VAD, noise gate, ring buffer), context (YAMNet acoustic classifier, diarize, classify), stt (faster-whisper STT), events (VoiceFrame SSE wire format), capture, cli, prefs, telephony stub
  • VoiceFrame type defined and stable — first consumer is Linnet (Circuit-Forge/linnet)
  • No voice module in cf-core — dependency boundary held

Related: Circuit-Forge/cf-voice#2 (YAMNet classifier), #3 (acoustic fingerprinting), #4 (negotiation discourse analysis)

**Status update (2026-04-12):** All action items from this issue are now complete. - `Circuit-Forge/cf-voice` repo is live with a full implementation: `io` (VAD, noise gate, ring buffer), `context` (YAMNet acoustic classifier, diarize, classify), `stt` (faster-whisper STT), `events` (VoiceFrame SSE wire format), `capture`, `cli`, `prefs`, `telephony` stub - `VoiceFrame` type defined and stable — first consumer is Linnet (Circuit-Forge/linnet) - No voice module in cf-core — dependency boundary held Related: Circuit-Forge/cf-voice#2 (YAMNet classifier), #3 (acoustic fingerprinting), #4 (negotiation discourse analysis)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/circuitforge-core#35
No description provided.