Automated release: version and notes generated from pull requests merged since 3.1.6.
Fixed
silence.py --fillernever cut a filler word narrower than about 0.36 s but reported it as
removed:--marginwas taken off each side of the filler span too, which turned it inside out
(kept_durationlonger than the input). The margin is now kept around silences only; a filler
cut is the word plus--filler-pad. A silence narrower than two margins removes nothing instead
of overlapping its neighbours (#414).- Transcripts were early by the sound's start offset in
caption.py --transcribeand
silence.py --filler --transcribe: the engine's 16 kHz WAV began at the sound's first sample, so
with a sound 0.276 s after the picture every cue landed 0.276 s early and--fillercut the wrong
276 ms. The WAV (and--karaoke's word-energy decode) is now padded to the file's clock
(aresample=async=1:first_pts=0, as #409 did fordecode_pcm_mono) (#414). silence.py --filler --transcribeon silent audio blamed the Whisper build ("produced no
word-level timings") instead of refusing withreason: "no_speech"as contract.md promises;
a Whisper engine whose transcript holds no text is nowno_speech(#414).caption.py --transcribeon a video with no audio stream failed unclassified (kind: ffmpeg,
"Stream map '0:a:0' matches no streams"); it is refused askind: inputbefore any engine
runs, dry run included, assilence.pyrefuses it (#414).render.py --export-timeline(#414):- ignored the source's start timecode: a camera file tagged
01:00:00;00was exported with
source in/out00:00:01:00, outside the media for a conform. EDL source timecodes now count
from it (drop-frame labels where the source's timecode is drop-frame), the FCPXML asset
startand OTIOavailable_rangestart at it; - counted EDL source timecodes at the sequence rate, so a 25 fps clip in a 29.97 sequence got
frame:29; each clip's source timecode is now at its own rate; - kept a clip
outpast the end of its media (10 s of a 6 s clip, where the render clamps);
the clip now ends at the media's end, with a note, and aninat or past the end is refused
ascut.pyrefuses it; - dropped a chapter at or past the end silently, while the render's
metadata.pyrefuses it;
such a chapter, or one that does not come after the one before it, is now refused
(kind: input).
- ignored the source's start timecode: a camera file tagged
caption.py --mode muxcopied an input's own subtitle tracks whatever the output container, so
subrip from.mkvinto.mp4("Could not find tag for codec subrip") and mov_text into.mkv
failed unclassified. Existing tracks are now converted per container asexport.pyconverts
them (#380's rule, now shared in_common/runner.py, with WebVTT for.webm), a track no
container conversion fits (a bitmap one in.mp4/.webm) is refused askind: input, and so
is a.webmmux of a picture or sound WebM cannot hold (H.264/AAC) (#414).caption.pyhanded a caller's SRT that needed no layout change straight to ffmpeg's SRT reader,
which reads another grammar than the tool:00:01,000(no hours) was refused as
input_unreadable, and00:00:01,5was burned at 1.005 s where the tool counted 1.5 s. A file
whose timing lines are not in the grammar both share is burned and muxed as the copy the tool
writes (<out>_adjusted.srt; an extra--mode muxtrack as<out>_trackN.srt) (#414).- On Windows an explicit
--fontwas resolved by file-name prefix, so installed families were
missed and reported asfont_substituted"not installed here":Malgun Gothicresolved to
YuGothM.ttc(no Hangul),Microsoft YaHei,Nirmala UI,Leelawadee UIandTimes New Romantoarial.ttf. The family's own file is now looked up first in the table of what Windows
installs under which name (WINDOWS_FONTS, plus the common Latin families) (#414). contract --jsonleft out output keys the tools emit and contract.md documents
(dropped_non_av_streamson 19 tools; cut'smode,requested_*,output_duration,
duration_delta_seconds,nearest_keyframes,snap; silence'scut_points,cut_warnings,
removed_seconds_total,timemap,silence_kinds,silence_breakdown,hint; probe's
timecode,chapters,subtitle_stream_details) and three error reasons the ASR refusals
emit (no_speech,engine_failed,english_only). They are published, those three refusals
now also carryerror.reason/error.details(the top-levelreasonstays), and the test that
lists every refusal reason readsdie(..., reason=...)calls too (#414).- Review follow-ups:
caption.py --mode muxreports each track's language/title as the written file carries them, checks the--audio-streamit copies for.webm, converts an EIA-608 track (kept as is in.mov), and no longer copies an SRT whose cue text holds-->;silence.pyrefuses a non-finite or negative--margin; a Whisper segment with notextis notno_speech; a start timecode the source rate cannot have is read as none, and the EDLM2speed is at the clip's own rate (#414). - Subtitles, transcription, timeline export, Windows fonts and contract drift (#414) (#427)
What's Changed
- Subtitles, transcription, timeline export, Windows fonts and contract drift (#414) by @kajisho5 in #427
Full Changelog: v3.1.6...v3.1.7