# Changelog of Audio Transcription - Speech to Text, Audio to Text, Whisper (`tidytools/audio-transcriber`) Actor

- **URL**: https://apify.com/tidytools/audio-transcriber/changelog.md
- **Full Actor documentation**: https://apify.com/tidytools/audio-transcriber.md

## Audio Transcriber changelog

### 2026-11-07 (YUK-1238)

- New optional `subtitleQc` (off by default): each row gets a `subtitleQc` report of the saved SRT/VTT cues: overlapping cues, cues under 1 s, reading speed over 20 characters per second (11 for Chinese, Japanese, Korean and Thai), lines over 42 characters (16 for those scripts) and estimated cue times, with counts per rule and up to 100 warnings (cue number, start, end, rule, measured value). It is a mechanical check; the wording is not proofread. It says `skipped` when no subtitle file is saved.
- New optional `cleanAudio` (off by default): for a file, cloud-storage link or podcast episode that this run transcribed, a basic cleaned MP3 (noise reduction and loudness levelling, 96 kbps, files up to 2 hours) linked as `cleanedAudioUrl`. The transcript is still made from the original audio. YouTube, social/video platform pages and publisher transcripts are not processed. If the MP3 cannot be made or saved, the row keeps its transcript and says why in `cleanAudioError`.
- `"transcriptionEngine": "accurate"` without the cloud fallback (free plans, or `allowWorkersAiFallback: false`): when the self-hosted Whisper server cannot transcribe a piece, the free row is now `service_busy` and says so, with what to do (run again later or use `fast`). It used to be a `failed` row with an internal error ("Cannot read properties of undefined").
- Charging unchanged: no new events and no price change. Both options are free; warnings and clean-up errors never make a transcript fail, and the same files are charged the same audio minutes as before.

### 2026-11-05 (YUK-1089)

- YouTube videos in the transcription queue now let paid runs go first and take turns among runs on the same plan. The run reports its own estimated wait and, after video duration is known, an estimated completion time based on eligible nodes and their measured speeds.
- YouTube keeps using local Whisper while the service is busy; if it cannot finish in this run, the video gets a free retryable row. The cloud fallback switch applies only to files and audio URLs, never to YouTube.
- Charging: the price and events are unchanged. A completed video is charged its transcribed audio minutes; failed videos are free.

### 2026-11-05 (YUK-1191)

- One long file over your maximum cost per run no longer ends the batch: it gets a free `limit_reached` row and the shorter files after it can still run. New files stop once the limit cannot pay for another minute, or after 5 files were skipped for the maximum cost.
- `limit_reached` rows for the maximum cost now say what the file would cost and what is left of the limit. A page with no media file now says which link to pass instead.
- Charging: the price per minute and events are unchanged, and a run never goes over your limit. Files that fit after a skipped one are now transcribed and charged, where before they were not started.

### 2026-11-04 (YUK-1155)

- Speaker labels: when speech-to-text fails on any part of a file, the file now ends as a free `failed` row with `retryable: true`. It used to be reported as "no speech detected", or delivered with that part missing. A language that speaker labels do not support is now reported as `unsupported` with what to change, instead of "no speech detected".
- Charging: the price per minute and events are unchanged. A file with a failed part is no longer charged; files that transcribe completely are charged as before.

### 2026-11-03 (YUK-1087)

- YouTube videos waiting in the transcription queue no longer use up the daily speech-to-text allowance before transcription starts. This reduces premature capacity errors during large batches. Work waiting during a service restart can resume, and failed work has a clearer reason.
- Charging: the price per minute and events are unchanged. More videos may now finish successfully and be charged for the minutes actually transcribed; waiting or failed videos are not charged.

### 2026-11-01 (YUK-1031)

- An age-restricted YouTube video now fails only that video instead of pausing transcription for every video on the service. The failed video remains free; other videos can continue.
- Charging unchanged: no new events or price change; only successfully transcribed minutes are billed.

### 2026-10-26 (YUK-731)

- Apify storage links (`api.apify.com` key-value store records and dataset links, e.g. another Actor's output) are downloaded with no key first; the run's own token is tried only after Apify refuses that. A record that stays refused is a free `blocked` row saying what to change.
- A YouTube video skipped by the service for the run's max cost or `maxTotalMinutes` now ends the run like any other limit stop: `SUMMARY.limitReached`, `SUMMARY.remainingInputs` and the `REMAINING_INPUT` record list the files left. `limit_reached` rows say which limit it was and to run again with only the files left, so finished files are not charged twice.
- Charging unchanged: no new events, no price change; only transcribed minutes are billed.

### 2026-10-24 (YUK-672)

- SharePoint / OneDrive for Business "Anyone" links download through the site's `download.aspx?share=` (the link with `download=1` now ends on the sign-in page).
- Personal OneDrive links (`1drv.ms`, `onedrive.live.com`) are read the way OneDrive's web viewer reads them for a signed-out visitor (the old shares API answers 401); folders, non-audio files and private links are free rows before any download.
- A file opened inside a Dropbox shared folder (`/scl/fo/.../<file>`, `?preview=<file>`) downloads; a Box page whose owner turned off downloads, a removed Box link, a Box folder and a non-audio Box file are explained from the page itself.
- Failure types of share links: `private_link`, `needs_login`, `quota_exceeded`, `not_audio`, `too_large` (replacing `drive_not_shared`, `not_shared`, `drive_quota`, `share_quota`; a file without an audio track is `not_audio`), and failure rows get a one-sentence `howToFix`. `SUMMARY.failuresByReason` counts them. Charging unchanged: only transcribed minutes are billed.

### 2026-10-23 (YUK-639)

- Keep the last paragraph in sampled chapter prompts and the ending of untimed long transcripts in AI prompts.
- Add optional `contentPack` drafts: chapters, show notes, X and LinkedIn posts, plus one optional translated subtitle language billed through the existing minute event.
- Add one `content-pack` event per successful episode, eligible from 2026-11-06 only after its announced start date; otherwise the text pack is free.
- Default input and existing audio, summary and subtitle event behavior remain unchanged.

### 2026-10-23 (YouTube retries)

- YouTube batches retry short-lived service busy answers with a short backoff. Videos still busy are retried once more, serially, after the first batch. A video produces only one final row and is charged only if transcription succeeds.
- When the YouTube service's daily speech-to-text capacity is used up, the free row says when it resets (00:00 UTC, in about N hours) and points to RETRY_INPUT; those videos are not retried inside the run.
