You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(audio): stamp iwac:transcriptionModel, where the model can be named
The audio pipeline's 03 wrote bibo:content and no provenance, so which model
produced a deposited-audio transcript was recorded only in the header of the
file on disk -- auditable by whoever still has the folder, and nowhere in the
archive. AI_youtube_transcription/03 has written the annotation since
2026-08-12; this is the same value on the same property, 315.
What differs is that --model cannot be required here. Four models can fill
Transcriptions/ and one of them can be cited: gemini-3.7-flash, item 111774.
gemini-pro-latest and gemini-flash-lite-latest are rolling aliases, which
AI_MODEL_ITEMS deliberately holds no entry for -- a run through one reports its
version as the string "Gemini Pro Latest", so an annotation through it asserts a
release the run never confirmed. voxtral-mini-2602 has no authority item at all.
Requiring --model would leave three of the four unwritable.
Silence is not consent to lose the provenance either, though. With neither flag
the model is read off the transcripts' own "Generated using:" line, which the
transcriber wrote and the operator did not, so an unattended run stamps evidence
rather than a memory. A header naming something no annotation can cite stops the
run instead, pointing at --no-model-annotation (upload the text, claim nothing)
or --model (assert the pinned release an alias resolved to on the day). Either
way it is a flag someone passes on purpose.
A folder holding two models is refused rather than warned about, which is
stricter than the YouTube step. One annotation covers the whole batch, so a mix
attributes every transcript to whichever model is chosen, and --yes skips the
confirmation panel the warning would have been read on. Transcriptions/
accumulates across 02 and 02b runs, so the mix is not exotic. Every file is
counted, not one per identifier: a recording that arrived as several media files
is several transcripts, and nothing stops 02 having made one and 02b another.
The header parser goes in segments.py, which already owns the on-disk format and
wrote the line being read back; it refuses to guess when the separator is
missing, because a wrong guess there would let transcript text be read as a
provenance claim. 02's model list becomes ALLOWED_MODELS so that the argparse
choices and the interactive menu stop being two lists that can drift, and so a
test can hold the invariant they encode: a pinned id added there needs an Omeka
authority item, or 03 refuses the folder it fills.
Also wires the pre-write backup this step never had. It was PATCHing a live
archive under "Backup: disabled -- no route back"; it now defaults to
AI_audio_summary/backups/, with --backup-dir and --no-backup as the YouTube step
has them.
Not fixed here: read_and_join_transcriptions() still uploads each file's header
into bibo:content, where it is indexed as archive full text and exported to
Hugging Face as OCR. Stripping it re-PATCHes every audio transcript already in
Omeka, so it is its own change.
0 commit comments