Référence API
Intégrez la traduction et la transcription Morlivo dans votre application avec quelques lignes de code.
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.
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.
/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
| Champ | Type | Requis | Description |
|---|---|---|---|
text | string | oui | Texte à traduire |
target_language | string | oui | Code ISO 639-1 (ex. es, fr, de) |
source_language | string | non | Détecté automatiquement si omis |
project_id | integer | non | Appliquer le glossaire et le style du projet |
formality | string | non | Registre : formel, informel ou par défaut |
Réponse 200
| Champ | Type | Description |
|---|---|---|
translated_text | string | Le texte traduit |
source_language | string | Langue source détectée ou fournie |
target_language | string | Code de la langue cible |
confidence | float | Score de qualité 0,0 - 1,0 |
validation | object | Résultats de validation qualité |
Exemples
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"
}'
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!"
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
}
}
/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
| Champ | Type | Requis | Description |
|---|---|---|---|
file | file | oui | Fichier audio/vidéo (mp3, wav, mp4, webm, etc.) |
language | string | non | Code ISO, détecté automatiquement si omis |
project_id | integer | non | Lier à un projet pour le suivi |
response_format | string | non | Format de sortie : json, verbose_json, text, srt, vtt |
punctuate | boolean | non | Inclure la ponctuation (par défaut : vrai) |
Réponse 200
| Champ | Type | Description |
|---|---|---|
text | string | Texte intégralement transcrit |
language | string | Langue détectée |
duration_seconds | float | Durée de l'audio |
confidence | float | Score de qualité 0,0 - 1,0 |
language_confidence | float | Confiance de la langue détectée automatiquement (nulle si la langue a été spécifiée) |
segments | array | Segments horodatés |
validation | object | Contrôles qualité |
Exemples
curl -X POST https://api.morlivo.ai/api/v1/transcribe \
-H "Authorization: Bearer mrl_your_key" \
-F "file=@meeting.mp3" \
-F "language=en"
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
}
}
/v1/live/transcribe
Diffusez de l'audio en temps réel et recevez les résultats de transcription en direct.
Connexion
| Paramètre | Type | Requis | Description |
|---|---|---|---|
token | string | oui | Clé API comme paramètre de requête |
language | string | non | Indice de langue source (par exemple, en, fr). Détecté automatiquement en cas d'omission. |
Protocole
Trames audio PCM binaires (16 bits, 16 kHz mono)
Messages JSON avec champ de type : transcription (texte partiel/final), statut (événements de session), erreur
Messages reçus
| Champ | Type | Description |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Texte transcrit (sur les messages de transcription) |
is_final | boolean | Vrai lorsque le segment est terminé |
language | string | Code de langue détecté |
Exemples
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);
}
};
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}
/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ètre | Type | Requis | Description |
|---|---|---|---|
token | string | oui | Clé API comme paramètre de requête |
target_language | string | oui | Langue du texte de sortie (par exemple, en, es, fr) |
source_language | string | non | Langue audio source. Détecté automatiquement en cas d'omission. |
Protocole
Trames audio PCM binaires (16 bits, 16 kHz mono)
Messages JSON avec texte traduit en langue_cible. Comprend à la fois la transcription du discours original et la sortie traduite.
Messages reçus
| Champ | Type | Description |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | Texte traduit dans la langue cible |
is_final | boolean | Vrai lorsque le segment est terminé |
source_language | string | Langue source détectée |
target_language | string | Code de la langue cible |
Exemples
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);
}
};
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}
/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
| Champ | Type | Description |
|---|---|---|
languages | array | Liste des langues prises en charge |
languages[].locale | string | Code local, par ex. fr-CA |
languages[].name | string | Nom anglais |
languages[].native_name | string | Nom natif |
languages[].country | string | Pays/région |
languages[].status | string | ga ou bêta |
Exemple
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"}
]
}
/v1/health
Vérifiez l’état de API et l’état de la base de données. Aucune authentification requise.
Réponse 200
| Champ | Type | Description |
|---|---|---|
status | string | sain ou dégradé |
Exemple
curl https://api.morlivo.ai/api/v1/health
{
"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.
DeepL
TraductionPOST /api/compat/deepl/v2/translate
Remplacement immédiat pour api-free.deepl.com
Google Cloud Translation
TraductionPOST /api/compat/google/v3/projects/{p}/locations/{l}:translateText
Remplacement immédiat pour translation.googleapis.com
AWS Translate
TraductionPOST /api/compat/aws/translate
Remplacement immédiat pour translate.amazonaws.com
OpenAI Whisper
TranscriptionPOST /api/compat/openai/v1/audio/transcriptions
Remplacement immédiat pour api.openai.com
Deepgram
TranscriptionPOST /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.
| Coder | Signification | Quand ç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. |
{
"detail": "Field 'text' must not be empty."
}
{
"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.
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.
Corps de la requête JSON
| Champ | Type | Requis | Description |
|---|---|---|---|
text | string | oui | Texte à traduire |
source_language | string | non | Détecté automatiquement si omis |
target_language | string | oui | Code ISO 639-1 (ex. es, fr, de) |
redact | string[] | non | Types d'entités à expurger (par exemple, e-mail, téléphone, nom) |
Réponse 200
| Champ | Type | Description |
|---|---|---|
translated_text | string | Texte traduit avec PII expurgé |
source_language | string | Langue source détectée ou fournie |
target_language | string | Code de la langue cible |
confidence | float | Score de qualité 0,0 - 1,0 |
redactions | array | Liste des suppressions appliquées (type et remplacement) |
Exemples
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"]
}'
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]"
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]"}
]
}
Types d'entités pris en charge
| Entité | Description | Dé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.