Two routes.
One answer each.
Send text and get a WAV file back. Send audio and get the Kreyòl text back. Every call answers directly, with no job to poll.
You need an API key
Make a key in your dashboard, under API keys, and send it with every request: Authorization: Bearer lb_…. A key is shown only once; you can have up to 10 and revoke any of them at any time. Keep it secret: call the API from your server, never from a web page. Each address is also limited to 90 text requests and 30 transcriptions every ten minutes.
For AI assistants and code generators
The same documentation as plain files an AI assistant can read in one go: give it the first link and it can write working code for you.
- https://www.lambbi.xyz/llms-full.txt · the whole API in Markdown, with examples
- https://www.lambbi.xyz/openapi.json · OpenAPI 3.1 schema, for tools and SDK generators
- https://www.lambbi.xyz/llms.txt · a short index (llms.txt)
Pricing
1 credit a minute of audio.
1 credit = 1 minute of audio = 2 HTG, billed by the second: text to speech counts the seconds of audio it makes, speech to text the seconds it hears (at most 120 per request). Every account's 5 free minutes each month (Haiti time) are used first; they are shared with your assistants and the Studio. A request that fails is not charged. Add credit with MonCash or a card in your dashboard.
What each request cost
X-Charged-Seconds header
Seconds of audio billed: made (text to speech) or heard (speech to text).
X-Credits-Used header
Credits this request took; 0 while it fits in your free minutes.
X-Credits-Left header
Credits left on your account.
X-Free-Seconds-Left header
Free seconds left on your account this month.
Both routes send these headers. Speech to text also returns the same numbers in its JSON, as charged.
Text to speech
POST /api/tts
Reads one piece of Kreyòl with Fatiman and answers with audio/wav, 24 kHz, 16-bit, mono. The response headers say how long the audio is (X-Audio-Seconds), how long it took to make (X-Made-Ms) and the settings used (X-Settings).
text string, required
Up to 1,200 characters. Numbers, dates, times, prices, percentages, phone numbers and web addresses are spelled out the way they are said.
voice string
One of female1, female2, female3, female4, female5, female6, man1, man2, man3, nouvo1, nouvo2, nouvo3, nouvo4. Default female1. nouvo1 to nouvo4 are Gason 4 to 7: new voices made from the Fatiman men's voices, which belong to no real person.
continues boolean
The text carries on a sentence you cut at a comma, so the voice does not read it as a new sentence. Default false.
model string
v1 (default), v2 (trained on real human voices only) or v3, the newest and the most natural in our tests. The X-Model response header says which one read it.
temperature number
Number, 0.1 to 1. How freely the voice reads: lower is more even. Default 0.7 for v1 and v2, 0.3 for v3.
lsd_steps integer
Whole number, 1 to 8. Steps per sound; more is slower. Default 1.
eos_threshold number
Number, −6 to 2. When the voice decides the text is over: lower ends sooner and can cut the last word, higher waits longer. Default −4.
cfg number
Number, 1 to 3. Above 1 the voice follows the text more closely, in about twice the time. Default 1.
pause_ms integer
Whole number, 0 or 100 to 2000. Longer silences are shortened to this; 0 keeps every pause. Default 300.
A value outside its range is brought to the nearest end.
Voices
| id | Name | Gender | Character |
|---|---|---|---|
female1 | Fanm 1 | Woman | Clear, even |
female2 | Fanm 2 | Woman | Lively |
female3 | Fanm 3 | Woman | Soft |
female4 | Fanm 4 | Woman | Low, very steady |
female5 | Fanm 5 | Woman | Clear, bright |
female6 | Fanm 6 | Woman | Calm |
man1 | Gason 1 | Man | Bright |
man2 | Gason 2 | Man | Deep |
man3 | Gason 3 | Man | Warm, steady |
nouvo1 | Gason 4 | Man | Deep, calmnew voice |
nouvo2 | Gason 5 | Man | Clear, naturalnew voice |
nouvo3 | Gason 6 | Man | Lightnew voice |
nouvo4 | Gason 7 | Man | Firmnew voice |
Models: v1 (default), v2 and v3. Each reads with its own default temperature: 0.7 for v1 and v2, 0.3 for v3.
Response headers
X-Audio-Seconds header
Length of the audio, in seconds.
X-Made-Ms header
How long the voice took to make it, in milliseconds.
X-Model header
The model that read it: v1, v2 or v3.
X-Settings header
The reading settings actually used, as JSON, after out-of-range values were brought to the nearest end.
curl -X POST https://www.lambbi.xyz/api/tts \
-H "Authorization: Bearer $LAMBBI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Bonjou! Ki jan ou ye jodi a?", "voice": "female1", "model": "v3"}' \
-o bonjou.wavLong text. Send long text in pieces, starting with a short one, and play each piece as it arrives. The voice is generated about twice as fast as it plays, so listeners hear the first words in about a second and a half, with no gaps after. The Studio works exactly this way.
Speech to text
POST /api/asr
Writes down the Kreyòl in an audio file with Oswald-ASR-0.6-V3. Send the file as the request body with its Content-Type, or as a multipart form field named file. WAV, MP3, M4A, OGG and WebM all work, up to 25 MB; the first two minutes are heard.
Request
body / file audio file, required
The audio as the raw body with its Content-Type (audio/wav, audio/mpeg, audio/mp4, audio/ogg, audio/webm…), or a multipart upload with the file in a field named file. At most 25 MB; the first two minutes are heard.
?punctuate 0 | 1
0 returns the text exactly as heard, about a second sooner. By default punctuation and capitals are added, without changing any word.
?correct 0 | 1
1 also corrects the words Oswald misheard, the spelling and words said twice. A correction that rewrites more than 40% of the words is not used.
?translate en | fr | es
Also translate the transcript into English, French or Spanish.
Response (JSON)
text string
What was said, in Kreyòl spelling, with punctuation and capitals added by Lambbi AI (DeepSeek); the words are always exactly Oswald's. Empty when nothing was heard.
heard string
What Oswald wrote, without punctuation. The same as text when punctuation is off or was not added.
punctuated boolean
Whether punctuation was added (not with ?punctuate=0).
corrected boolean
Whether text was auto-corrected (with ?correct=1); heard keeps what Oswald wrote.
translation string | null
With ?translate=en, fr or es: text translated into English, French or Spanish by Lambbi AI (DeepSeek). null if the translation failed; absent without translate.
translatedTo string
The language of translation, when one was asked for.
seconds number
How much audio was heard.
ms number
How long it took on the server, punctuation, correction and translation included.
maxSeconds number
The most audio heard per request, in seconds (120).
charged object
What the request cost: seconds billed and credits used, then creditsLeft and freeSecondsLeft on your account.
# the file as the body, with its type
curl -X POST "https://www.lambbi.xyz/api/asr?correct=1&translate=en" \
-H "Authorization: Bearer $LAMBBI_API_KEY" \
-H "Content-Type: audio/mp4" \
--data-binary @recording.m4a
# or as a form upload
curl -X POST "https://www.lambbi.xyz/api/asr" \
-H "Authorization: Bearer $LAMBBI_API_KEY" \
-F file=@recording.m4a{
"text": "Doktè, ou ka esplike m ankò diferans ant timè benin ak timè malfezan?",
"heard": "doktè ou ka esplike m ankò diferans ant timè benin ak timè malfezan",
"punctuated": true,
"corrected": true,
"translation": "Doctor, can you explain to me again the difference between a benign tumor and a malignant tumor?",
"translatedTo": "en",
"seconds": 5.2,
"ms": 3371,
"maxSeconds": 120,
"charged": {
"seconds": 5.2,
"credits": 0,
"creditsLeft": 25,
"freeSecondsLeft": 287
}
}Errors and timing
400 / 405 / 413 your request
The body or a parameter was not what the route expects, the method was not POST, or the text or file was too long. The body is JSON, {"error": "…"}, and says which.
401 no key
No API key ("code": "no_key"), or a key that is not valid or was revoked ("code": "bad_key"). Send Authorization: Bearer lb_… with a key from your dashboard.
402 no credit
Your free minutes and credit have run out ("code": "no_credit"). Add credit in your dashboard. Requests sent at the same moment can take your credit slightly below zero; the next one then gets 402.
429 too many
Wait the seconds in Retry-After.
502 / 504 our side
The speech service failed or took too long. The first call after about five quiet minutes starts a machine and loads the models, which can take up to 30 seconds: use a timeout of at least 60 seconds and try again once.