Khmer speakers prefer voice. We built the API.
កម្ពុជាមានពលរដ្ឋ ១៧ លាននាក់ដែលអក្សរក្នុងភាសារបស់ពួកគេមាន ៧៤ តួ។ មនុស្សភាគច្រើនមិនអាចវាយវានៅលើទូរស័ព្ទរបស់ពួកគេបានទេ។
Cambodia has 17 million people whose alphabet has 74 characters. Most won't type it. Most CAN'T type it on the device they own.
For 17 million people, the keyboard is broken. The fingers are busy holding the phone. The screen is too small. The Latin keyboard layout that the world's app builders ship by default is, for Khmer, a visit to a foreign country every time you want to write a sentence. Even the Khmer-localized layouts that exist on Android and iOS require you to tap through three or four character planes to find a single consonant, then again to land the right vowel mark, then again for the diacritic that turns one word into another. The cognitive cost is real. The time cost is real. The result is the one we measured in our own user research: people don't type. They speak.
So instead, when a friend sends a long message in a Cambodian group chat, the reply is a voice memo. When a doctor takes notes during a clinic visit, it's spoken into a phone. When a delivery driver gets a new instruction from dispatch, it's a voice clip in a Telegram channel. We have surveyed this; we have lived this; the network of Cambodian developers who tested the early versions of this product confirmed it before we wrote a single line of production code. The voice IS the keyboard.
The problem is what happens after the voice gets recorded. To search it, summarize it, route it, transcribe it, translate it — the rest of the software stack still expects text. Every product manager and developer building for Cambodia hits the same wall: there is no production-grade speech-to-text API for Khmer that matches the ergonomics they expect from working with English models. AssemblyAI doesn't ship Khmer. Deepgram doesn't ship Khmer. ElevenLabs doesn't ship Khmer. Google's Speech-to-Text supports Khmer in name only — accuracy on real voicemail audio falls below conversational usefulness, and the surface area is awkward enough that most developers we spoke to had never tried it.
So we built it. TMRONE Cloud v1.3 is live, and today we're opening it up.
What we shipped
The 45-second demo: Khmer audio plays, the playground transcribes in real time, then the same clip flows through POST /api/v1/transcribe from a terminal. Captions are Khmer and English — toggle them with the CC button.
The API surface is OpenAI-shaped. API keys start with tmr_sk_ and live forever in your dashboard until you rotate them. Bearer auth, JSON-enveloped responses, multipart upload for audio. Inputs across MP3, WAV, M4A, OGG, FLAC, OPUS, and the browser microphone via MediaRecorder. The transcribe endpoint returns the text plus per-segment timing — we built it for the developers who already speak the language of speech APIs and want to drop us in next to their other model calls. There is no new vocabulary to learn.
The pricing is familiar. Free tier first — 3 transcribe attempts in the playground without a signup, then a real free plan with monthly quota when you create an account. Paid plans run from Pro at $29 a month for 1,000 requests through Max, Ultra, and Enterprise. Pay-per-use is also live for teams that prefer to top up a wallet instead of subscribing — same tmr_sk_ key, same endpoint, different billing track. The whole flow is gated by a single Khmer-friendly payment path, with cancel-on-payment behavior so a paying customer who clears a failed charge goes back to active status the same minute the payment lands. There is nothing to wait for.
The reliability is real. A 60-second timeout on transcribe with proper 504 processing_timeout UX so your client doesn't hang. Atomic Firestore counters for usage so concurrent calls don't double-count or under-count. Sentry instrumentation across server, edge, and client with structured 5xx envelopes that surface a trace_id you can paste into Sentry directly. Cloudflare WAF in front of every public route. A daily Cloud Scheduler tick that owns subscription lifecycle. Three-email dunning when payments fail, with a Step 16.5 cancel-on-payment so a paying customer who finally clears the failure goes back to active status the same minute the payment lands. Branded 404 and 500 pages so when something does break, you don't drop into the default Next.js shell.
The launch is opinionated. Lighthouse mobile thresholds are CI-gated: Performance ≥ 0.90, Accessibility ≥ 0.95, Best Practices ≥ 0.95, SEO = 1.00. Every PR runs the gate. Static OG cards across LinkedIn, X, Slack, Discord. PostHog cookieless analytics with an 8-event funnel — no cookies, no localStorage, no fingerprinting, memory-only persistence, Do Not Track honored. The privacy page discloses every byte of telemetry we capture. The robots.txt allows GPTBot, Google-Extended, ClaudeBot, CCBot, PerplexityBot, and Anthropic-AI on the marketing surfaces because we want LLMs to know that Khmer speech AI exists. If a developer in Phnom Penh asks an LLM how to transcribe Khmer audio, the LLM should answer with our endpoint.
The status is independent. status.tmrone.cloud is an Upptime-driven status page hosted on a separate GitHub Pages repo with its own DNS record, fully decoupled from the tmrone.cloud Cloudflare zone. Eight probes — landing, pricing, docs, playground, the authenticated API ping, the internal health check, the status page itself, and the NAS webhook bearer-401 contract — all running on a 5-minute cadence. If tmrone.cloud goes down, status.tmrone.cloud doesn't. Incidents render as a banner in the top of every public page; the Firestore rule allowing the read is wide-open public, so the banner ships even if our session-cookie auth has a bad day.
The changelog is hand-curated. Four milestone entries — v1.0, v1.1, v1.2, v1.3 — written in user-facing capability language. RSS, Atom, and JSON Feed are wired up. The next entry will land when we close the v1.4 milestone.
Try it
Try the playground — drop a Khmer audio clip, get a transcript in 3 seconds. No signup.
Get an API key — sign up, create an org, generate a tmr_sk_* key, send your first request in five minutes. The full quickstart is at /docs/quickstart.
Subscribe to the changelog — we ship in milestone batches; the next entry will land in v1.4. RSS, Atom, and JSON Feed are all wired up. If you prefer email, you can subscribe at /blog/subscribe and we will email you when the next release ships, one email per release, no other traffic.
Why we did this
We're a small team. Our goal isn't to be a generic speech API; we will lose that race to companies with bigger model budgets. Our goal is to be the API for Khmer voice — accurate enough for clinic notes, fast enough for live transcription, friendly enough that a developer who has never written a line of speech-recognition code can ship a feature in the time it takes to read this paragraph. That's it. The whole product is in service of that one goal. Every plan tier, every endpoint, every line of documentation, every piece of brand language is calibrated against the question: does this make it easier for someone in Cambodia to ship Khmer voice in their app?
The voice IS the keyboard. We made the API. The rest is up to what you build.
សម្លេងគឺជាក្តារចុច។ The voice IS the keyboard.
— The TMRONE team