v1.0.0

Справочник API

Интегрируйте перевод и транскрипцию Morlivo в ваше приложение с помощью нескольких строк кода.

Базовый URL: https://api.morlivo.ai Аутентификация: Authorization: Bearer mrl_...

Аутентификация

Все запросы к API требуют токен Bearer. Получите API-ключ в панели управления в разделе «Настройки».

Заголовок
Authorization: Bearer mrl_your_api_key_here

API-ключи начинаются с mrl_. Храните их в секрете. Обновляйте через панель управления в случае компрометации.

POST

/v1/translate

Переведите текст с одного языка на другой. Исходный язык определяется автоматически, если не указан.

Тело запроса JSON

ПолеТипОбязательноОписание
textstringдаТекст для перевода
target_languagestringдаКод ISO 639-1 (напр. es, fr, de)
source_languagestringнетОпределяется автоматически, если не указан
project_idintegerнетПрименить глоссарий и стиль проекта
formalitystringнетRegister: formal, informal, or default

Ответ 200

ПолеТипОписание
translated_textstringПереведённый текст
source_languagestringОпределённый или указанный исходный язык
target_languagestringКод целевого языка
confidencefloatОценка качества 0.0 – 1.0
validationobjectРезультаты валидации качества

Примеры

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello, world!",
    "target_language": "es"
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Hello, world!",
        "target_language": "es",
    },
)
data = resp.json()
print(data["translated_text"])
# → "¡Hola, mundo!"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Hello, world!",
      target_language: "es",
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "¡Hola, mundo!"
Ответ
{
  "translated_text": "¡Hola, mundo!",
  "source_language": "en",
  "target_language": "es",
  "confidence": 0.98,
  "validation": {
    "length_ratio": 1.08,
    "language_match": true,
    "passed": true
  }
}
POST

/v1/transcribe

Транскрибируйте аудио- или видеофайл в текст. Поддерживается до 100 МБ.

Тело запроса multipart/form-data

ПолеТипОбязательноОписание
filefileдаАудио-/видеофайл (mp3, wav, mp4, webm и др.)
languagestringнетКод ISO, определяется автоматически, если не указан
project_idintegerнетПривязать к проекту для отслеживания
response_formatstringнетOutput format: json, verbose_json, text, srt, vtt
punctuatebooleanнетInclude punctuation (default true)

Ответ 200

ПолеТипОписание
textstringПолный транскрибированный текст
languagestringОпределённый язык
duration_secondsfloatДлительность аудио
confidencefloatОценка качества 0.0 – 1.0
language_confidencefloatConfidence of auto-detected language (null if language was specified)
segmentsarrayСегменты с временными метками
validationobjectПроверки качества

Примеры

curl
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
  -H "Authorization: Bearer mrl_your_key" \
  -F "file=@meeting.mp3" \
  -F "language=en"
Python
import httpx

with open("meeting.mp3", "rb") as f:
    resp = httpx.post(
        "https://api.morlivo.ai/api/v1/transcribe",
        headers={"Authorization": "Bearer mrl_your_key"},
        files={"file": ("meeting.mp3", f, "audio/mpeg")},
        data={"language": "en"},
    )
data = resp.json()
print(data["text"])
Ответ
{
  "text": "Welcome everyone to today's meeting...",
  "language": "en",
  "duration_seconds": 342.5,
  "confidence": 0.95,
  "language_confidence": 0.95,
  "segments": [
    {"start": 0.0, "end": 3.2, "text": "Welcome everyone"},
    {"start": 3.2, "end": 6.8, "text": "to today's meeting."}
  ],
  "validation": {
    "words_per_minute": 148,
    "repetition_detected": false,
    "passed": true
  }
}
WebSocket

/v1/live/transcribe

Передавайте аудио в реальном времени и получайте результаты транскрибирования в прямом эфире.

Подключение

ПараметрТипОбязательноОписание
tokenstringдаAPI-ключ в качестве параметра запроса
languagestringнетПодсказка исходного языка (например, en, fr). Определяется автоматически, если не указан.

Протокол

Отправить

Двоичные PCM-аудиофреймы (16 бит, 16 кГц, моно)

