議事録、誰が話したか自動で分かりますか
文字起こしは「何が話されたか」に答えますが、このエンドポイントは録音をターンに分ける最初の一歩を行います。発話のまとまりの間にある無音を聞き取って音声を区切り、交互のターン(話者A、話者B)として開始・終了時刻とともにラベルを付けます。限界は正直にお伝えします。無音でターンを区切るだけで、声を識別することも、実際の話者の人数を割り出すこともしません。
オンラインで実行
アカウントでログインし、当社のサーバー上で実行します。無料ツールはブラウザ内で動作しますが、これは上記の料金がKIT残高から差し引かれます。
このタスクが実際に行うこと
音響的な話者認識ではなく、軽量なターン分割を行います。録音はまず文字起こしされ、セグメントの間に十分に長い無音があるたびにラベルが次のターンへ切り替わり、二つのタグの間を交互に行き来します。これにより、区切られてタイムスタンプの付いた構造 — 区別のない一塊ではなく読みやすいやり取り — が得られ、二人の会話の最初の一歩としては本当に役立ちます。一方でこれは、声の特徴を聞いて誰が誰かを判断するモデルではありません。ラベルは無音のリズムから生まれるもので、ある声を別の声と聞き分けた結果ではありません。
タスクが返すもの
/audio/diarize に音声ファイルを POST すると、タスクはターンの一覧を返します。各ターンには話者ラベル(話者A または 話者B)、その区間のテキスト、開始・終了時刻が含まれます。使用した異なるラベルの数も返しますが、この無音ベースの方式では最大でも二つです。この数はあくまで分割の性質であって、実際にその場に何人いるかを測ったものではありません。文字起こしと組み合わせれば、タイムスタンプ付きの台本のような構造になり、ざっと目を通しやすくなります。
無音ベースの方式が向く場面と向かない場面
向いているのは、二人のきれいなやり取り — インタビューや一対一の通話 — で、話者がおおむね交互に話し、無音が声の交代と一致する場合です。複数人のパネル、声が激しく重なる場面、あるいは録音全体を通して実在する一人ひとりを一貫して追う必要がある場合には向きません。無音で二つのラベルを交互に振るやり方は、そうした場面ではラベルを取り違えます。実際の話者数を確定したい、あるいは声を実在する人物に結び付けたいという用途であれば、それはこのエンドポイントが行うものとは別の、より重いタスクであり、このページはそれをできるふりはしません。
それでもターン分割が役立つ理由
本当の話者認識がなくても、二人の録音をタイムスタンプ付きのターンに分けるだけで実際の手間が省けます。文字起こしの壁のような塊が、目を通したり、時刻で引用したり、メモ作成の工程へ渡したりできる読みやすいやり取りに変わります。一件の担当者と顧客の通話を確認するサポートチーム、一対一のインタビューを整える記者、二人のホストのセグメントを読みやすいターンに刻むプロデューサー — いずれも、区別のない一塊から始めるのではなく、要所を手で直せる最初のたたき台としての構造から価値を得られます。
料金と課金方法
料金は、1リクエストあたりの少額の基本料金に、録音の長さに応じた分単位の料金を加えたもので、本ページに掲載しています。1リクエスト$0.002に加えて1分あたり$0.0055です。タスクは非同期で処理されます。音声を送信するとすぐに task_id が返り、ターンに分割された結果は署名付き webhook、または24時間有効な署名付きリンクから受け取れます。失敗したタスクは自動的に最大3回まで再試行され、それでも完了しない場合は課金されません。
活用例
二人のインタビューのターン分け
記者が一対一で録音したインタビューをエンドポイントに通してタイムスタンプ付きのターンに分け、生の文字起こしを手で直せる読みやすいやり取りに変えています。
担当者と顧客の通話の確認
サポートチームが一件の録音通話を交互のターンに分けて確認を速めます。声で誰が誰かを識別することはツールに期待していません。
二人のホストのセグメント整理
プロデューサーが二人のホストの録音を、番組ノートを編集する前の最初の一歩としてタイムスタンプ付きのターンに刻み、取り違えたラベルは手で直しています。
メモ作成前のたたき台としての構造
あるパイプラインが要約の工程の前に会話をターンと時刻に分割し、後段に平坦な塊ではなく構造化された入力を渡します。
よくある質問
このエンドポイントは実際に何をしますか?
発話のまとまりの間の無音を検出して録音をターンに区切り、交互のターン(話者A、話者B)として開始・終了時刻とともにラベルを付けます。無音ベースのターン分割であり、音響的な話者認識ではありません。
録音に何人の話者がいるか判定しますか?
いいえ。無音に基づいて二つのラベルを交互に振るだけで、実際の話者の人数は割り出しません。返されるラベルの数は分割の性質であって、その場に何人いるかを測ったものではありません。
誰が話しているか、具体的な人物を特定しますか?
いいえ。ラベルは無音のリズムから生まれるもので、ある声を別の声と聞き分けた結果ではないため、話者を特定したり声を実在する人物に結び付けたりはしません。二人のきれいなやり取りでは、交互のラベルはたいてい二人の話者と一致しますが、声が増えたり激しく重なったりすると一致しません。
文字起こしとは何が違いますか?
文字起こしは話された言葉を書き出します。このタスクはその上にターンの構造と時刻を加え、テキストを交互のタイムスタンプ付きセグメントに分割するので、二人の録音が一塊ではなくやり取りとして読めます。
このエンドポイントは無料ですか?
無料枠はありません。無料枠は悪用され、全員の速度を落とすためです。アクセスは前払い式の ForHosting KIT 残高で動きます。$10.00 からチャージでき(残高は期限切れになりません)、各リクエストは掲載価格で課金されるため、残高のない呼び出しは HTTP 402 を返します。サブスクリプションもトークンも、でっち上げのクレジットもなく、失敗したタスクは課金されません。
結果はどのように受け取りますか?
タスクはすぐに task_id を返し、非同期で処理します。結果は署名付き webhook、または24時間有効な署名付きリンクから届きます。
ターンが間違うのはどんなときですか?
話者が三人以上いる録音、激しく重なる場面、あるいは同じ人の発話の中に長い無音がある場合、無音で二つのラベルを交互に振るとターンを取り違えます。出力は最終的な帰属ではなく、直すための最初のたたき台として扱ってください。
タスクが失敗するとどうなりますか?
タスクは明確なエラーを返す前に自動的に最大3回まで再試行され、失敗したリクエストは課金されません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/audio/diarize \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"audio":"https://ejemplo.com/audio.mp3"}'const res = await fetch("https://api.kit.forhosting.com/audio/diarize", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"audio": "https://ejemplo.com/audio.mp3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/diarize",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"audio": "https://ejemplo.com/audio.mp3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/diarize", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"audio":"https://ejemplo.com/audio.mp3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"audio":"https://ejemplo.com/audio.mp3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/diarize", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"audio": "https://ejemplo.com/audio.mp3"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.diarize",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
422 | task_failed | タスクの処理に失敗しました。このタスクは課金されません。 |