zeekayandHanzo Dev 005298be18 ci: the gate is a build stage, so it fails only for reasons in the code
Neither earlier form published 0.1.1. A bare `uv` depends on how the runner
image happens to be built; `docker run -v "$PWD":/w` depends on the runner
sharing a filesystem with the docker daemon, and under docker-in-docker that
path resolves on the HOST — the container mounts an empty directory and the
suite cannot even find pyproject.toml.

`docker build --target test` has neither dependency, and building an image is
the one thing this lane is already known to do.

The stage sits ABOVE the weight bake: the suite stubs both model calls, so it
needs no weights, and a contract break is now caught before 350MB is downloaded
rather than after. Verified locally — 18 passed in 1.83s, 4.5s of build.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-07 16:23:13 -07:00

speech

CPU speech for the Hanzo platform: STT (faster-whisper, CTranslate2 int8) and TTS (kokoro-onnx, 82M) behind one OpenAI-shaped surface.

Routes

  • POST /v1/audio/transcriptions — multipart file + model (+language, response_format) → {"text": …}
  • POST /v1/audio/speech — {model, input, voice, response_format} → audio bytes (mp3 default, wav native)
  • GET /v1/models, GET /healthz

Trust model

No auth of its own, in-cluster only. api.hanzo.ai fronts it through the ai plane, which authenticates and meters every caller — a provider row pointing at http://speech.hanzo.svc/v1 is the whole integration. Weights bake into the image at build; the container boots without the network.

Run

uv sync && uv run uvicorn main:app --port 8000

Phase 2 is /v1/realtime: websocket full-duplex (silero-vad segmentation, partial transcripts, kokoro frames, barge-in) plus camera-frame relay into the multimodal models.

S
Description
CPU speech service: STT (faster-whisper) + TTS (kokoro) behind api.hanzo.ai /v1/audio
Readme Apache-2.0
361 KiB
Languages
Go 98.8%
Dockerfile 1.2%