# 1. one Spanish glossary - it applies to every Spanish regional variant
curl -X POST https://api.rask.ai/v2/glossaries \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}'
# 2. a localized version per market, both with the same glossary
for lang in es-mx es-es; do
curl -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"$lang\", \"glossary_id\": \"$GLOSSARY_ID\"}"
done# Review: source and translated text, segment by segment
curl -s https://api.rask.ai/v2/projects/$ID/transcription \
-H "Authorization: Bearer $TOKEN" \
| jq '.segments[] | {speaker, src: .src.text, dst: .dst.text}'各言語ペアごとに用語集を作成し、頻繁に登場するナレーターのカスタム音声を保存し、配信先の各市場ごとに地域設定を選択してください。
ソース動画を一度アップロードした後、用語集を使用するか、SRTからインポートした承認済みの翻訳を使用して、対象の各ロケールごとにプロジェクトを作成してください。
翻訳されたテキストを原文と並べて確認し、校正者が指摘した箇所を修正し、変更した部分を再吹き替えし、ローカライズされた動画と字幕をダウンロードします。
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas
MARKETS = ["es-mx", "es-es"]
async def localize(client, video_id, locale, glossary_id):
job = await client.create_project(data=schemas.ProjectCreate(
video_id=video_id, dst_lang=locale, glossary_id=glossary_id))
while job.status is not enums.ProjectStatus.MERGING_DONE:
await asyncio.sleep(10)
job = await client.get_project(project_id=job.id)
return job
async def main():
client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
glossary = await client.create_glossary(data=schemas.GlossaryCreate(
name="Brand terms", src_lang="en", dst_lang="es",
entries={"Rask Studio": "Rask Studio", "onboarding": "incorporación"}))
jobs = await asyncio.gather(*(localize(client, VIDEO_ID, m, glossary.id) for m in MARKETS))
for job in jobs: # review before publishing
script = await client.get_project_transcription(project_id=job.id)
for seg in script.segments[:3]:
print(job.dst_lang, seg.speaker, seg.src.text, "->", seg.dst.text)
asyncio.run(main())import time, requests
AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API = "https://api.rask.ai"
token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}
glossary = requests.post(f"{API}/v2/glossaries", headers=h, json={
"name": "Brand terms", "src_lang": "en", "dst_lang": "es",
"entries": {"Rask Studio": "Rask Studio", "onboarding": "incorporación"}}).json()
ids = [requests.post(f"{API}/v2/projects", headers=h, json={
"video_id": VIDEO_ID, "dst_lang": locale, "glossary_id": glossary["id"]}).json()["id"]
for locale in ["es-mx", "es-es"]]
for pid in ids:
while requests.get(f"{API}/v2/projects/{pid}", headers=h).json()["status"] != "merging_done":
time.sleep(10)
script = requests.get(f"{API}/v2/projects/{pid}/transcription", headers=h).json()
for seg in script["segments"][:3]:
print(seg["src"]["text"], "->", seg["dst"]["text"])// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
method: 'POST',
headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());
const glossary = await call('POST', '/v2/glossaries', {
name: 'Brand terms', src_lang: 'en', dst_lang: 'es',
entries: { 'Rask Studio': 'Rask Studio', onboarding: 'incorporación' },
});
for (const dst_lang of ['es-mx', 'es-es']) {
let p = await call('POST', '/v2/projects', { video_id: VIDEO_ID, dst_lang, glossary_id: glossary.id });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }
const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
segments.slice(0, 3).forEach((s) => console.log(dst_lang, s.src.text, '->', s.dst.text));
}# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)
# 2. import the translation your reviewers approved (source and translated .srt)
TRANSCRIPT_ID=$(curl -s -X POST "https://api.rask.ai/v2/transcriptions/srt?src_lang=en&dst_lang=es-mx" \
-H "Authorization: Bearer $TOKEN" \
-F "src=@source_en.srt" -F "dst=@approved_es-mx.srt" | jq -r .id)
# 3. create the localized version from it - Rask voices the approved script
curl -s -X POST https://api.rask.ai/v2/projects \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\", \"transcript_id\": \"$TRANSCRIPT_ID\"}"<?php
use GuzzleHttp\Client;
$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$glossary = $json($http->post('/v2/glossaries', ['headers' => $h, 'json' => [
'name' => 'Brand terms', 'src_lang' => 'en', 'dst_lang' => 'es',
'entries' => ['Rask Studio' => 'Rask Studio', 'onboarding' => 'incorporación'],
]]));
foreach (['es-mx', 'es-es'] as $locale) {
$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
'video_id' => $videoId, 'dst_lang' => $locale, 'glossary_id' => $glossary['id']]]));
while ($p['status'] !== 'merging_done') {
sleep(10);
$p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}
$script = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
echo $locale, ': ', $script['segments'][0]['dst']['text'], PHP_EOL;
} 0s created
11s transcription_started
87s translation_started
99s voiceover_started
154s merging_started
165s merging_done