Получение

Сообщения JSON с полем type: transcript (частичный/окончательный текст), status (события сеанса), error

Получаемые сообщения

ПолеТипОписание
typestring"transcript" | "status" | "error"
textstringТранскрибированный текст (в сообщениях транскрипции)
is_finalbooleanИстина, когда сегмент завершён
languagestringКод обнаруженного языка

Примеры

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key&language=en"
);

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const ctx = new AudioContext({ sampleRate: 16000 });
    const source = ctx.createMediaStreamSource(stream);
    const processor = ctx.createScriptProcessor(4096, 1, 1);

    source.connect(processor);
    processor.connect(ctx.destination);
    processor.onaudioprocess = (e) => {
      const pcm = e.inputBuffer.getChannelData(0);
      const int16 = new Int16Array(pcm.length);
      for (let i = 0; i < pcm.length; i++)
        int16[i] = Math.max(-1, Math.min(1, pcm[i])) * 0x7FFF;
      ws.send(int16.buffer);
    };
  });

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript") {
    console.log(msg.is_final ? "FINAL:" : "partial:", msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_transcribe():
    uri = "wss://live.morlivo.ai/v1/live/transcribe?token=mrl_your_key"
    async with websockets.connect(uri) as ws:
        # Send audio chunks (PCM 16-bit 16kHz mono)
        with open("audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript":
                    print(msg["text"], end="\r" if not msg["is_final"] else "\n")

asyncio.run(live_transcribe())
Примеры сообщений
// Session started
{"type": "status", "message": "session_started"}

// Partial transcript (still speaking)
{"type": "transcript", "text": "Hello every", "is_final": false}

// Final transcript (segment complete)
{"type": "transcript", "text": "Hello everyone, welcome to the meeting.",
 "is_final": true, "language": "en"}

// Session ended
{"type": "status", "message": "session_ended",
 "duration_seconds": 45.2}
WebSocket

/v1/live/translate

Передавайте аудио на одном языке и получайте переведённый текст на другом языке в реальном времени. Поддерживает перевод речи в текст с автоматическим определением языка.

Подключение

ПараметрТипОбязательноОписание
tokenstringдаAPI-ключ в качестве параметра запроса
target_languagestringдаЯзык выходного текста (например, en, es, fr)
source_languagestringнетЯзык исходного аудио. Определяется автоматически, если не указан.

Протокол

Отправить

Двоичные PCM-аудиофреймы (16 бит, 16 кГц, моно)

Получение

Сообщения JSON с переведённым текстом на target_language. Включает как транскрипт оригинальной речи, так и переведённый результат.

Получаемые сообщения

ПолеТипОписание
typestring"transcript" | "status" | "error"
textstringПереведённый текст на целевом языке
is_finalbooleanИстина, когда сегмент завершён
source_languagestringОбнаруженный исходный язык
target_languagestringКод целевого языка

Примеры

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/translate" +
  "?token=mrl_your_key&target_language=es&source_language=en"
);

// Stream microphone audio (same setup as live transcribe)
// ...

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
Python
import asyncio, json, websockets

async def live_translate():
    uri = (
        "wss://live.morlivo.ai/v1/live/translate"
        "?token=mrl_your_key"
        "&source_language=fr&target_language=en"
    )
    async with websockets.connect(uri) as ws:
        with open("french_audio.pcm", "rb") as f:
            while chunk := f.read(4096):
                await ws.send(chunk)
                msg = json.loads(await ws.recv())
                if msg["type"] == "transcript" and msg["is_final"]:
                    print(f"Translation: {msg['text']}")

asyncio.run(live_translate())
Примеры сообщений
// Partial translation
{"type": "transcript", "text": "Hello every",
 "is_final": false, "source_language": "fr", "target_language": "en"}

// Final translated segment
{"type": "transcript",
 "text": "Hello everyone, welcome to the meeting.",
 "is_final": true,
 "source_language": "fr", "target_language": "en"}

// Session summary
{"type": "status", "message": "session_ended",
 "duration_seconds": 120.5}
POST

/v1/live/rooms

Create a multi-participant translation room. Each participant speaks their own language and receives translated text from other participants.

Тело запроса JSON

ПолеТипОбязательноОписание
languagesobjectдаParticipant ID to language mapping
bridge_languagestringнетHub language, default en
max_participantsintнетMax participants 2-10, default 10
modestringнетinterpreter or inline

Ответ 200

ПолеТипОписание
room_idstringUnique room identifier
statusstringRoom status
languagesobjectParticipant ID to language mapping
bridge_languagestringHub language used for translation
modestringTranslation mode
max_participantsintMaximum number of participants

Примеры

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
    "bridge_language": "en",
    "mode": "interpreter"
  }'
