Metadata-Version: 2.4
Name: voicecast-worker
Version: 0.1.0
Summary: VoiceCast Worker: lend your Mac to VoiceCast Studio. Draws pictures (FLUX.2 klein on mflux) and speaks narration (sonic-forge) for the studio's job queue.
Author: starshipagentic
License-Expression: MIT
Project-URL: Homepage, https://voicecast.studio
Project-URL: Developers, https://voicecast.studio/developers
Keywords: voicecast,worker,mflux,flux,tts,sonic-forge,apple-silicon
Classifier: Environment :: Console
Classifier: Environment :: MacOS X
Classifier: Operating System :: MacOS
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Provides-Extra: pictures
Requires-Dist: mflux>=0.20; extra == "pictures"
Provides-Extra: voice
Requires-Dist: sonic-forge[kokoro]>=0.13.0; extra == "voice"
Provides-Extra: clone
Requires-Dist: sonic-forge[clone-mlx]>=0.13.0; extra == "clone"
Provides-Extra: menubar
Requires-Dist: rumps>=0.4; extra == "menubar"
Provides-Extra: all
Requires-Dist: mflux>=0.20; extra == "all"
Requires-Dist: sonic-forge[clone-mlx,kokoro]>=0.13.0; extra == "all"
Requires-Dist: rumps>=0.4; extra == "all"
Provides-Extra: test
Requires-Dist: pytest>=8; extra == "test"

# voicecast-worker

VoiceCast Worker lends your Mac to [VoiceCast Studio](https://voicecast.studio). It pulls bite-size jobs from the studio's
one job queue, does them on your GPU, and hands the results back:

- **pictures**: FLUX.2 klein on Apple silicon with [mflux](https://github.com/filipstrand/mflux), the model kept loaded
  (an M2 Ultra draws a picture in about 6 s, an M2 Max in about 20 s);
- **narration**: one paragraph at a time with [sonic-forge](https://pypi.org/project/sonic-forge/) (Kokoro, and cloned
  voices on the Apple GPU), assembled by the studio with the same seeded pauses as a whole narration;
- **picture checks** and **whole renders**: only on machines the studio owner trusts (renders need a checkout of the studio app).

Your own Mac makes your own videos first: the worker alternates one job for someone else, one of yours
("give one, take one"). It never opens a port: it calls the studio over HTTPS, and files travel by short-lived
presigned URLs.

## Install

```sh
pipx install 'voicecast-worker[pictures,voice,menubar]'
voicecast-worker join <join-token> --server https://voicecast.studio
```

Get the join token from the studio's Developers page ("Join a Mac"), or with `voicecast worker join`. Then run it in a
terminal (`voicecast-worker run`) or from the menu bar (`voicecast-worker menubar`: Pause/Resume, Start at login).

Extras: `pictures` (mflux), `voice` (sonic-forge + Kokoro), `clone` (sonic-forge cloned voices on the Apple GPU),
`menubar` (rumps), `all`.

## When it works

```sh
voicecast-worker settings --gpu-max 35        # only while the GPU is quiet (someone else's model, a game)
voicecast-worker settings --user-idle 300     # only when you've been away 5 minutes
voicecast-worker settings --gpu-share 0.5     # rest as long as it worked
voicecast-worker settings --hours "22:00-08:00"
voicecast-worker pause / resume
voicecast-worker status
voicecast-worker doctor                       # which engines this Mac can run
voicecast-worker leave
```

State lives in `~/.voicecast/worker/` (an older `~/.video-maker-worker/` is still read) (`config.json` with the machine token, `status.json`, `worker.log`).

## Privacy

What a machine may see depends on its trust, set by the join token: a person's own Mac (`self`) only takes their own
jobs; a community Mac only takes public, bite-size jobs, never a cloned voice's reference, a real person's portrait,
a presenter's take or a whole render. Work on a Mac is not encrypted while it runs there; that is why private and
personal work only goes to machines that may see it.
