Sending entire recordings in one request can exceed provider limits.
Decode audio once to a shared PCM sample clock and split uploads at a
configurable maximum of 1 to 30 minutes, defaulting to 30 minutes.
Prefer nearby pauses and include six seconds of overlap to protect words
at audio cuts while keeping each encoded MP3 within the duration cap.
Request word timestamps for chunked text and SRT output. Match overlapping
words and times to retain each passage once, warn when a join falls back
to timestamps, and generate SRT cues on the original recording timeline.
Reuse subtitle timestamp validation without reordering regressing words.
Only emit output after every request and conversion succeeds.
Document the Python dependency, temporary storage, boundary limitations,
and lack of automatic retry or resume. Keep single-request text formatting.
Test Plan:
- python3 -B -m unittest -v: all 29 tests passed, including mocked provider
failures, native MP3 payload checks, boundary stitching, and SRT timing.
- bash -n transcribe and shellcheck transcribe: passed.
- git diff --cached --check: passed.
- Locally decoded and encoded the supplied 74-minute WebM into three MP3
chunks; ffprobe confirmed each duration was below 30 minutes.
- Live transcription was not verified: the configured 1Password credential
was unavailable.
SRT conversion previously rejected otherwise valid word timestamps when a
start preceded the previous word's start. Clamp regressing starts to the
preceding nonempty word's start and extend ends only when necessary.
Preserve transcript order and the original response while continuing to
reject malformed timestamps. Document the adjustment and cover regressions,
cue boundaries, blank words, and invalid input.
Test Plan:
- python3 -B -m unittest -v: all eight tests passed.
- CLI conversion of a synthetic regressing response: passed.
- git diff --cached --check: passed.
- Actual recording verification blocked by unavailable 1Password auth.
Convert the normalized audio to mono 16 kHz MP3 at 64 kbps with
FFmpeg's libmp3lame encoder instead of uncompressed WAV. This reduces
request payload size before base64 encoding and submitting to OpenRouter.
Update README documentation accordingly.
Convert audio and video audio tracks to mono 16 kHz WAV with FFmpeg,
then submit them to OpenRouter's MAI-Transcribe-2 endpoint. Read the API
key from the environment and print the transcript to stdout for easy
redirection. Store request payloads in temporary files to avoid shell
argument size limits, and document dependencies and usage.
Test Plan:
- bash -n transcribe and shellcheck transcribe passed.
- All eight documented formats passed local FFmpeg conversion and mocked
API request/response checks, including WAV rate and channel validation.
- git diff --cached --check passed.
- No live API request was made.