API リファレンス
数行のコードで、Morlivo の翻訳と転写をアプリケーションに統合します。
https://api.morlivo.ai
認証: Authorization: Bearer mrl_...
認証
すべての API リクエストにはベアラー トークンが必要です。ダッシュボードの [設定] から API キーを取得します。
Authorization: Bearer mrl_your_api_key_here
API キーは次で始まります mrl_. 秘密にしておいてください。侵害された場合は、ダッシュボードからローテーションしてください。
/v1/translate
テキストをある言語から別の言語に翻訳します。省略した場合、ソース言語は自動検出されます。
リクエストボディ JSON
| フィールド | 種類 | 必須 | 説明 |
|---|---|---|---|
text | string | はい | 翻訳するテキスト |
target_language | string | はい | ISO 639-1 コード (例: es、fr、de) |
source_language | string | いいえ | 省略した場合は自動検出 |
project_id | integer | いいえ | プロジェクトの用語集とスタイルを適用する |
formality | string | いいえ | 登録: 公式、非公式、またはデフォルト |
応答 200
| フィールド | 種類 | 説明 |
|---|---|---|
translated_text | string | 翻訳されたテキスト |
source_language | string | 検出または提供されたソース言語 |
target_language | string | ターゲット言語コード |
confidence | float | 品質スコア 0.0 - 1.0 |
validation | object | 品質検証結果 |
例
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
オーディオまたはビデオ ファイルをテキストに変換します。最大 100 MB をサポートします。
リクエストボディ multipart/form-data
| フィールド | 種類 | 必須 | 説明 |
|---|---|---|---|
file | file | はい | オーディオ/ビデオ ファイル (mp3、wav、mp4、webm など) |
language | string | いいえ | ISO コード、省略された場合は自動検出 |
project_id | integer | いいえ | 追跡するプロジェクトへのリンク |
response_format | string | いいえ | 出力形式: json、verbose_json、text、srt、vtt |
punctuate | boolean | いいえ | 句読点を含める (デフォルトは true) |
応答 200
| フィールド | 種類 | 説明 |
|---|---|---|
text | string | 全文転写 |
language | string | 検出された言語 |
duration_seconds | float | 音声の長さ |
confidence | float | 品質スコア 0.0 - 1.0 |
language_confidence | float | 自動検出された言語の信頼度 (言語が指定されている場合は null) |
segments | array | タイムスタンプ付きセグメント |
validation | object | 品質チェック |
例
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
リアルタイムで音声をストリーミングし、ライブ文字起こし結果を受け取ります。
接続
| パラメータ | 種類 | 必須 | 説明 |
|---|---|---|---|
token | string | はい | クエリパラメータとしてのAPIキー |
language | string | いいえ | ソース言語のヒント (例: en、fr)。省略した場合は自動検出されます。 |
プロトコル
バイナリ PCM オーディオ フレーム (16 ビット、16kHz モノラル)
タイプ フィールドを持つ JSON メッセージ: トランスクリプト (部分/最終テキスト)、ステータス (セッション イベント)、エラー
受信したメッセージ
| フィールド | 種類 | 説明 |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | 転写されたテキスト (転写メッセージ上) |
is_final | boolean | セグメントが完了した場合は True |
language | string | 検出された言語コード |
例
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
ある言語で音声をストリーミングし、別の言語で翻訳されたテキストをリアルタイムで受信します。自動言語検出による音声からテキストへの翻訳をサポートします。
接続
| パラメータ | 種類 | 必須 | 説明 |
|---|---|---|---|
token | string | はい | クエリパラメータとしてのAPIキー |
target_language | string | はい | 出力テキストの言語 (en、es、fr など) |
source_language | string | いいえ | ソースオーディオ言語。省略した場合は自動検出されます。 |
プロトコル
バイナリ PCM オーディオ フレーム (16 ビット、16kHz モノラル)
target_ language で翻訳されたテキストを含む JSON メッセージ。元のスピーチのトランスクリプトと翻訳された出力の両方が含まれます。
受信したメッセージ
| フィールド | 種類 | 説明 |
|---|---|---|
type | string | "transcript" | "status" | "error" |
text | string | ターゲット言語に翻訳されたテキスト |
is_final | boolean | セグメントが完了した場合は True |
source_language | string | 検出されたソース言語 |
target_language | string | ターゲット言語コード |
例
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
サポートされているすべての言語をロケール、名前、利用可能状況とともにリストします。
応答 200
| フィールド | 種類 | 説明 |
|---|---|---|
languages | array | サポートされている言語のリスト |
languages[].locale | string | ロケールコード 例:カリフォルニア州フランス |
languages[].name | string | 英語名 |
languages[].native_name | string | ネイティブネーム |
languages[].country | string | 国・地域 |
languages[].status | string | ガまたはベータ |
例
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
API ステータスとデータベースの健全性を確認します。認証は必要ありません。
応答 200
| フィールド | 種類 | 説明 |
|---|---|---|
status | string | 健康か劣化か |
例
curl https://api.morlivo.ai/api/v1/health
{
"status": "healthy"
}
互換性エンドポイント
すでに別のプロバイダーを使用していますか? URL を 1 つ変更し、既存のコードを保持します。これらのエンドポイントは、主要な翻訳 API および文字起こし API の要求および応答形式を反映しています。
DeepL
翻訳POST /api/compat/deepl/v2/translate
ドロップイン交換品 api-free.deepl.com
Google Cloud Translation
翻訳POST /api/compat/google/v3/projects/{p}/locations/{l}:translateText
ドロップイン交換品 translation.googleapis.com
AWS Translate
翻訳POST /api/compat/aws/translate
ドロップイン交換品 translate.amazonaws.com
OpenAI Whisper
転写POST /api/compat/openai/v1/audio/transcriptions
ドロップイン交換品 api.openai.com
Deepgram
転写POST /api/compat/deepgram/v1/listen
ドロップイン交換品 api.deepgram.com
互換性エンドポイントは、元のプロバイダーと同じ要求形式を受け入れ、同じ応答構造を返します。リクエスト/レスポンスのスキーマについては、各プロバイダのドキュメントを参照してください。
エラー
すべてのエラーは、詳細フィールドを含む JSON オブジェクトを返します。
| コード | 意味 | それが起こったとき |
|---|---|---|
| 400 | 不正なリクエスト | 必須フィールドが欠落している、空のテキスト、サポートされていないファイル タイプ |
| 401 | 無許可 | API キーが見つからないか無効です |
| 403 | 禁止 | APIキーは有効ですが、必要なスコープまたはテナント権限がありません |
| 402 | 支払いが必要です | クレジットが不足しているか、カードの確認が必要です。利用可能な場合、レスポンスには billing_url と X-Credits-* ヘッダーが含まれます。 |
| 413 | ペイロードが大きすぎます | ファイルが 100 MB のアップロード制限を超えています |
| 429 | レート制限あり | リクエストが多すぎます。指数バックオフを使用して再試行します。 |
| 500 | 内部エラー | 予期しないサーバーエラー。問題が解決しない場合は、サポートにお問い合わせください。 |
| 503 | サービスが利用できません | AI モデルは一時的に利用できません (サーキット ブレーカーが開いています)。すぐに再試行してください。 |
{
"detail": "Field 'text' must not be empty."
}
{
"error": "insufficient_credits",
"detail": "Insufficient credits",
"billing_url": "/app/billing"
}
成功したAPIレスポンスには、X-Credits-Spent と X-Credits-Remaining ヘッダーが含まれます。クレジットを使い切ったら、クライアントは再試行を停止し、ユーザーを billing_url に誘導してください。
PII 編集
翻訳または転写リクエストに PII 編集を追加します。検出および編集するエンティティ タイプを指定します。
リクエストボディ JSON
| フィールド | 種類 | 必須 | 説明 |
|---|---|---|---|
text | string | はい | 翻訳するテキスト |
source_language | string | いいえ | 省略した場合は自動検出 |
target_language | string | はい | ISO 639-1 コード (例: es、fr、de) |
redact | string[] | いいえ | 編集するエンティティのタイプ (電子メール、電話、名前など) |
応答 200
| フィールド | 種類 | 説明 |
|---|---|---|
translated_text | string | PII が編集された翻訳済みテキスト |
source_language | string | 検出または提供されたソース言語 |
target_language | string | ターゲット言語コード |
confidence | float | 品質スコア 0.0 - 1.0 |
redactions | array | 適用された編集のリスト (種類と置換) |
例
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]"}
]
}
サポートされているエンティティ タイプ
| エンティティ | 説明 | 検出 |
|---|---|---|
email |
メールアドレス | パターンベース(付属) |
phone |
電話番号 | パターンベース(付属) |
ssn |
社会保障番号 | パターンベース(付属) |
credit_card |
クレジットカード番号 | パターンベース(付属) |
ip_address |
IPアドレス | パターンベース(付属) |
name |
人名 | AI 搭載 (追加料金) |
address |
物理アドレス | AI 搭載 (追加料金) |
medical |
医療情報 | AI 搭載 (追加料金) |
フォーマットベースのエンティティ (電子メール、電話、SSN、クレジット カード、IP) は、追加料金なしでパターン マッチングを使用して検出されます。コンテキスト エンティティ (名前、住所、医療) は AI を利用した検出を使用し、リクエストごとに少額の追加料金が発生します。