v1.0.0

Référence API

Intégrez la traduction et la transcription Morlivo dans votre application avec quelques lignes de code.

URL de Base: https://api.morlivo.ai Authentification: Authorization: Bearer mrl_...

Authentification

Toutes les requêtes API nécessitent un jeton Bearer. Obtenez votre clé API depuis le tableau de bord dans Paramètres.

En-tête
Authorization: Bearer mrl_your_api_key_here

Les clés API commencent par mrl_. Gardez-les secrètes. Renouvelez-les depuis le tableau de bord si elles sont compromises.

POST

/v1/translate

Traduisez du texte d'une langue à une autre. La langue source est détectée automatiquement si omise.

Corps de la requête JSON

ChampTypeRequisDescription
textstringouiTexte à traduire
target_languagestringouiCode ISO 639-1 (ex. es, fr, de)
source_languagestringnonDétection automatique si omis
project_idintegernonAppliquer le glossaire et le style du projet
formalitystringnonRegister: formal, informal, or default

Réponse 200

ChampTypeDescription
translated_textstringLe texte traduit
source_languagestringLangue source détectée ou fournie
target_languagestringCode de la langue cible
confidencefloatScore de qualité 0.0 - 1.0
validationobjectRésultats de validation de qualité

Exemples

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!"
Réponse
{
  "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

Transcrivez un fichier audio ou vidéo en texte. Jusqu'à 100 Mo.

Corps de la requête multipart/form-data

ChampTypeRequisDescription
filefileouiFichier audio/vidéo (mp3, wav, mp4, webm, etc.)
languagestringnonCode ISO, détection automatique si omis
project_idintegernonLier à un projet pour le suivi
response_formatstringnonOutput format: json, verbose_json, text, srt, vtt
punctuatebooleannonInclude punctuation (default true)

Réponse 200

ChampTypeDescription
textstringTexte intégralement transcrit
languagestringLangue détectée
duration_secondsfloatDurée audio
confidencefloatScore de qualité 0.0 - 1.0
language_confidencefloatConfidence of auto-detected language (null if language was specified)
segmentsarraySegments horodatés
validationobjectVérifications de qualité

Exemples

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"])
Réponse
{
  "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

Diffusez de l'audio en temps réel et recevez les résultats de transcription en direct.

Connexion

ParamètreTypeRequisDescription
tokenstringouiClé API en paramètre de requête
languagestringnonIndication de la langue source (par ex. en, fr). Détectée automatiquement si omise.

Protocole

Envoyer

Trames audio PCM binaires (16 bits, 16 kHz mono)

Recevoir

Messages JSON avec le champ type : transcript (texte partiel/final), status (événements de session), error

Messages reçus

ChampTypeDescription
typestring"transcript" | "status" | "error"
textstringTexte transcrit (dans les messages de transcription)
is_finalbooleanVrai lorsque le segment est terminé
languagestringCode de langue détecté

Exemples

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())
Exemples de messages
// 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

Diffusez de l'audio dans une langue et recevez le texte traduit dans une autre langue en temps réel. Prend en charge la traduction vocale avec détection automatique de la langue.

Connexion

ParamètreTypeRequisDescription
tokenstringouiClé API en paramètre de requête
target_languagestringouiLangue du texte de sortie (par ex. en, es, fr)
source_languagestringnonLangue de l'audio source. Détectée automatiquement si omise.

Protocole

Envoyer

Trames audio PCM binaires (16 bits, 16 kHz mono)

Recevoir

Messages JSON avec le texte traduit dans target_language. Inclut la transcription du discours original et le résultat traduit.

Messages reçus

ChampTypeDescription
typestring"transcript" | "status" | "error"
textstringTexte traduit dans la langue cible
is_finalbooleanVrai lorsque le segment est terminé
source_languagestringLangue source détectée
target_languagestringCode de la langue cible

Exemples

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())
Exemples de messages
// 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.

Corps de la requête JSON

ChampTypeRequisDescription
languagesobjectouiParticipant ID to language mapping
bridge_languagestringnonHub language, default en
max_participantsintnonMax participants 2-10, default 10
modestringnoninterpreter or inline

Réponse 200

ChampTypeDescription
room_idstringUnique room identifier
statusstringRoom status
languagesobjectParticipant ID to language mapping
bridge_languagestringHub language used for translation
modestringTranslation mode
max_participantsintMaximum number of participants

Exemples

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"
  }'