Ответ
{
  "room_id": "room_abc123",
  "status": "active",
  "languages": {"alice": "en", "bob": "fr", "carlos": "es"},
  "bridge_language": "en",
  "mode": "interpreter",
  "max_participants": 10
}
WebSocket

/v1/live/speech/{room_id}

Connect a participant to a room for real-time speech translation.

Подключение

ПараметрТипОбязательноОписание
room_idstringдаRoom ID from create room response (path param)
participantstringдаParticipant ID (query param)
tokenstringдаAPI-ключ в качестве параметра запроса

Пример

JavaScript
const ws = new WebSocket(
  "wss://live.morlivo.ai/v1/live/speech/room_abc123" +
  "?token=mrl_your_key&participant=alice"
);

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript" && msg.is_final) {
    console.log(`[${msg.source_language} → ${msg.target_language}]`);
    console.log(msg.text);
  }
};
POST

/v1/live/rooms/{room_id}/participants

Add a participant to an existing room after creation.

Тело запроса JSON

ПолеТипОбязательноОписание
participant_idstringдаUnique participant identifier
languagestringдаParticipant's language code

Пример

curl
curl -X POST https://api.morlivo.ai/api/v1/live/rooms/room_abc123/participants \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "participant_id": "diana",
    "language": "de"
  }'
GET

/v1/languages

List all supported languages with locale, name, and availability status.

Ответ 200

ПолеТипОписание
languagesarrayList of supported languages
languages[].localestringLocale code e.g. fr-CA
languages[].namestringEnglish name
languages[].native_namestringNative name
languages[].countrystringCountry/region
languages[].statusstringga or beta

Пример

curl
curl https://api.morlivo.ai/api/v1/languages \
  -H "Authorization: Bearer mrl_your_key"
Ответ
{
  "languages": [
    {"locale": "en-US", "name": "English", "native_name": "English", "country": "United States", "status": "ga"},
    {"locale": "fr-CA", "name": "French", "native_name": "Français", "country": "Canada", "status": "ga"},
    {"locale": "sw-KE", "name": "Swahili", "native_name": "Kiswahili", "country": "Kenya", "status": "beta"}
  ]
}
GET

/v1/health

Check API status and database health. No authentication required.

Ответ 200

ПолеТипОписание
statusstringисправен или деградирован

Пример

curl
curl https://api.morlivo.ai/api/v1/health
Ответ
{
  "status": "healthy"
}

Конечные точки совместимости

Уже используете другого провайдера? Измените один URL и сохраните свой существующий код. Эти конечные точки повторяют форматы запросов и ответов основных API перевода и транскрипции.

DL

DeepL

Перевод
POST /api/compat/deepl/v2/translate

Прямая замена для api-free.deepl.com

G

Google Cloud Translation

Перевод
POST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText

Прямая замена для translation.googleapis.com

A

AWS Translate

Перевод
POST /api/compat/aws/translate

Прямая замена для translate.amazonaws.com

OA

OpenAI Whisper

Транскрипция
POST /api/compat/openai/v1/audio/transcriptions

Прямая замена для api.openai.com

DG

Deepgram

Транскрипция
POST /api/compat/deepgram/v1/listen

Прямая замена для api.deepgram.com

Конечные точки совместимости принимают тот же формат запроса и возвращают ту же структуру ответа, что и оригинальный провайдер. Обращайтесь к документации каждого провайдера за схемами запросов и ответов.

Ошибки

Все ошибки возвращают JSON-объект с полем detail.

