jq: как извлечь текст реплик из JSON и сохранить порядок сегментов
Как читать собственную расшифровку JSON через jq: путь segments, вывод text, отбор участника и проверка пропущенных полей. Команды и пример структуры.
Посмотрите, где находятся сегменты
jq — утилита обработки JSON. Она полезна, когда текст получен в собственной структурированной выгрузке и нужно подготовить отдельную читаемую версию. jq не распознаёт аудио и не угадывает названия полей. Начните с просмотра структуры конкретного файла.
В учебной схеме корневой объект содержит массив segments. В каждом элементе находятся start, speaker и text. Такая структура выбрана для примера; она не описывает все сервисы и не заявлена как экспорт Транскрибатора.
Если исходного текста ещё нет, сначала получите расшифровку записи, а затем подготовьте нужную схему для своего процесса. Не превращайте выбор технического формата в обещание автоматической интеграции.
Выведите текст, понимая что теряется
Создайте файл text.jq с выражением .segments[].text. Затем выполните jq -r -f text.jq transcript.json > transcript.txt. Файл фильтра позволяет избежать части различий кавычек командной оболочки.
Массив обходится в существующем порядке. Опция -r выводит строковые результаты без внешних JSON-кавычек. Если внутри text есть перенос, он станет переносом в TXT. Поэтому число строк текстового вывода может не совпасть с числом сегментов.
Этот фильтр удаляет технический контекст: время, участника, id. Храните оригинальный JSON. Для проверки цитат одного TXT может оказаться недостаточно; нужные поля можно вывести отдельной таблицей или сохранить рядом в карточке.
Отбирайте реплики только по явным полям
Для отбора У01 в нашей схеме используйте .segments[] | select(.speaker == "У01") | .text. Запишите выражение в отдельный файл и запустите тем же способом. Это точное сравнение значения поля, а не распознавание голоса.
Если метки У01 и speaker_1 обозначают одного человека, сначала согласуйте таблицу соответствий. jq не установит такую связь автоматически. Не объединяйте разные обозначения только потому, что Вам кажется похожим содержание реплик.
Перед фильтрацией посчитайте исходное число сегментов и число выбранных. Если результат пустой, проверьте написание значения и путь. Пустой вывод может означать отсутствие совпадений или ошибочную схему; это не доказательство, что участник молчал.
Проверьте отсутствующие поля и конец текста
В учебной схеме поле text должно быть строкой. Проверьте структуру перед извлечением, например выражением .segments | all(.[]; .text | type == "string"). Нужен также контроль того, что segments действительно массив; этот пример не является универсальным валидатором.
Просмотрите первый и последний выбранные сегменты. Сравните их с исходником и убедитесь, что завершение ответа не потерялось при отборе. Текстовая выборка одного участника часто нуждается в вопросах собеседника для понимания смысла.
Для контроля содержательных изменений сравнивайте не только слова, но и контекст. Технически успешный фильтр может дать неполную картину обсуждения, если решённая Вами задача требует полного диалога.
Учебный пример: проверка на коротком фрагменте
Ниже вымышленная запись. Имена, время и содержание нужны только для объяснения порядка работы.
| Поле | Учебный пример | Что означает |
|---|---|---|
| start | 80 | Время по собственной схеме |
| speaker | У01 | Точная метка отбора |
| text | Проверим срок завтра. | Выводимый текст |
Повторите проверку на своей копии записи. Учебные значения не описывают Ваш файл и не подтверждают качество всей расшифровки.
Заготовка для собственной проверки
Учебный transcript.json:
{"segments":[
{"start":80,"speaker":"У01","text":"Проверим срок завтра."},
{"start":84,"speaker":"У02","text":"Это пока предложение."}
]}
Файл text.jq:
.segments[].text
Команда:
jq -r -f text.jq transcript.json > transcript.txt
Проверить: схема, число сегментов, первый и последний текст.Частые вопросы
jq понимает любую схему расшифровки?
Нет. Путь к данным должен соответствовать Вашему файлу.
-r сохраняет время и имена?
Нет. Выводятся только поля, выбранные выражением.
Пустой результат означает отсутствие участника?
Не обязательно. Сначала проверьте фильтр и значения полей.
Порядок сегментов сортируется автоматически?
В показанном фильтре используется существующий порядок массива.