Thai speech to text for call recordings
Turn every recorded call into searchable Thai text. QA reads all of them, alerts fire on the words that matter, and a customer's history is a search away.
What the transcript says
A promise to pay
spokenลูกค้ายืนยันว่าจะชำระยอด สามพันสองร้อยบาท ภายในวันที่ ยี่สิบ นี้ ผ่านแอปนะคะ
writtenลูกค้ายืนยันว่าจะชำระยอด 3,200 บาท ภายในวันที่ 20 นี้ ผ่านแอปนะคะ
The written convention puts the amount and the date in digits, which is what a collections rule matches on.
A product name mid-sentence
spokenเรื่องแพ็กเกจ Fiber Max ที่สมัครไปเมื่อวานยังไม่ได้เปิดใช้เลยค่ะ
writtenเรื่องแพ็กเกจ Fiber Max ที่สมัครไปเมื่อวานยังไม่ได้เปิดใช้เลยค่ะ
The English name stays English under both conventions. A vocabulary keeps its spelling consistent across thousands of calls.
A refund request
spokenขอคืนเงินค่าบริการเดือนสิงหาคมจำนวน ห้าร้อยเก้าสิบเก้าบาท ได้ไหมคะ
writtenขอคืนเงินค่าบริการเดือนสิงหาคมจำนวน 599 บาท ได้ไหมคะ
A keyword rule on the word for refund reads the same text a person would, with the amount ready to post.
Every transcript pair on this page is an authored illustration of what the convention option changes, re-checked against live output before publish. The Speech-to-Text page carries the model's own witnessed transcripts of a real recording, with the capture date.
How it fits a contact centre
A contact centre records every call and listens to almost none of them. A QA team samples a handful a week, scores them by ear, and the rest sit in storage until a complaint sends someone digging. Transcription changes the arithmetic. Every call becomes text the moment it ends. A script check reads all of them. A keyword alert fires on the calls that mention a refund, a competitor, or a promise to pay. When a customer calls back, the agent reads the last conversation and skips asking for it again. The transcript keeps what was said in the language it was said in. An English product name inside a Thai sentence survives the trip.
- Send each recording when the call endsPost the file the telephony system already writes, up to 60 minutes. The length is read before the charge. A corrupt recording costs nothing.
- Ask for the written conventionAmounts, dates, and times arrive as digits. The rules that match on them stay simple. Keep the spoken convention for a verbatim record.
- Run your rules over the textScript checks, keyword alerts, and customer search are yours. A vocabulary of up to 50 product and plan names keeps the spelling consistent.
What every recorded call becomes
- 100%
- Script coverage
- A greeting, an identity check, and a closing line are string matches on the transcript. Every call is checked, and the ones that miss a line are the ones QA listens to.
- 0 and 1
- Speakers
- With diarization on, each turn carries a speaker number, counted from 0 by first appearance. A script check finds the agent's turns by their number and their wording.
- Keyword alerts
- Refund, cancel, complaint, a competitor's name: a rule over the transcript raises the call within minutes of it ending, while the customer still remembers it.
- Customer history
- Index the transcripts by customer. The next agent reads the last call before answering, and the customer tells the story once.
The model writes what was said. Scoring, alerts, and routing are rules you write over the text.
A script check, as a wire log
call 2026-09-08T10:14:02+07:00 agent=A17 duration=4:12 greeting ✓ 0.4s สวัสดีค่ะ ... ยินดีให้บริการค่ะ identity ✓ 11.8s ขอทราบเลขบัตรประชาชน 4 ตัวท้าย hold-notice ✗ (no match) closing ✓ 241.9s ขอบคุณที่ใช้บริการค่ะ keywords คืนเงิน @ 96.2s ยกเลิก @ 133.0s flag review: missing hold notice, refund mentioned
Word timestamps give each match its second. A reviewer jumps straight to it. The times shown are illustrative.
What a month of calls costs
| Workload | Audio | Credits |
|---|---|---|
| One call, 4 minutes | 4 min | 33.34 |
| A day, 100 calls | 7 h | 3,334 |
| A month, 2,000 calls | 66,680 credits | |
8.33 credits a minute of audio, billed by the millisecond. The transcript options change nothing.
For developers
The snippets send one recording with the written convention and read the transcript and the credits charged from the response.
AUDIO=$(base64 < meeting.m4a | tr -d '\n')
curl -X POST https://api.paxalabs.com/v1/stt \
--max-time 300 \
-H "Authorization: Bearer $PAXA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"audio\": \"$AUDIO\", \"model\": \"paxa-stt-lite-v1-preview\", \"convention\": \"written\"}"import { readFile } from "node:fs/promises";
const audio = (await readFile("meeting.m4a")).toString("base64");
const response = await fetch("https://api.paxalabs.com/v1/stt", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PAXA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ audio, model: "paxa-stt-lite-v1-preview" }),
// A long recording can run for minutes; give it room.
signal: AbortSignal.timeout(300_000),
});
if (!response.ok) throw new Error(`Transcription failed: ${response.status}`);
const { text, usage } = await response.json();
console.log(text, `${usage.credits} credits`);import base64
import os
import requests
with open("meeting.m4a", "rb") as file:
audio = base64.b64encode(file.read()).decode()
response = requests.post(
"https://api.paxalabs.com/v1/stt",
headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"},
json={"audio": audio, "model": "paxa-stt-lite-v1-preview"},
# A long recording can run for minutes; give it room.
timeout=300,
)
response.raise_for_status()
body = response.json()
print(body["text"], body["usage"]["credits"], "credits")What the model was built to hear
Paxa STT Lite transcribes Thai and English, including sentences that switch language halfway. It labels speaker turns by number on request. It publishes no accuracy figure until the evaluation method is published beside it.
Common questions
- Does the transcript say who spoke?
- It numbers the speakers. Set diarization to true and each turn arrives with a speaker number, counted from 0 by first appearance. No name is attached. Turns come from one pass over the recording. The file must be under 9 minutes, which covers a normal call. A two-channel recording can still be sent as two files.
- What about calls longer than an hour?
- One request takes up to 60 minutes, and under 9 with speaker turns on. Split a longer call at a silence and send the parts in parallel. Each part numbers its speakers from 0.
- Can I search a call by time?
- Ask for word timestamps and every word carries its start and end in seconds. A keyword match then links to the moment it was said.
- What does a failed transcription cost?
- Nothing. The charge is taken first and refunded automatically when the request fails, and a recording the model cannot read is refused before the charge.
Start with free credits
Sign in with Google, GitHub, or Hugging Face and spend 100 one-time free credits on your own text.