Prochainement Recevoir une notification
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 Auth: Authorization: Bearer mrl_...

Authentification

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

En-tête
Authorization: Bearer mrl_your_api_key_here

Les clés API commencent par mrl_. Gardez-les secrets. Faites-les pivoter depuis le tableau de bord s’ils sont compromis.

POST

/v1/translate

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

Corps de la requête JSON

ChampTypeRequisDescription
textstringouiTexte à traduire
target_languagestringouiCode ISO 639-1 (ex. es, fr, de)
source_languagestringnonDétecté automatiquement si omis
project_idintegernonAppliquer le glossaire et le style du projet
formalitystringnonRegistre : formel, informel ou par défaut

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 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. Prend en charge jusqu'à 100 Mo.

Corps de la requête multipart/form-data

ChampTypeRequisDescription
filefileouiFichier audio/vidéo (mp3, wav, mp4, webm, etc.)
languagestringnonCode ISO, détecté automatiquement si omis
project_idintegernonLier à un projet pour le suivi
response_formatstringnonFormat de sortie : json, verbose_json, text, srt, vtt
punctuatebooleannonInclure la ponctuation (par défaut : vrai)

Réponse 200

ChampTypeDescription
textstringTexte intégralement transcrit
languagestringLangue détectée
duration_secondsfloatDurée de l'audio
confidencefloatScore de qualité 0,0 - 1,0
language_confidencefloatConfiance de la langue détectée automatiquement (nulle si la langue a été spécifiée)
segmentsarraySegments horodatés
validationobjectContrôles 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 comme paramètre de requête
languagestringnonIndice de langue source (par exemple, en, fr). Détecté automatiquement en cas d'omission.

Protocole

Envoyer

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

Recevoir

Messages JSON avec champ de type : transcription (texte partiel/final), statut (événements de session), erreur

Messages reçus

ChampTypeDescription
typestring"transcript" | "status" | "error"
textstringTexte transcrit (sur 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 du texte traduit dans une autre langue en temps réel. Prend en charge la traduction parole-texte avec détection automatique de la langue.

Connexion

ParamètreTypeRequisDescription
tokenstringouiClé API comme paramètre de requête
target_languagestringouiLangue du texte de sortie (par exemple, en, es, fr)
source_languagestringnonLangue audio source. Détecté automatiquement en cas d'omission.

Protocole

Envoyer

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

Recevoir

Messages JSON avec texte traduit en langue_cible. Comprend à la fois la transcription du discours original et la sortie traduite.

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

/api/v1/live/shared-device/token

Créez un jeton partagé à durée de vie courte, puis ouvrez l’URL WebSocket renvoyée. Aucun pré-provisionnement de salle ni routage collant n’est requis.

Corps de la requête JSON

ChampTypeRequisDescription
languagesobjectouiID du participant et mappage linguistique
max_participantsintnonNombre maximum de participants 2 à 10, par défaut 10
modestringnoninterprète ou en ligne

Réponse 200

ChampTypeDescription
tokenstringJeton WebSocket signé à durée de vie courte
ws_urlstringURL WebSocket d'appareil partagé sans salle
session_idstringIdentifiant de session éphémère
participant_idstringID de participant généré

Exemples

curl
curl -X POST https://api.morlivo.ai/api/v1/live/shared-device/token \
  -H "Authorization: Bearer mrl_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "language_a": "en",
    "language_b": "es"
  }'
Réponse
{
  "token": "eyJhbGciOiJIUzI1NiIs...",
  "ws_url": "wss://live.morlivo.ai/v1/live/shared-device/speech?token=...",
  "session_id": "shared_abc123",
  "participant_id": "shared-a1b2c3d4",
  "language_a": "en",
  "language_b": "es"
}
WebSocket

/v1/live/shared-device/speech

Connectez-vous avec le jeton signé, envoyez des trames PCM mono 16 kHz et recevez l'audio traduit ainsi que les événements de transcription de l'orateur/de l'interprète.

Connexion

ParamètreTypeRequisDescription
tokenstringouiJeton signé renvoyé par /api/v1/live/shared-device/token

Exemple

JavaScript
const ws = new WebSocket(tokenResponse.ws_url);

