gocassini is the reference implementation. It records Nextcloud Talk calls, transcribes them and saves each meeting as a Cassini file. Open source, installed as a Nextcloud app.
A whole meeting
in one file.
A Cassini portable meeting file is an ordinary Ogg .opus audio file at 48 kHz.
What makes it special is everything packed in alongside the audio: the transcript, the speakers,
a summary if you asked for one, and a record of what produced them, all written into the file's
own tags, right next to TITLE and DATE. No sidecar to lose.
org.cassini.portable-meeting/1 · last change 2026-09-07 An example file
Final Moments in Cassini Mission Control
4 speakers · 1:04 · Click a word to seek
Reading Final Moments in Cassini Mission Control…
File detailsReading…
Courtesy NASA/JPL-Caltech · September 15, 2017. Original video. Transcript reconciled from multiple models and JPL captions; uncertain speech is marked. Sources & transcription notes
meeting.opus
├── OpusHead
├── OpusTags
└── audio The manifest and each transcript are UTF-8 JSON, gzipped, base64url-encoded and split across numbered comments. These values come from the downloadable example.
Payload values are shortened for display.
{
"kind": "cassini-portable-meeting",
"version": 1,
"profile": "ogg-opus",
"meeting": {
"id": "mtg_8ce6c6690402af088220183ded389bf6f34662b490869a28c3fcadf5a01f58d8",
"title": "Final Moments in Cassini Mission Control",
"createdAtUtc": "2026-09-11T18:41:23Z",
"durationMs": 64783
},
"audio": {
"container": "ogg",
"codec": "opus",
"sampleRate": 48000,
"channels": 2,
"sampleCount": 3109617,
"durationMs": 64783
},
"integrity": {
"matchPolicy": "exact-opus-audio-v1",
"opusAudioSha256": "8ce6c6690402af088220183ded389bf6f34662b490869a28c3fcadf5a01f58d8",
"sampleRate": 48000,
"channels": 2,
"sampleCount": 3109617,
"durationMs": 64783
},
"speakers": [
{
"id": "acs",
"label": "ACS 1"
},
{
"id": "signal",
"label": "Mission control"
},
{
"id": "webster",
"label": "Julie Webster"
},
{
"id": "maize",
"label": "Earl Maize"
}
],
"transcripts": [
{
"id": "words",
"default": true,
"format": "cassini.words.v1",
"wordCount": 120,
"payloadRef": {
"prefix": "CASSINI_TX_WORDS_PAYLOAD_",
"chunkCount": 1,
"sha256": "8ff466b7afd6b0c055b7e11163c4c5b39ebbf155654d7416855f2faf4a3b3b9c",
"rawBytes": 7806,
"gzipBytes": 1446,
"mime": "application/vnd.cassini.transcript-words+json",
"encoding": "base64url+gzip+utf8json"
}
}
],
"provenance": {
"demoProduction": {
"createdAtUtc": "2026-09-11T18:41:23Z",
"source": {
"title": "Final Moments in Cassini Mission Control",
"page": "https://www.jpl.nasa.gov/videos/final-moments-in-cassini-mission-control/",
"download": "https://d2pn8kiwq2w21t.cloudfront.net/media/videoscassini20170915JPL-20170915-CASSINf-0001-720cc.m4v",
"publishedDate": "2017-09-15",
"sha256": "fc28a4e3b600355fa0a71c782e387d50d63bf7a65d909371fbfecf82599f25f7",
"credit": "Courtesy NASA/JPL-Caltech",
"usePolicy": "https://www.jpl.nasa.gov/jpl-image-use-policy/"
},
"transcription": {
"method": "Editorial reconciliation of independent audio transcriptions, JPL webpage transcript and embedded EIA-608 captions",
"models": [
"google/gemini-3.5-flash",
"google/gemini-3.8-flash",
"openai/gpt-audio",
"ElevenLabs scribe_v2"
],
"modelAccess": "Gemini and GPT Audio through OpenRouter; Scribe and forced alignment through ElevenLabs",
"evidence": "cassini-final-moments.evidence.json",
"timing": "Scribe v2 acoustic word timestamps; general audio models’ segment timestamps rejected as inaccurate. ElevenLabs forced alignment was attempted but denied due to missing forced_alignment permission; no independent alignment result was available.",
"speakerAttribution": "Julie Webster and Earl Maize named by JPL captions and webpage. Their short exchange is assigned by diarization and conversational continuity. ACS 1 and the signal operator have no verified personal names.",
"decisions": [
"Opening: ACS one, we just had transition to high rate mode (captions and Scribe; webpage has condition).",
"11.179–12.500 seconds: [unintelligible]; candidates include X-band/X-ray band and S-band/Sierra band/C-band. No consensus; JPL also marks this unintelligible.",
"Retain Okay, the individually spoken digits one one five five four six, and audible uh fillers from Scribe.",
"Retain Project manager on FSO coord, Maybe a trickle, within the next, and gonna from acoustic recognition instead of the edited webpage wording.",
"After but, Scribe and GPT Audio hear just heard; Gemini and the webpage disagree on additional pronouns. Retain just heard and document the uncertainty.",
"Preserve full audio including final applause; do not assign group applause to Earl Maize or turn unspoken closing-credit captions into speech."
],
"limitations": "AI-reconciled transcript, not a human-certified or official NASA transcript. Word boundaries and short-turn speaker assignments remain estimates."
},
"audio": {
"processing": "Full original stereo audio, no cuts or denoising in listening copy; AAC decoded and encoded as 48 kHz stereo Opus at 96 kb/s. Filtered radio crop used only for transcription comparison."
},
"producer": "site/scripts/produce-cassini-final.py using tools/cassini-pack.py"
}
}
}In this example, the compressed manifest and transcript total 3.3 KB in a 0.73 MB file. These sizes exclude base64 encoding and tag overhead.
Specification
Current version · Published 2 September 2026
Cassini v1
The file structure, metadata, producer requirements and reader behavior.
Transcript body
A word, its speaker, and start and end times in milliseconds.
cassini.words.v1 Audio digest
The exact bytes used to match a transcript to a recording, independent of its tags.
exact-opus-audio-v1 JSON Schemas
Validate the manifest and transcript body. Served at stable URLs, CC0.
/schema/ Latest change
2026-09-07 — simplification
changelogTools
- Browser readerOpens a file and plays it with its transcript, without installing anything
- Python readersParse the Ogg container directly, or print the tags, the manifest or one transcript with ffprobe
- Python producerPacks Ogg Opus audio and timed words into a Cassini file
- JavaScript readerReads a file in the browser: fetch, DecompressionStream, crypto.subtle
- ffprobe one-linerDumps the payload with no script and no library
- Conformance suiteTest vectors and an adapter protocol for testing a reader in any language