КодЗначениеКогда это происходит
400 Неверный запрос Отсутствуют обязательные поля, пустой текст, неподдерживаемый тип файла
401 Не авторизован Отсутствует или недействителен API-ключ
403 Запрещено API-ключ действителен, но недостаточно прав или превышена квота
413 Слишком большой запрос Файл превышает ограничение загрузки в 100 МБ
429 Превышен лимит запросов Слишком много запросов. Повторите попытку с экспоненциальной задержкой.
500 Внутренняя ошибка Непредвиденная ошибка сервера. Обратитесь в службу поддержки, если проблема сохраняется.
503 Сервис недоступен Модель ИИ временно недоступна (сработал автоматический выключатель). Повторите попытку позже.
Формат ответа об ошибке
{
  "detail": "Field 'text' must not be empty."
}
POST

Редактирование PII

Добавьте редактирование PII к любому запросу перевода или транскрибирования. Укажите, какие типы сущностей обнаруживать и редактировать.

POST /v1/translate POST /v1/transcribe

Тело запроса JSON

ПолеТипОбязательноОписание
textstringдаТекст для перевода
source_languagestringнетОпределяется автоматически, если не указан
target_languagestringдаКод ISO 639-1 (напр. es, fr, de)
redactstring[]нетТипы сущностей для редактирования (например, email, phone, name)

Ответ 200

ПолеТипОписание
translated_textstringПереведённый текст с редактированной PII
source_languagestringОпределённый или указанный исходный язык
target_languagestringКод целевого языка
confidencefloatОценка качества 0.0 – 1.0
redactionsarrayСписок применённых редактирований (тип и замена)

Примеры

curl
curl -X POST https://api.morlivo.ai/api/v1/translate \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Contact John Smith at john@example.com or 555-123-4567",
    "source_language": "en",
    "target_language": "fr",
    "redact": ["email", "phone", "name"]
  }'
Python
import httpx

resp = httpx.post(
    "https://api.morlivo.ai/api/v1/translate",
    headers={"Authorization": "Bearer mrl_your_key"},
    json={
        "text": "Contact John Smith at john@example.com or 555-123-4567",
        "source_language": "en",
        "target_language": "fr",
        "redact": ["email", "phone", "name"],
    },
)
data = resp.json()
print(data["translated_text"])
# → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
JavaScript
const resp = await fetch(
  "https://api.morlivo.ai/api/v1/translate",
  {
    method: "POST",
    headers: {
      "Authorization": "Bearer mrl_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      text: "Contact John Smith at john@example.com or 555-123-4567",
      source_language: "en",
      target_language: "fr",
      redact: ["email", "phone", "name"],
    }),
  }
);
const data = await resp.json();
console.log(data.translated_text);
// → "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]"
Ответ
{
  "translated_text": "Contactez [NAME_REDACTED] à [EMAIL_REDACTED] ou [PHONE_REDACTED]",
  "source_language": "en",
  "target_language": "fr",
  "confidence": 0.95,
  "redactions": [
    {"type": "name", "replacement": "[NAME_REDACTED]"},
    {"type": "email", "replacement": "[EMAIL_REDACTED]"},
    {"type": "phone", "replacement": "[PHONE_REDACTED]"}
  ]
}

Поддерживаемые типы сущностей

СущностьОписаниеОбнаружение
email Адреса электронной почты На основе шаблонов (включено)
phone Номера телефонов На основе шаблонов (включено)
ssn Номера социального страхования (SSN) На основе шаблонов (включено)
credit_card Номера кредитных карт На основе шаблонов (включено)
ip_address IP-адреса На основе шаблонов (включено)
name Имена людей На основе AI (дополнительная стоимость)
address Физические адреса На основе AI (дополнительная стоимость)
medical Медицинская информация На основе AI (дополнительная стоимость)

Сущности на основе формата (email, телефон, SSN, кредитная карта, IP) обнаруживаются с помощью сопоставления шаблонов без дополнительной оплаты. Контекстные сущности (имя, адрес, медицинские данные) используют обнаружение на основе AI и подлежат небольшой дополнительной оплате за запрос.

Готовы к интеграции?

Создайте бесплатный аккаунт, чтобы получить API-ключ и начать переводить.