Splitting recordings into clips
A two-hour radio programme, a full lecture, a day of interviews: most recordings arrive as one file, and annotation wants many short ones. The splitter cuts a recording into clips inside the platform, so nobody has to run audio software on their own machine first. It is a preprocessing step: the clips are stored as their own files and, when you say so, become tasks straight away; the original stays until you decide to delete it.
Audio and video are both supported. Cutting is lossless (the clips keep the source codec and quality); video can optionally be re-encoded for frame-exact cuts.
Where to find it
- Import page (Project → Import): upload the recording, then press Split into clips on its card. Use this when the recording has not become a task yet.
- Data Manager: tick one task that holds audio or video and press Split in the toolbar. Use this when the recording is already a task. The button only appears to project managers, and only in projects whose labeling setup has an audio or video field.
Marking the cuts
The panel shows the recording (a waveform for audio up to about 60 MB, the video itself otherwise) with a timeline underneath.
| Do | How |
|---|---|
| Play the clip under the playhead | Space or Play: runs to the next cut and stops exactly on it |
| Play through all cuts | Shift+Space or Play through |
| Pause | Space again, or click the video |
| Drop a cut at the playhead | Enter or C, or Cut here |
| Move the playhead | click the timeline; ← / → one second, with Shift five seconds; Home / End |
| Move a cut | drag its marker; or select it and nudge with [ and ] (0.1 s) |
| Remove a cut | select the marker and press Delete, or Merge in the clip list |
| Hear one clip | Play on its row |
| Name a clip | type in its Label box; it becomes clip_label on the task |
Suggest cuts from silence. Set how quiet (dB) and for how long a pause must be, press Suggest, and one cut is placed in the middle of each pause. Pauses that would leave a clip shorter than Shortest clip are skipped. Quiet spans are shaded on the timeline so you can see why a cut landed where it did. Adjust the markers by hand afterwards; suggestions never cut anything by themselves.
Clips shorter than Shortest clip are highlighted in amber so you can merge them before cutting.
Cutting
Press Cut N clips. The recording is cut in short steps while you watch the progress bar; a long recording takes a few minutes and a dropped connection resumes where it stopped when you press again. For each clip you get the file name, its span and its size.
What happens next depends on where you started:
- From the import page the clips replace the original upload in your upload list: the original is removed, the clips appear as files, and they are validated, mapped and imported together with everything else when you press Import. Nothing enters the project until then.
- From the Data Manager the clips become tasks straight away (turn Add clips to the project as tasks off to only produce the files). On the summary screen, Delete the original recording and its task is ticked by default; Done applies it. Untick it to keep the original alongside the clips. Nothing is deleted before you press Done.
Each clip task carries:
| Field | Meaning |
|---|---|
your media field ($audio, $video) | the clip's URL |
clip_index | 1, 2, 3, … in time order |
clip_start, clip_end | seconds into the original |
clip_label | the label you typed, when any |
source_file | the original's file name |
The same facts are stored on the task's metadata (with the original's task id when it had one), so exports and the corpus tools can trace every clip back to its source.
Frame-exact cuts (video only) re-encode each clip so it starts on
the exact frame you marked. Without it, video clips start on the
nearest earlier keyframe, which can be up to a few seconds early but
is instant and lossless. Audio cuts are always exact to the codec's
frame (milliseconds). Every split and every deletion is audit-logged
(media.split, media.split_source_deleted).
Organisations that keep data in their own buckets
When the org policy Data stays in the organisation's own buckets is
enforced, clips are not stored on the platform: they are written into
the project's Google Cloud Storage source bucket next to the source
data, under <prefix>/clips/<recording name>/, and each clip task
points at the gs:// object with a storage link (so a later sync does
not import it twice). The account the storage was connected with needs
storage.objects.create for this. A project without a GCS source
storage is refused with a message naming the policy; S3 and Azure
write-back is not available yet.
Storage and limits
Clips count towards the project's storage allowance like any upload. The splitter estimates the clips' size from how much of the recording the cuts cover and refuses to start when they would not fit; each clip is checked again as it is written, and a run that hits the cap stops with the clips already made kept. Up to 500 clips per run; the shortest clip allowed is 0.2 s.
Recordings in connected cloud storage are read from the bucket for cutting; the clips are stored on the platform.
Self-hosted and desktop installs
Cutting uses ffmpeg when it is installed (the cloud image ships it). Without ffmpeg, audio is still cut with the built-in audio library (clips come out as WAV); video splitting is refused with a message saying so.
API
POST /api/projects/<id>/media-split/probe{file_upload_id | task_id}→ kind, duration, playable URLPOST /api/projects/<id>/media-split/silences{…, noise_db, min_silence}→ quiet spansPOST /api/projects/<id>/media-split{source: {file_upload_id | task_id, duration}, cuts: [{start, end, label}], options: {precise, add_to_project}}→ jobPOST /api/projects/<id>/media-split/<job>/run→ performs the next step; call untilstatusisdoneorfailedGET /api/projects/<id>/media-split/<job>→ state and resultsPOST /api/projects/<id>/media-split/<job>/delete-source
Project managers only.