Learn by looking

Start with one recording.

A complete example, a few bytes and a path through the format. All data below is synthetic.

The MAIN file

This example describes a ten-second recording with one illustrative filtering span from 1,000 to 1,500 milliseconds. Its all-a identity is a placeholder, not the hash of a real recording. Both analysis flags are false.

recording.cbfp.jsonComplete synthetic example
{
  "format": "choirboy.sidecar/2",
  "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "song": {
    "title": "Synthetic CBFP example",
    "artist": "Niche-Knack Apps LLC",
    "durationMs": 10000
  },
  "source": "thirdparty:cbfp-sdk-synthetic",
  "revision": 1,
  "completeScan": false,
  "analysisRan": false,
  "spans": [
    {
      "id": "auto-synthetic-1",
      "word": "example",
      "startMs": 1000,
      "endMs": 1500,
      "category": "PROFANITY",
      "action": "mute",
      "confidence": 0.9,
      "origin": "auto"
    }
  ],
  "editsRef": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.edits.json",
  "landmark": {
    "algo": "landmark-1",
    "count": 2,
    "records": "AQAAAAIAAAD/////AwAAAA=="
  }
}
Download the MAIN exampleValidate its shape with main.schema.json

The editsRef names a possible user-edit layer. This example does not include that layer or require it to exist.

Decode the landmarks

landmark.jsonTwo records
{
  "algo": "landmark-1",
  "count": 2,
  "records": "AQAAAAIAAAD/////AwAAAA=="
}

Decode records from base64, then read consecutive little-endian pairs of 32-bit values. The first value is a hash; the second is an anchor frame.

Bytes (hex)HashFrame
01 00 00 00 02 00 00 0012
ff ff ff ff 03 00 00 004,294,967,2953

There are 16 bytes, so there are two complete records. Their frames are ordered. Frame 2 corresponds to 512000 / 11025 milliseconds, approximately 46.44 ms. These invented hashes demonstrate the record encoding only; they cannot identify the illustrative recording.

Download the landmark example ↓

Inside a bundle

The example recording.cbfp contains exactly two entries: manifest.json and the identity-named MAIN sidecar. The manifest lists one track, declares no transcript and sets the reserved signature value to null.

Try changing a copy’s MAIN identity without changing the manifest or filename. The prototype rejects that disagreement. A JSON Schema check of each individual file cannot check the relationship between them.

Inspect with the prototype

The private Python prototype exposes the API below. It is shown to explain the intended inspection workflow; a public package installation is not available yet.

Python / private prototype API0.1.0.dev0
from pathlib import Path
from cbfp_sdk import parse_json, validate_main, read_bundle

main = validate_main(parse_json(
    Path("recording.cbfp.json").read_bytes()
))
print(main["song"]["title"])

bundle = read_bundle(Path("recording.cbfp").read_bytes())
print(len(bundle["mains"]))  # 1

Validation confirms this profile’s structure and supported semantic checks. It does not establish recording identity, acoustic matching, playback timing or complete coverage.

See what the SDK does today →