animo is a planned CPU-first text-to-speech service built as a Rust Cargo
workspace. It is the TTS counterpart to aximo: a small production-shaped
wrapper around local inference rather than a demo script around a model.
The initial MVP targets three offline voices:
- Russian: Piper/VITS
ru_RU-dmitri-medium - English: Kokoro
kokoro-int8-multi-lang-v1_1, English speaker - Chinese: Kokoro
kokoro-int8-multi-lang-v1_1, Chinese speaker
The service is designed to run without paid APIs, without GPU requirements, and without committing model artifacts to git.
animo is currently in the design/documentation stage. The repository is being
bootstrapped with the intended API, architecture, model policy, and runtime
contracts before implementation starts.
POST /v1/speechfor TTS synthesisPOST /v1/audio/speechas an OpenAI-compatible aliasGET /v1/voicesfor configured voice metadataGET /v1/capabilitiesfor runtime and model capability metadataGET /health/livefor process livenessGET /health/readyfor model/runtime readinessGET /openapi.jsonfor the OpenAPI schemaGET /docs/for Swagger UIGET /metricsfor Prometheus-compatible metrics
The MVP response format is audio/wav. The request schema keeps a
response_format field so ogg or mp3 can be added later without changing the
client contract.
Example request:
{
"input": "Hello from local text to speech.",
"voice": "en",
"model": "kokoro",
"language": "en",
"response_format": "wav",
"speed": 1.0
}The planned workspace mirrors the boundaries that worked well in aximo:
crates/animo
HTTP service, runtime wiring, docs, metrics, health checks
crates/animo-core
TTS domain types, voice registry, scheduler, text chunking
crates/animo-inference
TtsEngine trait and sherpa-onnx adapters
crates/animo-audio
PCM helpers, WAV encoding, future compressed audio encoding
Models are runtime artifacts and live outside git. The service should load them
from a configured model root such as /var/lib/animo/models or ./var/models.
Initial model choices:
kokoro-int8-multi-lang-v1_1for English and Chinese via sherpa-onnx Kokoro support.vits-piper-ru_RU-dmitri-mediumfor Russian via sherpa-onnx VITS/Piper support.
Every configured voice must expose license and provenance metadata through
GET /v1/voices and GET /v1/capabilities. See
docs/model-licenses.md.
- CPU-first inference with explicit admission limits.
- One loaded model instance has one model execution slot unless configured otherwise.
- Request admission limits are separate from model execution gates.
- Long text is split into bounded sentence chunks before inference.
- Blocking model calls run outside the async runtime.
- Readiness degrades after repeated model/runtime failures.
- Metrics include synthesis latency, generated audio duration, realtime factor, wait time, timeout counts, and active model executions.