Skip to main content

Vocast

Convert articles to audio using local TTS models.

Why

I wanted a way to convert articles into audio that I could stream to my mobile device while on the go. This seemed straightforward enough to build myself and I didn't want to pay for an app.

How

Vocast uses Kokoro for TTS. It can fetch articles from a given URL or local text file. Audio files are saved to ~/.vocast/library. It provides an HTTP server that exposes an RSS feed allowing for podcast apps to discover the converted audio files. You can use Tailscale to allow connections between the server and client devices like your mobile phone. You will need to use a podcast app that does not proxy requests through their own servers as that will prevent the app from connecting to your Vocast server.

Requirements

  • Python 3.10–3.12 (Kokoro does not yet support 3.13). If your default Python is newer, point pipx at a compatible one: pipx install --python python3.12 vocast.
  • espeak-ng on PATH (used by Kokoro as a fallback phonemizer)

ffmpeg is bundled (via imageio-ffmpeg), so the only system dependency is espeak-ng:

sudo dnf install espeak-ng     # Fedora
sudo apt install espeak-ng     # Debian/Ubuntu
brew install espeak-ng         # macOS

Install

The easiest way is pipx, which installs vocast into an isolated environment and puts the command on your PATH so you can run it from anywhere:

pipx install vocast

If you don't have pipx, install into a virtual environment with pip:

python3.12 -m venv .venv && source .venv/bin/activate
pip install vocast

With this option vocast is only available while that venv is active.

The first run downloads the Kokoro weights (~300 MB) and a small spaCy model into the cache. Subsequent runs are immediate.

From source (development)

uv venv && source .venv/bin/activate
uv pip install -e .

Usage

Vocast has subcommands; run vocast --help to see them all.

Add an article to the library

vocast add https://example.com/article    # fetch and synthesize a URL
vocast add notes.txt                      # synthesize a local text file
vocast add ... --title "Custom title"     # override the title
vocast add ... --voice af_bella           # use a different Kokoro voice
vocast add ... --quiet                    # suppress per-chunk progress

URLs are fetched and cleaned with trafilatura. Code blocks (<pre> elements) are stripped before synthesis since they don't translate well to audio. Each entry is stored under ~/.vocast/library/<id>/ as audio.mp3 plus meta.json with title, source URL, duration, and voice.

List the library

vocast list

Serve the library as a podcast feed

vocast serve                                # 127.0.0.1:8080 by default
vocast serve --host 0.0.0.0 --port 8000     # custom host/port

Exposes GET /feed.xml (podcast RSS) and GET /audio/<id>.mp3 (audio enclosures). Long articles are split on sentence boundaries during synthesis and concatenated with short silence between chunks.

Expose the feed to your phone over Tailscale

vocast init

A guided checklist that walks you through installing Tailscale, signing into your tailnet, and proxying vocast serve over HTTPS via tailscale serve. Re-run after each step until it prints your feed URL, then add that URL to a direct-download podcast app (Downcast is confirmed working).

Synthesize directly to a file (skip the library)

vocast synth article.txt              # writes article.mp3
vocast synth article.txt -o out.wav   # WAV output

Metadata

Release files for vocast 0.1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vocast 0.1.6
File Size Uploaded
vocast-0.1.6.tar.gz 219.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vocast 0.1.6
File Interpreter ABI Platform
vocast-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 325.0 kB

Release files / vocast-0.1.6.tar.gz

Download URL vocast-0.1.6.tar.gz
Size 219.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4fb41afcdf169853dc1bf561824ad7adc308f78d64652e63463903e7dbf4284e
BLAKE2b-256 checksum
How to use checksums
90b6920580e1f37db3b40ab78ab5a937609a4c2d218e8bfd50afe1a90d3cd427
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / vocast-0.1.6-py3-none-any.whl

Download URL vocast-0.1.6-py3-none-any.whl
Size 105.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3037e087ba7e38d1c7480db5c730461b5f0b82e97456e14e5249f2d15f7e44dd
BLAKE2b-256 checksum
How to use checksums
a2aac74822ea1ad8beacf172763afa25796ca58958e51b79ca58ad308745d2ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page