Réponse
{
  "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.

Connexion

ParamètreTypeRequisDescription
room_idstringouiRoom ID from create room response (path param)
participantstringouiParticipant ID (query param)
tokenstringouiClé API en paramètre de requête

Exemple

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.

Corps de la requête JSON

ChampTypeRequisDescription
participant_idstringouiUnique participant identifier
languagestringouiParticipant's language code

Exemple

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.

Réponse 200

ChampTypeDescription
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

Exemple

curl
curl https://api.morlivo.ai/api/v1/languages \
  -H "Authorization: Bearer mrl_your_key"
Réponse
{
  "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.

Réponse 200

ChampTypeDescription
statusstringsain ou dégradé

Exemple

curl
curl https://api.morlivo.ai/api/v1/health
Réponse
{
  "status": "healthy"
}

Endpoints de Compatibilité

Vous utilisez déjà un autre fournisseur ? Changez une URL et conservez votre code existant. Ces endpoints reproduisent les formats de requête et réponse des principales API de traduction et transcription.

DL

DeepL

Traduction
POST /api/compat/deepl/v2/translate

Remplacement direct pour api-free.deepl.com

G

Google Cloud Translation

Traduction
POST /api/compat/google/v3/projects/{"{p}"}/locations/{"{l}"}:translateText

Remplacement direct pour translation.googleapis.com

A

AWS Translate

Traduction
POST /api/compat/aws/translate

Remplacement direct pour translate.amazonaws.com

OA

OpenAI Whisper

Transcription
POST /api/compat/openai/v1/audio/transcriptions

Remplacement direct pour api.openai.com

DG

Deepgram

Transcription
POST /api/compat/deepgram/v1/listen

Remplacement direct pour api.deepgram.com

Les endpoints de compatibilité acceptent le même format de requête et retournent la même structure de réponse que le fournisseur d'origine. Consultez la documentation de chaque fournisseur pour leurs schémas de requête/réponse.

Erreurs

Toutes les erreurs retournent un objet JSON avec un champ detail.

CodeSignificationQuand cela se produit
400 Requête Invalide Champs requis manquants, texte vide, type de fichier non pris en charge
401 Non Autorisé Clé API manquante ou invalide
403 Interdit Clé API valide mais permissions insuffisantes ou quota dépassé
413 Charge Trop Volumineuse Le fichier dépasse la limite de téléchargement de 100 Mo
429 Limite de Débit Trop de requêtes. Réessayez avec un recul exponentiel.
500 Erreur Interne Erreur serveur inattendue. Contactez le support si elle persiste.
503 Service Indisponible Modèle IA temporairement indisponible (circuit breaker ouvert). Réessayez sous peu.
Format de réponse d'erreur
{
  "detail": "Field 'text' must not be empty."
}
POST

Suppression des PII

Ajoutez la suppression des PII à toute demande de traduction ou de transcription. Spécifiez les types d'entités à détecter et à supprimer.

POST /v1/translate POST /v1/transcribe

Corps de la requête JSON

ChampTypeRequisDescription
textstringouiTexte à traduire
source_languagestringnonDétection automatique si omis
target_languagestringouiCode ISO 639-1 (ex. es, fr, de)
redactstring[]nonTypes d'entités à supprimer (par ex. email, phone, name)

Réponse 200

ChampTypeDescription
translated_textstringTexte traduit avec PII supprimées
source_languagestringLangue source détectée ou fournie
target_languagestringCode de la langue cible
confidencefloatScore de qualité 0.0 - 1.0
redactionsarrayListe des suppressions appliquées (type et remplacement)

Exemples

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]"
Réponse
{
  "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]"}
  ]
}

Types d'entités pris en charge

EntitéDescriptionDétection
email Adresses e-mail Basé sur les motifs (inclus)
phone Numéros de téléphone Basé sur les motifs (inclus)
ssn Numéros de sécurité sociale Basé sur les motifs (inclus)
credit_card Numéros de carte de crédit Basé sur les motifs (inclus)
ip_address Adresses IP Basé sur les motifs (inclus)
name Noms de personnes Propulsé par l'IA (coût supplémentaire)
address Adresses physiques Propulsé par l'IA (coût supplémentaire)
medical Informations médicales Propulsé par l'IA (coût supplémentaire)

Les entités basées sur le format (e-mail, téléphone, SSN, carte de crédit, IP) sont détectées par correspondance de motifs sans coût supplémentaire. Les entités contextuelles (nom, adresse, médical) utilisent la détection propulsée par l'IA et entraînent un léger supplément par requête.

Prêt à intégrer ?

Créez un compte gratuit pour obtenir votre clé API et commencer à traduire.