es-mx および es-es 同様に機能します。プロジェクトには glossary_versionが記録されるため、後から編集を行っても、完了した作業が勝手に変更されることはありません。動画ローカライズAPIを利用すると、独自のコード内で自動化を行うことにより、1つのソース動画を他の市場向けにさまざまなバージョンに変換できます。これには、翻訳・吹き替え音声、字幕、用語の統一、およびオプションでのリップシンクが含まれます。Raskでは、各市場向けバージョンは1つのプロジェクトとして扱われ、1つのREST APIを通じて作成、確認、ダウンロードが可能です。
翻訳は言葉そのものを変えるものです。一方、ローカライズとは、特定の市場向けに同じ動画を調整することです。具体的には、その地域の言語に対応した表現、一貫性を保ったブランド用語、ナレーターの声、字幕、そして公開前の確認作業などが含まれます。Rask APIは、これらすべてを1つのワークフローでサポートしています。
はい。メキシコ向けの「es-mx」やスペイン向けの「es-es」など、対象となる各ロケールごとにプロジェクトを作成し、ブランド用語の一貫性を保つために1つのスペイン語用語集を再利用してください。各市場向けの表現を確認してください。地域のアクセントが重要な場合は、そのロケールで利用可能なAI音声プリセットを選択してください。音声クローン機能はベースとなる言語モデルを使用するため、明確な地域のアクセントが保証されるわけではありません。
各言語ペアごとに用語集を作成し、プロジェクト作成時に添付してください。各プロジェクトには使用した用語集のバージョンが記録されるため、後で用語集を編集しても、すでに完了した作業には影響しません。プロジェクト作成後は、そのプロジェクトに用語集を追加することはできません。
はい、SRTアップロード機能付きのプランでは可能です。プロジェクト作成時に、承認済みのターゲット言語版SRTファイルをインポートしてください。ソース言語版SRTファイルのインポートは任意です。両方のファイルをお持ちの場合は、それらを両方とも提供することも可能です。Raskでは、吹き替え作業に承認済みの翻訳を使用します。
文化的適切性を判断するには、人間の判断が必要です。このAPIにより、レビュー担当者は公開前に各セグメントの参照情報、慣用表現、例文を市場に合わせて調整することができ、また、チームがすべての動画をレビューできない場合には、Raskがワークフローに人的な品質保証(QA)を追加することも可能です。
ドキュメントに記載されているAPIエンドポイントでは、音声と字幕のローカライズが可能です。映像内のタイトルなど、画像の一部であるテキストは、撮影時のまま保持されます。画面上のテキストがローカライズワークフローに含まれる場合は、弊社チームまでご相談ください。
メキシコ・スペイン語、ヨーロッパ・スペイン語、ブラジル・ポルトガル語、ヨーロッパ・ポルトガル語、カナダ・フランス語など、135以上の言語および地域オプションから、複数の言語へのローカライズが可能です。各プロジェクトにつき、1つのターゲットロケールが指定されます。完全なリストはAPIドキュメントに記載されていますが、それ以外のオプションについても、弊社チームがご相談に応じます。
はい、対応している音声クローン機能の言語であれば可能です。「インスタント・ボイス・クローン」を使用すれば話者の個性を維持できますし、定期的に登場するプレゼンターには、保存済みの「カスタム・ボイス・クローン」を使用することもできます。クローン機能では基本の言語モデルが使用されるため、地域設定を選択しても、その地域のアクセントが再現されるとは限りません。地域のアクセントを重視する場合は、利用可能なAI音声プリセットを選択してください。
リップシンクは、実在の人物がカメラの前で話す映像において、任意の工程です。レビュー後に、ローカライズ済みのバージョンで実行してください。動画全体のリップシンク生成は、吹き替えとは別途課金されます。これには、その後の編集後の生成分も含まれます。
APIの利用料金は、各市場バージョンごとに動画の再生時間(分)単位で課金され、Raskアプリと同じ分単位のプールから差し引かれます。対象となるスタンダードプランでは、追加の分単位につき3ドルが課金されます。 エンタープライズプランの料金は、ご契約内容に応じて設定されます。レビュー後の再吹き替えは、変更されたセグメントの合計再生時間に基づいて課金され、1回の実行につき最低1分が課金対象となります。また、リップシンクは別途課金されます。Raskアプリで無料トライアル(クレジットカード不要)を利用してローカライズをお試しください。APIの評価をご希望の場合は、弊社チームにデモをご予約ください。
はい。定期的なコンテンツ量については、当社のチームが、お客様の現在のプロセスの可視化、レビューおよび承認段階の定義、用語や文体の設定、Raskとお客様のCMSやLMSとの連携、そして必要に応じて人間による品質保証(QA)の追加などをお手伝いいたします。
APIアクセスは、クリエイタープロ、ビジネス、およびエンタープライズの各プランでご利用いただけます。利用できる機能はプランによって異なります。アプリ内でクライアントIDとシークレットを生成すれば、すぐにAPIの呼び出しを開始できます。エンタープライズ向けの契約条件、大量利用時の割引、カスタム言語の対応については、弊社のチームまでお問い合わせください。