Диаризация дикторов
Разделите транскрипт на реплики по говорящим. Включается одним флагом — и каждый сегмент получает метку спикера.
Что это делает
Когда распознавание дикторов включено, API анализирует аудио и относит каждый сегмент к отдельному голосу. Текст транскрипта остаётся тем же, но к каждому элементу result.segments[] добавляется метка спикера — так вы понимаете, кто именно что сказал.
Как включить
Передайте speaker_recognition: true в теле запроса. По умолчанию — false, поэтому дополнительное время обработки тратится только когда диаризация действительно нужна.
curl -X POST https://api.quillhub.ai/v1/transcriptions \
-H "Authorization: Bearer $QAI_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/interview.mp3",
"speaker_recognition": true
}'Формат ответа
При включённой диаризации у каждого элемента result.segments[] появляется поле speaker рядом со start, end и text. Поле result.text не меняется — это по-прежнему простой склеенный транскрипт, — поэтому для группировки по спикерам используйте result.segments.
{
"id": "trs_01HZX9K7Q2M4YV8BTA6JRN3PDE",
"status": "completed",
"result": {
"text": "Welcome to the show. Thanks for having me. So let's start with your background. Sure, I grew up in Boston and studied computer science.",
"segments": [
{ "start": 0.00, "end": 2.41, "text": "Welcome to the show.", "speaker": "Speaker 1" },
{ "start": 2.48, "end": 4.12, "text": "Thanks for having me.", "speaker": "Speaker 2" },
{ "start": 4.20, "end": 7.05, "text": "So let's start with your background.", "speaker": "Speaker 1" },
{ "start": 7.15, "end": 9.88, "text": "Sure, I grew up in Boston", "speaker": "Speaker 2" },
{ "start": 9.92, "end": 12.60, "text": "and studied computer science.", "speaker": "Speaker 2" }
]
}
}Группировка по спикерам
Соседние сегменты одного и того же спикера — это обычно одна реплика. Небольшой редьюсер на клиенте объединяет их в аккуратный список ходов диалога:
// segments: [{ start, end, text, speaker }, ...]
function groupBySpeaker(segments) {
const groups = [];
for (const seg of segments) {
const last = groups[groups.length - 1];
if (last && last.speaker === seg.speaker) {
last.lines.push(seg.text);
} else {
groups.push({ speaker: seg.speaker, lines: [seg.text] });
}
}
return groups;
}
const turns = groupBySpeaker(result.segments);Точность и ограничения
- Лучше всего работает на чистом аудио с ярко различающимися голосами — интервью, подкасты, встречи с отдельными микрофонами.
- Точность падает при сильных перекрытиях речи, перебиваниях, фоновом шуме или низком битрейте.
- Метки — обобщённые заглушки («Speaker 1», «Speaker 2», …). Соответствие реальным именам вы расставляете сами.
- Метки согласованы внутри одной транскрипции, но не между разными. Speaker 1 в файле A никак не связан со Speaker 1 в файле B.
Стоимость
Диаризация добавляет примерно 10–15% ко времени обработки и не тарифицируется отдельно — цена транскрипции одинакова с флагом и без него.