Realtime Translation
모든 요금제음성 하나를 보내면 원문 자막과 선택한 언어의 번역을 실시간으로 받습니다.
빠른 시작
-
1
API 키로 연결하기
설정에서 발급한 키로 아래 WebSocket에 연결합니다.
YOUR_API_KEY를 본인 키로 바꿔주세요.wss://extapi.bizcrush.ai/v1/translate/stream?api_key=YOUR_API_KEY -
2
번역할 언어 선택하기
첫 번째 텍스트 프레임으로 아래 JSON을 보냅니다. 한국어 음성을 영어·일본어로 번역하는 예제입니다. 입력 언어를 자동 감지하려면
language_hints를 생략합니다.target_languages에 번역받을 언어를 1–10개 지정합니다.{ "target_languages": ["en", "ja"], "language_hints": ["ko"], "enable_diarization": true } -
3
연결 응답을 기다린 뒤 음성 보내기
{"connected":true}를 받으면 실제 말하는 속도로 오디오를 바이너리 프레임에 담아 보냅니다.PCM16(기본값) 또는 Opus
PCM16: 16 kHz, 모노, little-endian. 프레임당 최대 32,000바이트입니다.
Opus 오디오 보내기
브라우저 WebM/Opus는 아래 설정을 첫 메시지로 보냅니다. 최초 헤더를 포함한 하나의 오디오 녹음을 순서대로 전송하세요. 블록은 여러 WebSocket 메시지로 나눠도 됩니다.
{ "encoding": "opus", "container": "webm", "target_languages": ["en"], "language_hints": ["ko"] }Raw Opus는
"container":"raw"로 설정하고 바이너리 메시지마다 완전한 패킷 하나를 보냅니다. Ogg/Opus는"container":"ogg"로 설정합니다. 모노·스테레오를 받아 16 kHz 모노로 변환합니다. WebM은 Opus 오디오 트랙 하나만 포함해야 합니다.20–100 ms 단위로 실제 재생 속도에 맞춰 보내세요. 메시지당 최대 64 KiB이며 디코딩한 오디오 길이는 1초 이하여야 합니다.
container를 생략하면 Ogg 또는 WebM 헤더를 자동 감지합니다. 용어집과 다른 옵션도 같은 설정에 함께 넣습니다. -
4
자막을 받고 스트림 마무리하기
원문, 번역문, 화자 정보를 받습니다. 같은
id의 자막을 갱신하며, 원문이 확정된 뒤에도 번역이 도착할 수 있습니다.음성이 끝나면 빈 바이너리 프레임이나
{"type":"finish"}를 보냅니다.{"finished":true}까지 읽은 뒤 서버가 연결을 닫도록 기다립니다.
브라우저 마이크: WebM/Opus
stop() 뒤의 마지막 조각까지 순서대로 보내세요. 같은 WebSocket에서 녹음기를 재시작하거나 최초 헤더를 매 조각마다 다시 보내면 안 됩니다.
const mimeType = "audio/webm;codecs=opus";
if (!MediaRecorder.isTypeSupported(mimeType)) throw new Error("Use PCM16 on this browser");
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const recorder = new MediaRecorder(stream, {mimeType});
const ws = new WebSocket("wss://extapi.bizcrush.ai/v1/translate/stream?api_key=YOUR_API_KEY");
let pending = Promise.resolve();
recorder.ondataavailable = ({data}) => {
if (data.size) pending = pending.then(async () => {
const bytes = await data.arrayBuffer();
if (ws.readyState === WebSocket.OPEN) ws.send(bytes);
});
};
recorder.onstop = async () => {
await pending;
if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({type: "finish"}));
stream.getTracks().forEach(track => track.stop());
};
ws.onopen = () => ws.send(JSON.stringify({"encoding": "opus", "container": "webm", "language_hints": ["ko"], "target_languages": ["en"]}));
ws.onmessage = ({data}) => {
const event = JSON.parse(data);
if (event.connected) recorder.start(100);
console.log(event);
};
ws.onclose = () => {
if (recorder.state !== "inactive") recorder.stop();
stream.getTracks().forEach(track => track.stop());
};
// Call recorder.stop() when the user finishes.번역어·동의어 지정
중요한 이름의 인식률을 높이고, 번역문에 사용할 용어를 출력 언어별로 지정할 수 있습니다.
음성 인식 힌트
context_keywords에 고유명사·전문 용어를 넣어 인식을 돕습니다.
지정 번역어
translation_terms로 원문과 번역어를 연결합니다. 출력 언어마다 다른 번역어를 지정할 수 있습니다.
동의어나 띄어쓰기 등 표기 변형을 같은 번역어로 묶으려면 원문별 항목을 만들어 같은 target에 연결합니다.
루미노바에어/루미노바 에어LuminovaAir(en)source- 원문 또는 동의어·표기 변형
target- 번역문에 사용할 지정 표현
target_language- 적용할 출력 언어 코드
번역어를 지정하려면 2단계에서 아래 설정을 첫 프레임으로 보냅니다. 설정은 연결당 한 번만 전송합니다.
{
"target_languages": ["en"],
"translation_terms": [
{"source": "루미노바에어", "target": "LuminovaAir", "target_language": "en"},
{"source": "루미노바 에어", "target": "LuminovaAir", "target_language": "en"}
]
}
여러 출력 언어에 번역어를 지정하는 예제 보기
음성을 보내기 전에 이 전체 설정을 한 번 보냅니다. 항목마다 source, target, 출력 target_language가 필요하며 출력 언어가 하나일 때만 언어를 생략할 수 있습니다. 모델의 용어 선택을 안내하는 기능으로, 원문 자막은 인식한 텍스트를 유지하며 문맥에 따라 번역 표현이 달라질 수 있습니다.
{
"target_languages": [
"en",
"ja"
],
"language_hints": [
"ko"
],
"enable_diarization": true,
"context_keywords": [
"루미노바에어",
"루미노바 에어"
],
"translation_terms": [
{
"source": "루미노바에어",
"target": "LuminovaAir",
"target_language": "en"
},
{
"source": "루미노바 에어",
"target": "LuminovaAir",
"target_language": "en"
},
{
"source": "루미노바에어",
"target": "ルミノバエア",
"target_language": "ja"
},
{
"source": "루미노바 에어",
"target": "ルミノバエア",
"target_language": "ja"
}
]
}
응답 형식·늦게 도착하는 번역 처리
translation_update.translations를 같은 id의 자막에 언어별로 병합합니다. 갱신할 때 먼저 받은 다른 언어의 번역을 유지합니다. translations가 없거나 null이면 빈 맵으로 처리합니다. 이벤트는 connected, chunk, translation_update, pong, finished, error입니다.
{"chunk":{"id":"caption-1","text":"안녕하세요","language":"ko","speaker":"0","is_final":true,"translations":{"en":"Hello"}}}
{"translation_update":{"id":"caption-1","translations":{"ja":"こんにちは"}}}
다른 인증 방식
서버에서는 X-API-Key 헤더를 사용할 수 있습니다. Firebase ID 토큰은 Authorization: Bearer FIREBASE_ID_TOKEN 또는 ?authorization=FIREBASE_ID_TOKEN으로 보냅니다. 음성 API는 Firebase ID 토큰, MCP는 OAuth 액세스 토큰을 사용합니다. 인증 실패는 HTTP 401, 백엔드 사용 불가는 HTTP 503을 반환합니다.
사용 제한·토큰 요금
| 항목 | 제한 |
|---|---|
| 출력 언어 | 연결당 1–10개 |
| 입력 언어 힌트 | 최대 3개 |
| 키워드 / 용어 항목 | 각각 최대 100개 |
| 합산 컨텍스트 | 정규화한 텍스트와 구분자 포함 5,900자 |
| 오디오 프레임 | 최대 32,000바이트 |
| 연결 시간 | 최대 55분 |
연결 후 30초 이내에 첫 오디오를 보내야 합니다. ping으로 이 시간을 연장할 수 없습니다. 무음 중에는 30초 이내 간격으로 {"type":"ping"}을 보내고, 오디오는 경과 시간보다 최대 1초 앞서 보낼 수 있습니다.
최소 1분 과금입니다. 출력 언어가 N개면 첫 유효 오디오에서 100 + 60 × N 토큰을 선차감합니다. 첫 60초 이후에는 시작된 30초마다 50 + 30 × N 토큰을 선차감합니다.
사용자 컨텍스트에 따라 시작 시 추가 요금이 발생할 수 있습니다. 출력 언어마다 100 UTF-8 바이트까지 포함하며, 초과분은 시작된 20바이트당 1토큰입니다. 키워드·용어집의 정확한 계산 방법은 전체 API 참조에서 확인할 수 있습니다.
차감이 확인돼야 번역을 시작합니다. 잔액 부족이나 차감 실패 시 스트림이 종료됩니다. 오디오 없이 종료하면 차감과 제공자 호출이 없습니다.
동시 접속 한도에 도달하면 새 연결에 HTTP 503과 Retry-After를 반환합니다. 지수 백오프와 jitter로 재연결하세요. 기존 스트림은 유지하며 업스트림 전송이 멈추면 오류로 종료됩니다. 완료 여부는 반드시 finished=true로 확인하세요.
모든 요금제에서 사용할 수 있습니다. 최소 1분의 토큰 요금이 적용되며, 회의와 자막은 자동 저장하지 않습니다.
에이전트로 개발하고 있나요? 에이전트용 전체 참조 · OpenAPI JSON
API Key 발급
계정 설정에서 음성·텍스트 번역용 API 키를 최대 5개 생성할 수 있습니다.
Speech-to-Text API
FeaturedSpeech-to-Text API for audio transcription with speaker diarization. Supports file-based (batch) and real-time (streaming) transcription.
나만의 STT 서비스 구축
Use the BizCrush STT API to build your own speech-to-text service. Integrate real-time transcription into your apps, process audio files at scale, or create custom voice-powered workflows — all with speaker diarization and multi-language support.
60개 언어 자동 감지 — 설정 없이 오디오를 보내면 바로 결과를 받을 수 있습니다.
개요
인증
STT, TTS, 실시간 번역은 인증이 필요합니다. X-API-Key 헤더로 API 키를 보내거나, 브라우저 WebSocket을 포함한 요청에서 아래 쿼리 파라미터를 사용합니다.
?api_key=YOUR_API_KEY
API Key는 bizcru.sh/settings에서 발급할 수 있습니다.
Firebase ID 토큰은 Authorization: Bearer FIREBASE_ID_TOKEN 또는 ?authorization=FIREBASE_ID_TOKEN으로 보낼 수 있습니다. 음성 API는 Firebase ID 토큰을 사용하며 MCP는 OAuth 액세스 토큰을 사용합니다.
에이전트·코드 생성용: 전체 API 참조 · OpenAPI JSON.
실시간 STT (WebSocket)
Real-time audio streaming transcription via WebSocket. Send audio chunks and receive interim/final results in real time.
wss://extapi.bizcrush.ai/v1/stt/stream
쿼리 파라미터
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| api_key | string | 인증 방법 중 하나 | 인증 헤더나 Firebase ID 토큰을 보내지 않을 때 필요한 API 키입니다. |
| format | string | 선택 | "json" for JSON text frames, omit for protobuf binary |
| language_hints | string[] | 선택 | Language codes as comma-separated (?language_hints=ko,en) or repeated (?language_hints=ko&language_hints=en). Up to 3; extras dropped. Omit for auto-detection. |
| enable_diarization | string | 선택 | Speaker diarization toggle. "false" to disable; enabled by default. When enabled, each chunk carries a speaker label. |
프로토콜
아래 JSON 프로토콜과 예제는 ?format=json을 사용합니다. encoding과 선택 session_id를 JSON 텍스트 프레임으로 보냅니다. format을 생략하면 설정·각 오디오 청크·빈 종료 마커를 모두 protobuf SessionStreamTranscribeRequest 바이너리 메시지로 보내며 응답은 SessionStreamTranscribeResponse입니다.
| 필드 | 타입 | 설명 |
|---|---|---|
| encoding | string | "pcm16" or "opus" (default: "pcm16") |
| session_id | string | Session identifier (optional, auto-generated if omitted) |
| language_hints | string[] | Optional language codes, e.g. ["ko","en"] or "ko,en". Up to 3 entries; extras dropped. Overrides query param. Omit for auto-detection. |
| enable_diarization | boolean | Speaker diarization toggle (default: true). Overrides the query param. |
| context_keywords | string[] | Domain keywords/terms to bias recognition toward names, jargon, etc., e.g. ["Albert Gee","BizCrush"] or "Albert Gee,BizCrush". Up to 2000 characters total; extras dropped. |
{"encoding": "pcm16", "session_id": "optional-session-id"}
Server responds with connection status
{"connected": true}
Send raw audio as binary WebSocket frames
| 인코딩 | 포맷 | 청크 크기 |
|---|---|---|
| pcm16 | 16kHz, mono, 16-bit little-endian | 640 bytes (20ms) recommended |
| opus | Raw Opus(container: "raw"), Ogg/Opus 또는 WebM/Opus |
Opus frame unit |
Server sends interim and final results as JSON text frames
| 필드 | 타입 | 설명 |
|---|---|---|
| chunk.id | string | Chunk ID — same across interim/final for one utterance, new ID after final |
| chunk.session_id | string | Session ID |
| chunk.text | string | Transcribed text (cumulative — each interim contains full text so far) |
| chunk.is_final | boolean | false: interim result, true: final confirmed result |
| chunk.speaker | string | Speaker label ("0", "1", "2", ...) when diarization is enabled. Omitted when disabled or the speaker is unresolved. |
{"chunk": {"id": "01KMCHP57H31XYZABC", "session_id": "my-session", "text": "Hello, how are you?", "is_final": true, "speaker": "1"}}
When no more audio will be sent, send an empty binary frame (0 bytes) and KEEP THE WEBSOCKET OPEN. The server finalizes any pending utterances (including ones still in interim state), streams the trailing is_final results back, then closes the WebSocket. Closing the WebSocket without this marker drops the trailing finals — WebSocket has no half-close, so once the client closes the server cannot deliver the remaining results. Finalize completes within ~5 seconds after the EOS marker. After the trailing finals the server sends a terminal frame ({"finished": true} for JSON, disconnect_reason=SESSION_ENDED for protobuf) and then closes.
ws.send(b'') # Python
ws.send(new ArrayBuffer(0)); // JavaScript
예제
Python
import asyncio
import json
import websockets
async def live_stt(api_key: str):
url = f"wss://extapi.bizcrush.ai/v1/stt/stream?api_key={api_key}&format=json"
async with websockets.connect(url) as ws:
await ws.send(json.dumps({"encoding": "pcm16"}))
resp = json.loads(await ws.recv())
assert resp["connected"], f"Connection failed: {resp}"
async def send_audio():
with open("audio.pcm", "rb") as f:
while chunk := f.read(640):
await ws.send(chunk)
await asyncio.sleep(0.02)
# End-of-audio marker. DO NOT close the WebSocket here — the
# server needs the connection open to deliver trailing finals.
# The server will close after finalize completes (~5 seconds).
await ws.send(b'')
async def receive_results():
try:
async for msg in ws:
data = json.loads(msg)
if "chunk" in data:
chunk = data["chunk"]
status = "FINAL" if chunk["is_final"] else "interim"
speaker = chunk.get("speaker", "?")
print(f"[{status}] (S{speaker}) {chunk['text']}")
except websockets.exceptions.ConnectionClosed:
pass
await asyncio.gather(send_audio(), receive_results())
asyncio.run(live_stt("YOUR_API_KEY"))
JavaScript (Browser)
const ws = new WebSocket(
"wss://extapi.bizcrush.ai/v1/stt/stream?api_key=YOUR_API_KEY&format=json"
);
ws.onopen = () => {
ws.send(JSON.stringify({ encoding: "pcm16" }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.connected) {
console.log("Connected! Start sending audio...");
}
if (data.chunk) {
const { id, text, is_final, speaker } = data.chunk;
console.log(`[${is_final ? "FINAL" : "interim"}] (S${speaker ?? "?"}) ${text}`);
}
};
// Server closes the WebSocket after delivering trailing finals.
ws.onclose = () => {
console.log("Stream finalized by server");
};
function sendAudioChunk(pcmData) {
if (ws.readyState === WebSocket.OPEN) {
ws.send(pcmData);
}
}
// Call this when you have no more audio to send.
// DO NOT call ws.close() — the server needs the socket open to deliver
// trailing finals, then closes it itself (~5 seconds).
function endStream() {
if (ws.readyState === WebSocket.OPEN) {
ws.send(new ArrayBuffer(0)); // end-of-audio marker
}
}
브라우저 마이크: WebM/Opus
stop() 뒤의 마지막 조각까지 순서대로 보내세요. 같은 WebSocket에서 녹음기를 재시작하거나 최초 헤더를 매 조각마다 다시 보내면 안 됩니다.
const mimeType = "audio/webm;codecs=opus";
if (!MediaRecorder.isTypeSupported(mimeType)) throw new Error("Use PCM16 on this browser");
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const recorder = new MediaRecorder(stream, {mimeType});
const ws = new WebSocket("wss://extapi.bizcrush.ai/v1/stt/stream?format=json&api_key=YOUR_API_KEY");
let pending = Promise.resolve();
recorder.ondataavailable = ({data}) => {
if (data.size) pending = pending.then(async () => {
const bytes = await data.arrayBuffer();
if (ws.readyState === WebSocket.OPEN) ws.send(bytes);
});
};
recorder.onstop = async () => {
await pending;
if (ws.readyState === WebSocket.OPEN) ws.send(new ArrayBuffer(0));
stream.getTracks().forEach(track => track.stop());
};
ws.onopen = () => ws.send(JSON.stringify({"encoding": "opus", "container": "webm", "language_hints": ["ko"]}));
ws.onmessage = ({data}) => {
const event = JSON.parse(data);
if (event.connected) recorder.start(100);
console.log(event);
};
ws.onclose = () => {
if (recorder.state !== "inactive") recorder.stop();
stream.getTracks().forEach(track => track.stop());
};
// Call recorder.stop() when the user finishes.파일 STT
오디오 파일 URL을 전송하면 화자 분리가 포함된 전체 트랜스크립트를 받을 수 있습니다.
완성된 WebM/Opus 녹음 파일을 지원합니다. MediaRecorder의 모든 조각을 하나의 파일로 합쳐 다운로드 가능한 URL을 전달하세요. 중간 조각만으로는 필요한 헤더가 없어 전사할 수 없습니다.
/stt
인증: ?api_key
Transcribe an audio file URL and return the full transcript with speaker diarization.
요청 본문 (JSON)
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| audio_url | string | 필수 | Public audio file URL (signed URL, CDN URL, etc.) |
| session_id | string | 선택 | Session identifier. Auto-generated if omitted |
| enable_diarization | boolean | 선택 | Enable speaker diarization (default: true) |
| language_hints | string[] | 선택 | Language codes, e.g. ["ko","en"] or "ko,en". Up to 3; extras dropped. Omit for auto-detection. Legacy `language_hint` (single string) also accepted. |
| context_keywords | string[] | 선택 | Domain keywords/terms to bias recognition toward names, jargon, etc., e.g. ["Albert Gee","BizCrush"] or "Albert Gee,BizCrush". Up to 2000 characters total; extras dropped. |
응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
| text | string | Full transcript text |
| detected_language | string | Detected language code |
| confidence | float | Average confidence (0~1) |
| utterances | array | Speaker-diarized utterance segments |
| utterances[].speaker | string | Speaker number ("0", "1", "2", ...) |
| utterances[].text | string | Utterance text |
| utterances[].start_ms | integer | Start time (milliseconds) |
| utterances[].end_ms | integer | End time (milliseconds) |
| utterances[].confidence | float | Utterance confidence |
| utterances[].language | string | Utterance language |
응답 예시
{
"text": "Could you introduce yourself and tell us about your role?",
"detected_language": "en",
"confidence": 0.961,
"utterances": [
{
"speaker": "1",
"text": "Could you introduce yourself and tell us about your role?",
"start_ms": 960,
"end_ms": 5400,
"confidence": 0.94,
"language": "en"
},
{
"speaker": "2",
"text": "Sure. My name is Ethan Kim, and I'm CTO of BizCrush.",
"start_ms": 5820,
"end_ms": 9600,
"confidence": 0.96,
"language": "en"
}
]
}
cURL 예시
curl -X POST \
"https://extapi.bizcrush.ai/v1/stt?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"audio_url": "https://example.com/audio.oga", "enable_diarization": true}'
참고: Response time depends on audio length — may take up to several minutes. Set timeout to 600+ seconds.
음성 합성 (TTS)
텍스트를 자연스러운 음성으로 변환하고 서명된 다운로드 URL을 반환합니다 (오디오는 Firebase Storage에 업로드됩니다).
/tts
인증: ?api_key
Generate speech audio from text and return a signed download URL (audio uploaded to Firebase Storage at tts/{session_id}/{message_id}.ogg).
요청 본문 (Protobuf)
application/x-protobuf (request and response are protobuf-encoded SessionTTSRequest / SessionTTSResponse)
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| session_id | string | 필수 | Session identifier |
| message_id | string | 필수 | Message identifier (used in storage path) |
| text | string | 필수 | Text to convert to speech |
응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
| audio_url | string | Signed download URL (Opus / OGG) — valid for several days |
| error | string | Set on failure; audio_url empty |
TTS 지원 언어
음성 합성은 57개 언어로 자연스러운 오디오를 생성합니다. 입력 텍스트에서 언어를 자동으로 감지하므로 별도 설정이 필요 없습니다.
| 코드 | 언어 |
|---|---|
| en | English |
| zh | 中文 |
| hi | हिन्दी |
| es | Español |
| ar | العربية |
| fr | Français |
| pt | Português |
| ru | Русский |
| id | Bahasa Indonesia |
| de | Deutsch |
| ja | 日本語 |
| vi | Tiếng Việt |
| it | Italiano |
| ko | 한국어 |
| th | ภาษาไทย |
| af | Afrikaans |
| hy | Հայերեն |
| az | Azərbaycan |
| be | Беларуская |
| bs | Bosanski |
| bg | Български |
| ca | Català |
| hr | Hrvatski |
| cs | Čeština |
| da | Dansk |
| nl | Nederlands |
| et | Eesti |
| fi | Suomi |
| gl | Galego |
| el | Ελληνικά |
| he | עברית |
| hu | Magyar |
| is | Íslenska |
| kn | ಕನ್ನಡ |
| kk | Қазақ |
| lv | Latviešu |
| lt | Lietuvių |
| mk | Македонски |
| ms | Bahasa Melayu |
| mi | Te Reo Māori |
| mr | मराठी |
| ne | नेपाली |
| no | Norsk |
| fa | فارسی |
| pl | Polski |
| ro | Română |
| sr | Српски |
| sk | Slovenčina |
| sl | Slovenščina |
| sw | Kiswahili |
| sv | Svenska |
| tl | Tagalog |
| ta | தமிழ் |
| tr | Türkçe |
| uk | Українська |
| ur | اردو |
| cy | Cymraeg |
지원 언어
자동 언어 감지가 기본 내장되어 있어 별도 설정이 필요 없습니다. STT 엔진이 60개 언어를 자동으로 감지하고, 대화 중 언어가 바뀌어도 매끄럽게 처리합니다. language_hint를 사용하면 더 빠르게 감지할 수 있습니다.
| 코드 | 언어 |
|---|---|
| en | English |
| zh | 中文 |
| hi | हिन्दी |
| es | Español |
| ar | العربية |
| fr | Français |
| pt | Português |
| ru | Русский |
| id | Bahasa Indonesia |
| de | Deutsch |
| ja | 日本語 |
| vi | Tiếng Việt |
| it | Italiano |
| ko | 한국어 |
| th | ภาษาไทย |
| af | Afrikaans |
| sq | Shqip |
| az | Azərbaycan |
| eu | Euskara |
| be | Беларуская |
| bn | বাংলা |
| bs | Bosanski |
| bg | Български |
| ca | Català |
| hr | Hrvatski |
| cs | Čeština |
| da | Dansk |
| nl | Nederlands |
| et | Eesti |
| fi | Suomi |
| gl | Galego |
| el | Ελληνικά |
| gu | ગુજરાતી |
| he | עברית |
| hu | Magyar |
| kn | ಕನ್ನಡ |
| kk | Қазақ |
| lv | Latviešu |
| lt | Lietuvių |
| mk | Македонски |
| ms | Bahasa Melayu |
| ml | മലയാളം |
| mr | मराठी |
| no | Norsk |
| fa | فارسی |
| pl | Polski |
| pa | ਪੰਜਾਬੀ |
| ro | Română |
| sr | Српски |
| sk | Slovenčina |
| sl | Slovenščina |
| sw | Kiswahili |
| sv | Svenska |
| tl | Tagalog |
| ta | தமிழ் |
| te | తెలుగు |
| tr | Türkçe |
| uk | Українська |
| ur | اردو |
| cy | Cymraeg |
STT 오류 코드
| 상태 | 오류 | 설명 |
|---|---|---|
| 401 | Missing authorization | API key not provided |
| 401 | Invalid API key | Invalid API key |
| 400 | Empty request body | Request body is empty |
| 400 | Missing audio_url | audio_url field missing (File STT) |
| 400 | Missing session_id, message_id, or text | Required TTS field missing |
| 400 | Invalid JSON | JSON parsing failed |
| 500 | TTS generation failed | OpenAI TTS call failed |
| 500 | Storage upload failed | Firebase Storage upload failed |
| 500 | (varies) | Internal server error (transcription failure, etc.) |
| WS 1008 | Auth failure | WebSocket closed with code 1008 on authentication failure |
Text Translation
Translate plain text into multiple target languages with BizCrush AI.
/v1/translate-text
Translate plain-text input while preserving document formatting.
파라미터
| 이름 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| text | str | 필수 | Plain text to translate (up to 100,000 characters by default) |
| target_languages | list[str] | 필수 | Target language codes or names, such as ["ko", "en", "Japanese"] (up to 10) |
| source_language | str | 선택 | Source language code or name (default: auto) |