Skip to main content

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.

DoHow
Play the clip under the playheadSpace or Play: runs to the next cut and stops exactly on it
Play through all cutsShift+Space or Play through
PauseSpace again, or click the video
Drop a cut at the playheadEnter or C, or Cut here
Move the playheadclick the timeline; ← / → one second, with Shift five seconds; Home / End
Move a cutdrag its marker; or select it and nudge with [ and ] (0.1 s)
Remove a cutselect the marker and press Delete, or Merge in the clip list
Hear one clipPlay on its row
Name a cliptype 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:

FieldMeaning
your media field ($audio, $video)the clip's URL
clip_index1, 2, 3, … in time order
clip_start, clip_endseconds into the original
clip_labelthe label you typed, when any
source_filethe 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 URL
  • POST /api/projects/<id>/media-split/silences {…, noise_db, min_silence} → quiet spans
  • POST /api/projects/<id>/media-split {source: {file_upload_id | task_id, duration}, cuts: [{start, end, label}], options: {precise, add_to_project}} → job
  • POST /api/projects/<id>/media-split/<job>/run → performs the next step; call until status is done or failed
  • GET /api/projects/<id>/media-split/<job> → state and results
  • POST /api/projects/<id>/media-split/<job>/delete-source

Project managers only.