ws.onmessage = (event) => {
  if (event.data instanceof Blob) {
    return playTranslatedAudio(event.data);
  }
  const msg = JSON.parse(event.data);
  if (msg.type === "transcript_input") renderSpeakerTranscript(msg);
  if (msg.type === "transcript_output") renderInterpreterTranscript(msg);
  if (msg.type === "interpreter_speaking") setInterpreterSpeaking(msg.active);
};
GET

/v1/languages

Répertoriez toutes les langues prises en charge avec les paramètres régionaux, le nom et l'état de disponibilité.

Réponse 200

ChampTypeDescription
languagesarrayListe des langues prises en charge
languages[].localestringCode local, par ex. fr-CA
languages[].namestringNom anglais
languages[].native_namestringNom natif
languages[].countrystringPays/région
languages[].statusstringga ou bêta

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

Vérifiez l’état de API et l’état de la base de données. Aucune authentification requise.

Réponse 200

ChampTypeDescription
statusstringsain ou dégradé

Exemple

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

Points de terminaison de compatibilité

Vous utilisez déjà un autre fournisseur ? Modifiez un URL et conservez votre code existant. Ces points de terminaison reflètent les formats de requête et de réponse des principales API de traduction et de transcription.

DL

DeepL

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

Remplacement immédiat pour api-free.deepl.com

G

Google Cloud Translation

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

Remplacement immédiat pour translation.googleapis.com

A

AWS Translate

Traduction
POST /api/compat/aws/translate

Remplacement immédiat pour translate.amazonaws.com

OA

OpenAI Whisper

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

Remplacement immédiat pour api.openai.com

DG

Deepgram

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

Remplacement immédiat pour api.deepgram.com

Les points de terminaison de compatibilité acceptent le même format de demande et renvoient la même structure de réponse que le fournisseur d'origine. Reportez-vous à la documentation de chaque fournisseur pour connaître ses schémas de demande/réponse.

Erreurs

Toutes les erreurs renvoient un objet JSON avec un champ de détail.

CoderSignificationQuand ça arrive
400 Mauvaise demande Champs obligatoires manquants, texte vide, type de fichier non pris en charge
401 Non autorisé Clé API manquante ou invalide
403 Interdit Clé API valide, mais la portée requise ou l'autorisation du locataire est manquante
402 Paiement requis Crédits insuffisants ou vérification de carte requise. La réponse inclut billing_url et les en-têtes X-Credits-* lorsque disponibles.
413 Charge utile trop importante Le fichier dépasse la limite de téléchargement de 100 Mo
429 Tarif Limité Trop de demandes. Réessayez avec une interruption exponentielle.
500 Erreur interne Erreur de serveur inattendue. Contactez le support si le problème persiste.
503 Service indisponible Modèle AI temporairement indisponible (disjoncteur ouvert). Réessayez sous peu.
Format de réponse d'erreur
{
  "detail": "Field 'text' must not be empty."
}
402Épuisement des crédits
{
  "error": "insufficient_credits",
  "detail": "Insufficient credits",
  "billing_url": "/app/billing"
}

Les réponses API réussies incluent les en-têtes X-Credits-Spent et X-Credits-Remaining. Lorsque les crédits sont épuisés, les clients doivent cesser de réessayer et envoyer l’utilisateur vers billing_url.

POST

Rédaction PII

Ajoutez la rédaction 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étecté automatiquement si omis
target_languagestringouiCode ISO 639-1 (ex. es, fr, de)
redactstring[]nonTypes d'entités à expurger (par exemple, e-mail, téléphone, nom)

Réponse 200

ChampTypeDescription
translated_textstringTexte traduit avec PII expurgé
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 un motif (inclus)
phone Numéros de téléphone Basé sur un motif (inclus)
ssn Numéros de sécurité sociale Basé sur un motif (inclus)
credit_card Numéros de carte de crédit Basé sur un motif (inclus)
ip_address Adresses IP Basé sur un motif (inclus)
name Noms de personnes Alimenté par l'IA (coût supplémentaire)
address Adresses physiques Alimenté par l'IA (coût supplémentaire)
medical Informations médicales Alimenté 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 à l'aide de la correspondance de modèles sans frais supplémentaires. Les entités contextuelles (nom, adresse, médical) utilisent la détection basée sur l'IA et encourent de petits frais supplémentaires par demande.

Prêt à intégrer ?

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