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

音声または動画ファイルをテキストに文字起こし。最大100MBまで対応。

リクエストボディ 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ビット、16kHzモノラル)

受信

typeフィールドを含むJSONメッセージ:transcript(部分/最終テキスト)、status(セッションイベント)、error

受信メッセージ

フィールドタイプ説明
typestring"transcript" | "status" | "error"
textstring文字起こしテキスト(トランスクリプトメッセージ上)
is_finalbooleanセグメントが完了した場合にtrue
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ビット、16kHzモノラル)

受信

target_languageでの翻訳テキストを含むJSONメッセージ。元の音声のトランスクリプトと翻訳出力の両方を含みます。

受信メッセージ

フィールドタイプ説明
typestring"transcript" | "status" | "error"
textstring対象言語での翻訳テキスト
is_finalbooleanセグメントが完了した場合にtrue
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を1つ変更するだけで既存のコードをそのまま使えます。これらのエンドポイントは主要な翻訳・文字起こし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

互換エンドポイントは元のプロバイダーと同じリクエスト形式を受け入れ、同じレスポンス構造を返します。各プロバイダーのリクエスト/レスポンススキーマについては、各プロバイダーのドキュメントを参照してください。

エラー

すべてのエラーはdetailフィールドを含むJSONオブジェクトを返します。

コード意味発生時期
400 不正なリクエスト 必須フィールドの欠落、空のテキスト、サポートされていないファイルタイプ
401 認証エラー APIキーが見つからないか無効です
403 禁止 APIキーは有効ですが、権限不足またはクォータ超過です
413 ペイロードが大きすぎます ファイルが100MBのアップロード制限を超えています
429 レート制限 リクエストが多すぎます。指数バックオフで再試行してください。
500 内部エラー 予期しないサーバーエラー。問題が続く場合はサポートにお問い合わせください。
503 サービス利用不可 AIモデルが一時的に利用できません(サーキットブレーカーが開いています)。しばらくしてから再試行してください。
エラーレスポンス形式
{
  "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_textstringPII墨消し済みの翻訳テキスト
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 社会保障番号 パターンベース(含む)
credit_card クレジットカード番号 パターンベース(含む)
ip_address IPアドレス パターンベース(含む)
name 人名 AI搭載(追加費用)
address 住所 AI搭載(追加費用)
medical 医療情報 AI搭載(追加費用)

フォーマットベースのエンティティ(メール、電話、SSN、クレジットカード、IP)はパターンマッチングで追加費用なく検出されます。コンテキストベースのエンティティ(氏名、住所、医療情報)はAI搭載の検出を使用し、リクエストごとに少額の追加料金が発生します。

インテグレーションの準備はできましたか?

無料アカウントを作成してAPIキーを取得し、翻訳を始めましょう。