音声クリップを連結:合計時間と開始位置を計算
レンダリング前にすべての境界が分かっていれば、音声連結の計画を簡単に立てられます。この計算ツールは、指定された順序のクリップ時間を合計し、結合後のタイムラインで各クリップが始まる時刻を返します。最初のクリップは必ずゼロから始まり、それ以降の開始位置は先行するすべての時間の合計です。音声そのものをアップロードしたり処理したりせずに、チャプター、字幕、編集指示、キューシート、再生操作、検証項目の準備に結果をご利用いただけます。
無料で実行
再生順に長さをご入力ください
各音声クリップの長さを秒単位で、実際に並べる順序どおりにご入力ください。小数に対応しているため、12.375 秒のクリップを整数へ丸める必要はありません。時間を占めない仮項目などにはゼロも指定できます。各値は有限の非負数である必要があり、1 回のリクエストでは最大 10,000 クリップまで扱えます。空のシーケンスには報告できる境界がないため、リストを空にはできません。この機能が使用するのは長さだけです。ファイルの検査、メディアのデコード、サンプルレートの変更、フェードの挿入、音声の加工は行いません。そのため、メタデータは揃っていても素材がリモートにある場合、大容量である場合、または承認待ちの場合など、工程の早い段階からご利用いただけます。すべて秒単位に統一し、実際に連結するソフトウェアと整合するメタデータをお使いください。
結合後のタイムラインをご確認ください
応答には 2 つの項目があります。total_duration は入力された全時間の合計で、隙間なく連結した場合の長さを秒で示します。clip_starts は入力と同じインデックス順の配列です。最初のクリップは先頭から再生されるため最初の値はゼロであり、以降の値にはそれ以前のクリップ時間が累積されます。最初の 2 本が 12.5 秒と 8.25 秒なら、3 本目は 20.75 秒から始まります。結果は時計形式の文字列ではなく数値の秒を保つため、コード、字幕ツール、メディアマニフェスト、独自表示を持つ編集ソフトへ容易に渡せます。累積値は小数第 12 位までに正規化され、0.1 と 0.2 の加算で長い端数が現れるような二進浮動小数点の影響を抑えつつ、一般的な音声メタデータを上回る精度を維持します。
レンダリング済みの結果とは区別してご利用ください
算出された開始位置は、連続シーケンスの確定的な設計値であり、エンコード済み出力ファイルの実測値ではありません。実際のメディア工程では、サンプルの切り詰め、クロスフェード、無音の挿入、リサンプリング、コーデックのパディング、フレーム境界への丸めによって時刻が変わる場合があります。これらを含む場合は、各クリップが実際に占める時間へ入力値を調整するか、完成ファイルを後から検証してください。単純な連結であれば、チャプター、文字起こし時刻の移動、波形ラベル、再生ナビゲーション、品質確認に結果を利用できます。レンダリング資源を使う前に、予定したプレイリストが時間制限内か調べる用途にも適しています。計算は純粋で通信を行わないため、同じ入力からブラウザーと API で常に同じ結果が得られます。自動リクエストは $0.002 で、ページ上では手軽にローカル計算をご利用いただけます。
活用例
チャプターマーカーの作成
順番に並んだ長さから、ポッドキャスト、講義、オーディオブックの正確なチャプター開始位置を作成できます。
文字起こし時刻の移動
文字起こしを 1 本にまとめる前に、各クリップの開始位置を個別の時刻へ加算できます。
プレイリスト時間の確認
メディアをレンダリング工程へ送る前に、全体の再生時間とすべての切り替わり位置を確認できます。
よくある質問
API リクエストの料金はいくらですか?
API リクエスト 1 回の料金は $0.002 です。ブラウザー内ではローカル計算もご利用いただけます。
どの単位を使えばよいですか?
すべて秒単位でご入力ください。小数に対応し、返される長さと開始位置も秒単位です。
この機能で音声ファイル自体を結合できますか?
いいえ。順序付きの長さからタイムラインを計算する機能であり、メディアのアップロード、デコード、エンコード、連結は行いません。
長さのリストを空にできますか?
いいえ。少なくとも 1 本の長さが必要で、空のリストには入力エラーを返します。
無音区間やクロスフェードも含まれますか?
入力時間に反映した場合のみ含まれます。この計算が隙間や重なりを自動追加することはありません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/audio/merge-clips \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"durations":[12.5,8.25,3]}'const res = await fetch("https://api.kit.forhosting.com/audio/merge-clips", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"durations": [
12.5,
8.25,
3
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/merge-clips",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"durations": [
12.5,
8.25,
3
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/merge-clips", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"durations":[12.5,8.25,3]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"durations":[12.5,8.25,3]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/merge-clips", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"durations": [
12.5,
8.25,
3
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.merge_clips",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 200 |
max_minutes | 180 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |