Private voice transcription server — receive audio, transcribe locally, write clean text.
Project description
Sotto
Sotto voce: in a quiet voice. Your words, captured reliably, processed privately.
Sotto is a lightweight Python server that receives audio uploads, transcribes them locally with Whisper, generates a short title and summary via LLM, and writes clean text output to a configurable location.
Designed to run on hardware you control. Pairs with the sotto mobi iOS app for reliable voice capture.
Quickstart
pip install sotto
sotto init # creates ~/.config/sotto/config.yaml
sotto start # starts receiver + worker on port 8377
Configuration
sotto init
# Edit ~/.config/sotto/config.yaml
sotto start
Key settings:
- storage.output_dir — where completed transcripts are written (default:
~/.local/share/sotto) - pipelines — separate pipelines for private (local LLM) and standard (API) processing
- whisper.model — Whisper model size (default:
large-v3) - whisper.device —
cudaorcpu - auth.tokens — bearer tokens for authenticating uploads from the iOS app
API
Upload audio
POST /upload
Content-Type: multipart/form-data
Authorization: Bearer <token>
file: <audio file>
privacy: "private" | "standard"
Returns: {"uuid": "...", "status": "pending"}
Check job status
GET /jobs/<uuid>
Authorization: Bearer <token>
List jobs
GET /jobs?limit=50&offset=0
Authorization: Bearer <token>
Health check
GET /health
Output
For each completed job, two files are written to output_dir/completed/YYYY/MM/:
<uuid>.txt— clean transcript<uuid>.json— metadata (title, summary, duration, pipeline info)
Prerequisites
- Python 3.11+
- Ollama running separately (for private pipeline)
- Anthropic API key (for standard pipeline)
- CUDA-capable GPU recommended for Whisper transcription
Releases & CI/CD
This project uses a monorepo structure with automated deployments triggered by git tags:
-
iOS (TestFlight): Push a tag starting with ios-v (e.g., git tag ios-v1.0.0) to trigger Xcode Cloud builds.
-
Python (PyPI): Push a tag starting with py-v (e.g., git tag py-v1.0.0) to trigger the GitHub Actions publishing workflow.
Note: Ensure you increment the version number in pyproject.toml before tagging to avoid "Version Already Exists" errors.
License
MIT — Built by Reed Shea. Open source. Private by design.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sotto-0.1.2.tar.gz.
File metadata
- Download URL: sotto-0.1.2.tar.gz
- Upload date:
- Size: 29.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76ac07bd8b5768f28298a95fa0d2d672e20a0ff0953fcdde8023bcfc888d1263
|
|
| MD5 |
8fc120a4caccabae3f6cd587c2dc4836
|
|
| BLAKE2b-256 |
32cf8a08968ab596d15cf464170ca952ca5f90deb654128c3861fea5d39972ea
|
Provenance
The following attestation bundles were made for sotto-0.1.2.tar.gz:
Publisher:
publish.yml on reedshea/sotto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sotto-0.1.2.tar.gz -
Subject digest:
76ac07bd8b5768f28298a95fa0d2d672e20a0ff0953fcdde8023bcfc888d1263 - Sigstore transparency entry: 1059726065
- Sigstore integration time:
-
Permalink:
reedshea/sotto@9b6249c920abe013ada30553b788b3ad11f1ed56 -
Branch / Tag:
refs/tags/py-v0.1.2 - Owner: https://github.com/reedshea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9b6249c920abe013ada30553b788b3ad11f1ed56 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sotto-0.1.2-py3-none-any.whl.
File metadata
- Download URL: sotto-0.1.2-py3-none-any.whl
- Upload date:
- Size: 25.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10e57169a05841a7caa4adf64acc62cbe99d96ad71e9c26780faed894a20e6fe
|
|
| MD5 |
c1ca92bdac0a348105af3a7af284a241
|
|
| BLAKE2b-256 |
fea4e408e3ef724d87aa4c3f0ff88f861899420d6382254504af0fb1a04cace6
|
Provenance
The following attestation bundles were made for sotto-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on reedshea/sotto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sotto-0.1.2-py3-none-any.whl -
Subject digest:
10e57169a05841a7caa4adf64acc62cbe99d96ad71e9c26780faed894a20e6fe - Sigstore transparency entry: 1059726066
- Sigstore integration time:
-
Permalink:
reedshea/sotto@9b6249c920abe013ada30553b788b3ad11f1ed56 -
Branch / Tag:
refs/tags/py-v0.1.2 - Owner: https://github.com/reedshea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9b6249c920abe013ada30553b788b3ad11f1ed56 -
Trigger Event:
push
-
Statement type: