JSONL для расшифровки: как хранить одну реплику на строку и проверить файл
Как подготовить собственный JSONL с репликами: UTF-8, экранирование переносов, проверка каждой строки через Python и устойчивые идентификаторы.
Выберите явную схему рабочего файла
JSONL удобен для последовательной обработки большого набора реплик собственным скриптом. В отличие от одного JSON-массива каждая строка является самостоятельным значением. Для понятного рабочего формата используйте объекты одной схемы и храните описание полей рядом.
После расшифровки аудио можно подготовить id, timecode, speaker и text. Это предлагаемый пользовательский формат, а не обещание экспорта JSONL из Транскрибатора. Не объявляйте свою схему стандартом всех систем распознавания.
Метка speaker обозначает участника в рабочем тексте. Если человек не установлен по записи, сохраняйте У01 вместо догадки об имени. Поле timecode должно иметь описанные единицы и шкалу исходника.
Соблюдайте границу физической строки
JSON Lines использует UTF-8. Каждая строка должна содержать корректное JSON-значение; пустая строка не является записью этого формата. Для собственного набора реплик дополнительно требуйте объект с выбранными полями.
В Python применяйте json.dumps(row, ensure_ascii=False) и затем добавляйте "\n". Не используйте indent для многострочного форматирования отдельного объекта в JSONL. Многострочный красивый JSON и одна запись на строку решают разные задачи.
Если реплика содержит перенос строки, сериализация экранирует его внутри значения. Не собирайте JSON руками и не удаляйте переносы из содержания только ради структуры файла. Кавычки и управляющие символы тоже поручите библиотеке.
Проверьте структуру и обязательные поля
Читатель JSONL должен обрабатывать строки последовательно. Для каждой строки вызовите json.loads и проверьте тип полученного значения. Номер физической строки удобно использовать в сообщении об ошибке, чтобы быстро найти повреждённую запись.
После синтаксиса проверьте собственную схему: id уникален, text является строкой, таймкод присутствует в ожидаемом формате. Корректный JSON может содержать число или null; это допустимо формату, но не Вашей таблице реплик.
Не пропускайте ошибочную строку молча. Иначе число обработанных реплик уменьшится без понятного следа. Для рабочего импорта сохраните номер, причину и принятое действие отдельно, прежде чем продолжать обработку остальных данных.
Сверьте обратное чтение с источником
На учебных репликах сравните объекты до записи и после чтения. Включите кавычки, русские буквы и перенос внутри text. Затем проверьте начало и конец настоящего материала. Структурная проверка не обнаружит слово, ошибочно распознанное ещё до создания JSONL.
Если результат нужен человеку в таблице, подготовьте отдельный CSV по правилам сохранения текстовых полей. Простая замена расширения jsonl на csv не преобразует данные.
Храните исходную запись и полный текст отдельно от производной выгрузки. Если один объект представляет выбранную цитату, подпишите это явно: набор цитат не должен выдаваться за полную расшифровку разговора.
Учебный пример: проверка на коротком фрагменте
Ниже вымышленная запись. Имена, время и содержание нужны только для объяснения порядка работы.
| Проверка | Учебное значение | Результат |
|---|---|---|
| Структура | Один объект на строке | json.loads читает строку |
| Текст | Русские буквы и перенос | Значение восстановлено |
| Схема | id и text присутствуют | Запись пригодна для задачи |
Повторите проверку на своей копии записи. Учебные значения не описывают Ваш файл и не подтверждают качество всей расшифровки.
Заготовка для собственной проверки
import json
rows = [{"id": "r1", "timecode": "00:01:20",
"speaker": "У01", "text": "Ответ\nУточнение"}]
with open("transcript.jsonl", "w", encoding="utf-8") as f:
for row in rows:
f.write(json.dumps(row, ensure_ascii=False) + "\n")
with open("transcript.jsonl", encoding="utf-8") as f:
restored = [json.loads(line) for line in f]
assert restored == rows
assert all(isinstance(row, dict) for row in restored)Частые вопросы
JSONL — это один JSON-массив?
Нет. Это отдельные JSON-значения на отдельных строках.
Можно использовать indent=2?
Для обычного JSON можно, но многострочный объект нарушит выбранную организацию JSONL.
Пустая строка — допустимая запись?
Нет. В JSON Lines каждая строка должна содержать JSON-значение.
Корректный синтаксис подтверждает речь?
Нет. Содержание сверяют с аудиозаписью отдельно.