{
  "schemaVersion": 1,
  "id": "P50-C03",
  "title": "WAV-пакет: разбиение длинных файлов под лимит приема",
  "author": {
    "id": "P50",
    "name": "Вячеслав Фомин"
  },
  "specialty": "Стоимость и скорость ИИ-сервисов",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P50-C03",
    "title": "Сервис расшифровки",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "При передаче записей в сервис с лимитом длительности длинный файл нельзя просто обрезать. Нужны самостоятельные WAV с правильными заголовками, порядком фрагментов и сохранением всего сигнала.",
  "decision": "Я разделил PCM только по границе отсчета и пересчитал RIFF/data для каждого фрагмента. Манифест хранит исходный файл, номер части и диапазон отсчетов. После разрезания части собираются обратно и сравниваются с исходным PCM без потерь.",
  "constraint": "Использованы шесть авторских тональных PCM-файлов. Проверена подготовка аудио к ограниченному приему, а не распознавание речи или качество внешнего ASR.",
  "steps": [
    "Зафиксировать полный вход и два режима обработки.",
    "Проверить правильность результата до сравнения времени.",
    "Выполнить 50 прогревочных запусков и 30 серий по 100 повторов; сохранить все сводные времена."
  ],
  "inspection": [
    "Девять частей сохраняют все 67 секунд и лимит 10 — проверено.",
    "Baseline оставляет шесть файлов, включая 30 секунд сверх лимита — проверено.",
    "Лимит 7 секунд меняет разбиение, но не теряет отсчеты — проверено."
  ],
  "sample": {
    "headers": [
      "Источник",
      "Часть",
      "Первый Отсчет",
      "Отсчетов",
      "Секунд",
      "Байт WAV"
    ],
    "rows": [
      [
        "tone-1s.wav",
        "1",
        "0",
        "8000",
        "1",
        "16044"
      ],
      [
        "tone-2s.wav",
        "1",
        "0",
        "16000",
        "2",
        "32044"
      ],
      [
        "tone-4s.wav",
        "1",
        "0",
        "32000",
        "4",
        "64044"
      ],
      [
        "tone-10s.wav",
        "1",
        "0",
        "80000",
        "10",
        "160044"
      ],
      [
        "tone-20s.wav",
        "1",
        "0",
        "80000",
        "10",
        "160044"
      ],
      [
        "tone-20s.wav",
        "2",
        "80000",
        "80000",
        "10",
        "160044"
      ],
      [
        "tone-30s.wav",
        "1",
        "0",
        "80000",
        "10",
        "160044"
      ],
      [
        "tone-30s.wav",
        "2",
        "80000",
        "80000",
        "10",
        "160044"
      ],
      [
        "tone-30s.wav",
        "3",
        "160000",
        "80000",
        "10",
        "160044"
      ]
    ]
  },
  "sampleNote": "Авторский набор. В timings.json записан фактически выполненный локальный замер кода; тариф модели и сеть в него не входят.",
  "caseStudy": {
    "role": "Разработчик стендов измерения обработки данных",
    "contribution": "Я создал шесть PCM-источников, разделил их на девять WAV и проверил восстановление исходных байтов.",
    "objective": "Шесть исходных WAV превращаются в девять самостоятельных файлов не длиннее 10 секунд; обратная сборка PCM проверена побайтно.",
    "problem": "При передаче записей в сервис с лимитом длительности длинный файл нельзя просто обрезать. Нужны самостоятельные WAV с правильными заголовками, порядком фрагментов и сохранением всего сигнала.",
    "result": "Шесть WAV длительностью 1, 2, 4, 10, 20 и 30 секунд реально разделены на девять валидных частей не длиннее 10 секунд. В каждом заголовке пересчитаны размеры RIFF/data. Обратная сборка всех шести PCM-потоков совпала с исходными байтами; SHA-256 и порядок частей записаны в манифесте.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css",
      "tone-1s.wav",
      "tone-2s.wav",
      "tone-4s.wav",
      "tone-10s.wav",
      "tone-20s.wav",
      "tone-30s.wav",
      "timings.json",
      "segmentation.json",
      "tone-1s-part-1.wav",
      "tone-2s-part-1.wav",
      "tone-4s-part-1.wav",
      "tone-10s-part-1.wav",
      "tone-20s-part-1.wav",
      "tone-20s-part-2.wav",
      "tone-30s-part-1.wav",
      "tone-30s-part-2.wav",
      "tone-30s-part-3.wav"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Последний фрагмент сохраняет остаток записи",
        "text": "Запись длиной 30 секунд делится на три десятисекундных файла, короткая запись остаётся одним фрагментом. Для каждого выхода пересчитываются размеры WAV, а порядок сохраняется в манифесте. Обратная сборка и SHA-256 проверяют, что дробление не потеряло остаток и не переставило части, даже когда все файлы по отдельности открываются."
      }
    ]
  },
  "deliverable": {
    "type": "analysis",
    "entry": "/catalogue/deliverables/p50-c03/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p50-c03/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/benchmark.cjs",
        "name": "benchmark.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-1s.wav",
        "name": "tone-1s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-2s.wav",
        "name": "tone-2s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-4s.wav",
        "name": "tone-4s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-10s.wav",
        "name": "tone-10s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-20s.wav",
        "name": "tone-20s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-30s.wav",
        "name": "tone-30s.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/segment-wav.cjs",
        "name": "segment-wav.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/timings.json",
        "name": "timings.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/segmentation.json",
        "name": "segmentation.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-1s-part-1.wav",
        "name": "tone-1s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-2s-part-1.wav",
        "name": "tone-2s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-4s-part-1.wav",
        "name": "tone-4s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-10s-part-1.wav",
        "name": "tone-10s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-20s-part-1.wav",
        "name": "tone-20s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-20s-part-2.wav",
        "name": "tone-20s-part-2.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-30s-part-1.wav",
        "name": "tone-30s-part-1.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-30s-part-2.wav",
        "name": "tone-30s-part-2.wav",
        "mimeType": "audio/wav"
      },
      {
        "path": "/catalogue/deliverables/p50-c03/tone-30s-part-3.wav",
        "name": "tone-30s-part-3.wav",
        "mimeType": "audio/wav"
      }
    ],
    "summary": "Шесть WAV длительностью 1, 2, 4, 10, 20 и 30 секунд реально разделены на девять валидных частей не длиннее 10 секунд. В каждом заголовке пересчитаны размеры RIFF/data. Обратная сборка всех шести PCM-потоков совпала с исходными байтами; SHA-256 и порядок частей записаны в манифесте."
  },
  "takeaway": "Шесть WAV длительностью 1, 2, 4, 10, 20 и 30 секунд реально разделены на девять валидных частей не длиннее 10 секунд. В каждом заголовке пересчитаны размеры RIFF/data. Обратная сборка всех шести PCM-потоков совпала с исходными байтами; SHA-256 и порядок частей записаны в манифесте.",
  "capabilities": [
    "completed_analysis"
  ],
  "externalConnections": []
}
