Skip to content

About

A local-first macOS personal radio player with SwiftUI, Apple Music, VoxCPM2 TTS, and a lightweight DJ sidecar.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

English | 中文

VoxRadio

A local-first macOS personal radio player with an AI host.

VoxRadio combines a native SwiftUI player with Apple Music, a local VoxCPM2 TTS sidecar, a lightweight Text DJ, and optional Memory. It is designed to start with a calm Daily Opening and then get out of the way while music plays.

Public preview: macOS 15+, local development project, not a signed consumer app. The fastest path uses Mock TTS and does not download a model.

Screenshots

Daily Opening

Music Discovery

Text DJ and Memory

What it does

  • Daily Opening: prepares a short weather, agenda, and music-aware host segment, with replay, skip, and Apple Music handoff states.
  • Now Playing: keeps the current music or opening segment as the first screen instead of turning the app into a service dashboard.
  • Music Discovery: searches Apple Music and presents song, artist, and album paths when MusicKit is configured.
  • Text DJ: accepts short natural-language listening requests and keeps quick playback controls available when the DJ provider is unavailable.
  • Local sidecars: TTS, DJBrain, and Memory are explicit HTTP services with health checks and graceful degradation.
  • Validation composition: app-level endpoint injection and disabled clients make side-effect-free local verification possible.

Architecture

See docs/ARCHITECTURE.md for the app/service boundary, data flow, and reliability rules.

Quick start: Mock TTS

Requirements

  • macOS 15 or newer;
  • full Xcode with the macOS toolchain selected;
  • Python 3.11 or 3.12 for the real TTS path; Mock TTS has no model dependency;
  • Python 3.12+ for the DJBrain sidecar and its checks.

Start the mock sidecar:

scripts/start_demo_tts.sh

Then open the project:

open VoxRadio.xcodeproj

In Xcode, select the VoxRadio scheme and the My Mac destination. The app can also run without sidecars and will use local demo fallbacks for the player flow.

Useful commands:

scripts/voxradio-services status
scripts/voxradio-services smoke
scripts/voxradio-services stop

The default local endpoints are loopback-only:

  • TTS: 127.0.0.1:8765
  • DJBrain: 127.0.0.1:8787
  • Memory: managed by scripts/voxradio-memory

Real VoxCPM2 TTS

The real path is deliberately explicit. It may install Python dependencies, download model files, and take several minutes on first use:

scripts/start_real_tts.sh
services/tts/scripts/smoke_real_tts.sh

Keep model files and generated audio outside Git. The repository contains the sidecar and its tests, not VoxCPM2 weights.

Apple Music setup

Real search and playback require the contributor's own Apple Developer configuration, a MusicKit-capable bundle identifier, user authorization, and an Apple Music subscription. The local demo and unit tests do not provide a MusicKit entitlement or redistribute music.

Verification

swift run VoxRadioCoreChecks
swift test
TTS_PYTHON=python3.11
DJBRAIN_PYTHON=python3.12
"$TTS_PYTHON" services/tts/tests/run_checks.py
"$DJBRAIN_PYTHON" services/djbrain/tests/run_checks.py
git diff --check

Use the full path to your supported Python executable when python3.11 or python3.12 is not on PATH.

For an app build:

xcodebuild -project VoxRadio.xcodeproj \
  -scheme VoxRadio \
  -configuration Debug \
  -derivedDataPath .build/xcode-derived \
  build

Privacy and local data

VoxRadio is designed for local use. Do not commit ~/.voxradio, Memory databases, auth files, provider tokens, raw transcripts, generated WAV files, or model weights. Read SECURITY.md before sharing logs.

The app may request access to Apple Music, location, calendar, and reminders when those features are enabled. You control those permissions in macOS.

Current limits

  • The project is macOS-only and currently distributed as source.
  • Real VoxCPM2 synthesis depends on local hardware, model availability, and Python environment setup.
  • Apple Music features need signing and user authorization.
  • Text DJ quality depends on the configured local provider.
  • Memory is optional; the app remains useful with no-memory mode and degraded sidecars.

Contributing

Start with CONTRIBUTING.md. Focused pull requests and redacted reproducible reports are especially welcome.

License

The project code is released under the MIT License. Third-party services, model weights, Apple Music content, and referenced design resources remain subject to their own terms.

About

A local-first macOS personal radio player with SwiftUI, Apple Music, VoxCPM2 TTS, and a lightweight DJ sidecar.

Topics

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages