Spaces:
Paused
Paused
| title: Kasanoma Api | |
| emoji: 🔥 | |
| colorFrom: gray | |
| colorTo: green | |
| sdk: docker | |
| pinned: false | |
| # 🔥 Kasanoma TTS API | |
| A ready‑to‑use text‑to‑speech API powered by a **custom Twi voice** (Kofi). | |
| Send text → get a `.wav` file back, hosted on Hugging Face. | |
| Base URL: `https://michsethowusu-kasanoma-api.hf.space` | |
| --- | |
| ## 📡 Endpoints | |
| | Method | Path | Description | | |
| |--------|----------------------------------|---------------------------------| | |
| | `POST` | `/api/v1/synthesize` | Synthesize speech from text | | |
| | `GET` | `/api/v1/synthesize/{filename}` | Download a generated audio file | | |
| | `GET` | `/api/healthcheck` | Public health check | | |
| --- | |
| ## ✨ Synthesize speech | |
| Send a `POST` request with a JSON body. The response includes the audio **encoded as base64** – no second request is necessary. | |
| ### Request Body | |
| ```json | |
| { | |
| "text": "Mema wo akwaaba!", | |
| "local": "twi_GH", | |
| "voice": "kofi-medium", | |
| "silence": 1, | |
| "speed": 1.0, | |
| "noise_w": 0.8, | |
| "effects": [], | |
| "lite_file": true | |
| } | |
| ``` | |
| | Field | Type | Required | Default | Description | | |
| |-------------|---------|----------|-------------------|-------------| | |
| | `text` | string | **yes** | – | The text to speak | | |
| | `local` | string | no | `twi_GH` | Language code (must match the `.onnx` filename) | | |
| | `voice` | string | no | `kofi-medium` | Voice name (file = `{local}-{voice}.onnx`) | | |
| | `silence` | number | no | `1` | Seconds of silence between sentences | | |
| | `speed` | number | no | `1.0` | Speed factor | | |
| | `noise_w` | number | no | `0.8` | Noise weight | | |
| | `effects` | array | no | `[]` | Audio effects to apply (see below) | | |
| | `lite_file` | boolean | no | `true` | Convert output to 16‑bit mono WAV (recommended) | | |
| ### Response (200 OK) | |
| ```json | |
| { | |
| "filename": "abc123.wav", | |
| "url": "/api/v1/synthesize/abc123.wav", | |
| "audio_base64": "UklGRi... (base64-encoded WAV)" | |
| } | |
| ``` | |
| The **`audio_base64`** field contains the raw audio data. | |
| Simply decode it to get the WAV file – no additional download required. | |
| --- | |
| ## 🎚️ Audio Effects (optional) | |
| You can chain multiple effects. Each effect object has `name` and `params`. | |
| | Effect | Parameters (defaults) | | |
| |-------------------------------|-----------------------| | |
| | `flanger` | `rate` (0.15), `min_delay` (0.0025), `max_delay` (0.0035), `feedback` (0.9), `t_offset` (0), `dry` (0.5), `wet` (0.5) | | |
| | `pitch_shift` | `pitch_change` (-100 to +100, default 0) | | |
| | `random_semitone_sawtooth_wave` | `min_freq` (170), `max_semitones` (6), `pitch_duration` (0.4), `wet` (0.3) | | |
| | `normalize` | *(none)* | | |
| | `speed_change` | `speed` (positive = faster, negative = slower, e.g. 0.25 = 25% faster) | | |
| Example with a pitch shift and normalization: | |
| ```json | |
| { | |
| "text": "Ɛte sɛn?", | |
| "effects": [ | |
| {"name": "pitch_shift", "params": {"pitch_change": 8}}, | |
| {"name": "normalize", "params": {}} | |
| ] | |
| } | |
| ``` | |
| --- | |
| ## 🔐 Authentication | |
| This Space is protected by **HTTP Basic Auth**. | |
| You must include the following credentials in every request: | |
| - **Username:** `piper` | |
| - **Password:** `kasanoma` (this is the current API key) | |
| **Example with curl:** | |
| ```bash | |
| curl -u piper:kasanoma \ | |
| -X POST "https://michsethowusu-kasanoma-api.hf.space/api/v1/synthesize" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"text": "Mema wo akwaaba", "local": "twi_GH", "voice": "kofi-medium"}' | |
| ``` | |
| If the API key changes in the future, update the password accordingly. | |
| --- | |
| ## 🧪 Usage Examples | |
| ### curl (with auth) | |
| ```bash | |
| curl -u piper:kasanoma \ | |
| -X POST "https://michsethowusu-kasanoma-api.hf.space/api/v1/synthesize" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{"text": "Me din de Kofi", "lite_file": true}' | |
| ``` | |
| The response contains `audio_base64`. Decode it to get the WAV file: | |
| ```bash | |
| # Extract audio_base64 from JSON (using jq) and decode | |
| curl -u piper:kasanoma ... | jq -r '.audio_base64' | base64 -d > output.wav | |
| ``` | |
| ### Python (using base64, with auth) | |
| ```python | |
| import requests | |
| import base64 | |
| BASE = "https://michsethowusu-kasanoma-api.hf.space" | |
| auth = ("piper", "kasanoma") | |
| payload = { | |
| "text": "Mema wo akwaaba!", | |
| "local": "twi_GH", | |
| "voice": "kofi-medium", | |
| "lite_file": True | |
| } | |
| resp = requests.post(f"{BASE}/api/v1/synthesize", json=payload, auth=auth) | |
| data = resp.json() | |
| # Decode the base64 audio and save | |
| audio_bytes = base64.b64decode(data["audio_base64"]) | |
| with open("output.wav", "wb") as f: | |
| f.write(audio_bytes) | |
| print("Saved to output.wav") | |
| ``` | |
| ### 📄 Ready‑made example script | |
| The repository includes a fully working script: **[`test.py`](test.py)**. | |
| It generates **five long Twi sentences** and saves them as `output_twi_1.wav` … `output_twi_5.wav`. | |
| Just run: | |
| ```bash | |
| python3 test.py | |
| ``` | |
| --- | |
| ## 🗣️ Available Voices | |
| | Voice | File | `local` | `voice` | | |
| |---------------|-------------------------------------------|------------|----------------| | |
| | Kofi (Twi) | `twi_GH-kofi-medium.onnx` | `twi_GH` | `kofi-medium` | | |
| *(More voices can be added by placing additional `.onnx` + `.json` files in the Space’s repository.)* | |
| --- | |
| ## 🩺 Health Check | |
| ```bash | |
| curl https://michsethowusu-kasanoma-api.hf.space/api/healthcheck | |
| # → {"status":"ok"} | |
| ``` | |
| --- | |
| ## 🛠️ Notes for developers | |
| - All API routes (except `/api/healthcheck`) require HTTP Basic Auth. | |
| - Audio is returned directly as **base64** inside the JSON response – there is no need to perform a second download request. | |
| - The `test.py` script in this repo is a complete example that uses the current API key and demonstrates the entire flow. | |
| ``` | |