chore(deps): update ghcr.io/remsky/kokoro-fastapi-gpu docker tag to v0.9.0 #131

Open
renovate-bot wants to merge 1 commit from renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x into main
Member

This PR contains the following updates:

Package Update Change
ghcr.io/remsky/kokoro-fastapi-gpu minor v0.6.0 → v0.9.0

Release Notes

remsky/Kokoro-FastAPI (ghcr.io/remsky/kokoro-fastapi-gpu)

v0.9.0

Compare Source

Added
  • Voice clone-tuning from a short reference clip via inno-kokoro:
    • POST /dev/tune speaks with the tuned voice (passes through to /v1/audio/speech) or returns the .pt via return_voice_pack=true,
    • When ALLOW_LOCAL_VOICE_SAVING=true, saves it as <name>_tuned with save_voice=<name>.
    • Off by default, requires ENABLE_INNO_TUNER=true. See docs/inno-tune.md.
  • Web player: Tune tab (record or upload a clip, generate, download or save the pack).
  • Four tuned voices bundled with _inno suffix:
    • af_amelia_inno, af_goodall_inno, am_price_inno, bm_atten_inno.
  • normalization_options.remove_emoji, off by default: drop emoji instead of reading their names (#​353).
  • normalization_options.caps_normalization, on by default: all-caps names and headers read as words, short acronyms (FBI) still spelled.
Changed
  • Normalizer split into per-language classes, registry keyed by lang code.
    • CONTRIBUTING.md documents standardized contract to add additional languages
  • DEFAULT_VOICE applies to requests that omit a voice, not just warmup. Reported as default_voice on /v1/audio/voices.
  • Web player:
    • normalize checkbox replaced by a menu with every normalization_options field;
    • voice list sorted by grade then name, DEFAULT_VOICE preselected.
Fixed
  • Aborting a stream mid-playback no longer segfaults the server on a follow-up request with a new lang_code engine (#​288, #​337).
  • Blank lines end a sentence, single newlines still join (#​519, #​525 by @​Christian-Sidak).
  • Very long unpunctuated non-English text no longer truncates.
  • Blank or emoji-only input is a 400 on the streaming path too, not an empty 200.
  • Web player: voice search and alias minor fixes.
  • Normalization fixes:
    • Number reading: 3,497 as thousands not a year (#​259);
    • MP3, B2B, v1.0, COVID-19 read as written;
    • .5 as zero point five; long digit runs no longer stall or 500.
    • Phone numbers, 3.5 GHz, 1 min (with unit_normalization), DVDs/DVD's, 12:30:15 pm read correctly.
    • -- reads as a dash and no longer fuses words or drops word timestamps (#​249).

v0.8.2

Compare Source

Added
  • Optional model auto-unload after an idle timeout (MODEL_AUTO_UNLOAD_TIMEOUT_SECONDS, default off) to release VRAM. Reloads on the next request. /dev/model reports load/idle state and POST /dev/reload pre-warms the model, both behind ALLOW_DEV_UNLOAD.
  • /v1/audio/voices entries carry the per-voice grades from VOICES.md, where graded; added in web player dropdown w/ hover for the target quality and training duration.
  • Web player: Normalize text toggle in settings, off sends input as written (#​391, #​523 by @​webdevsamran).
Changed
  • Sentence splitting via UAX #​29 segmentation instead of regex; e.g: etc., Dr., and CJK punctuation split more accurately (#​308, adapts #​415 by @​lionel-rowe).
  • ROCm: MIOpen off by default for better performance re: tensor shape recompilation (2.4s vs 0.27s on gfx1100). ENABLE_MIOPEN=true restores it (#​518 by @​s-kerdel).
  • Compose files no longer mount api/ or set defaults already baked into the image (DOWNLOAD_MODEL, PYTHONPATH, etc).
Fixed

v0.8.1

Compare Source

Fixed
  • /v1/audio/voices/combine accepts weighted syntax (af_bella(2)+af_sky(1)), matching the speech endpoints (#​285).
  • Oversized or pause-heavy requests now return 400 to avoid exhausting memory (reported by @​sshpie, GHSA-f64g-9jmv-pm22). Two new configurable limits:
    • MAX_INPUT_LENGTH (default 1_000_000) caps characters of text per request.
    • MAX_TOTAL_PAUSE_S (default 300) caps total [pause:Ns] / SSML <break> silence per request.
  • Native Windows installs (start-cpu.ps1 etc) no longer need a C++ toolchain: pyopenjtalk-plus (a drop-in fork with prebuilt Windows wheels) replaces pyopenjtalk on win32 only (#​508, proposed by @​siliconfps). Needs a recent uv. Linux, macOS, and Docker are unchanged.
Changed
  • Documented WEB_CONCURRENCY (uvicorn worker count) in docs/configuration.md for parallel model loads/concurrency (#​115, #​358).
  • Improved time-to-first-audio; sentence phonemization emits to avoid a first full-request pass. Some gradual latency growth at larger input sizes due to normalization pass.
Input v0.8.0 (eager) v0.8.1 (lazy)
5k chars 0.31 s 0.26 s -16%
10k chars 0.30 s 0.27 s -10%
50k chars 0.45 s 0.29 s -36%
100k chars 0.73 s 0.31 s -58%
250k chars 1.41 s 0.45 s -68%
500k chars 2.78 s 0.56 s -80%
1M chars 5.21 s 0.85 s -84%

v0.8.0

Compare Source

Added
  • Multi-speaker input on /v1/audio/speech and /dev/captioned_speech (#​294). Opt in per request with allow_voice_tags: true; disable server-wide with ENABLE_VOICE_TAGS=false.
    • Inline [voice:name] tags switch speaker mid-text.
    • voice_aliases mapping for named weighted voice mixes, with optional per-alias rate.
    • /dev/captioned_speech timestamps carry the resolved voice per word; the field is absent unless allow_voice_tags is on, so existing responses are unchanged.
  • POST /dev/dialogue for ordered multi-speaker turns.
  • SSML input (experimental). Disable server-wide with ENABLE_SSML=false.
    • ssml: true on /v1/audio/speech and /dev/captioned_speech translates and speaks in one call. Requires allow_voice_tags: true, since the translation emits [voice:] and [rate:] spans.
    • POST /dev/ssml returns the translated tokens as text instead, for inspecting them before synthesis.
  • return_timing on /v1/audio/speech: per-chunk {text, start, end} JSON sidecar next to the download (powers the web reader).
  • MAX_PAUSE_DURATION_S (default 60) caps a single [pause:Ns] tag or SSML <break>.
  • Web UI:
    • Voice alias/tag cast builder with import/export, pinning, and per-alias rate, synced with the editor (re: parallel work by @​radzrader, #​272).
    • Read-along mode: sentence highlighting synced to playback, bidirectional click to seek.
    • Find/replace across pages, direct page-number entry, download menu (audio / timings / both).
  • Wiki pages moved into docs/, versioned alongside the code.
Changed
  • Docker images compile to bytecode at build, ~40% faster startup.
  • Containers launch uvicorn directly rather than through uv run, which resolves startup permission failures on Unraid and similar hosts.
  • [rate:] tags scale the speaking voice's alias rate instead of replacing it, so a voice calibrated to 0.8 stays proportionally slower under [rate:1.1]. Matches how SSML engines treat rate.
  • Speed bounds (0.25 to 4.0) shared across speed fields and SSML.
  • Unrecognized .env keys warn at startup instead of refusing to boot.
  • README config table now covers every setting.
Fixed
  • Long generations swap from the live stream to the finished file as soon as it lands, so the scrubber shows true duration and seeking works mid-run.
  • Volume control state reconnected to the player.
Removed
  • Unused ffmpeg from all images (~600MB); audio encoding already runs through PyAV's bundled copy.
  • Dead pydub dependency.
  • Unreachable list form of voice from the speech parser and unused VoiceCombineRequest schema.
  • Legacy Gradio UI (ui/) code cruft; superseded by the web player since ~v0.2.0
  • Legacy ONNX config compose vars, endpoints e.g /debug/session_pools.
  • OUTPUT_DIR, OUTPUT_DIR_SIZE_LIMIT_MB, SAMPLE_RATE settings, never read.

v0.7.2

Compare Source

Security
  • fastapi>=0.128.8, starlette>=1.3.1 to close CVE-2025-62727 (quadratic Range header parsing in FileResponse, reachable through the audio download path) (#​500).
Changed
  • CORS allow_credentials now defaults off. Starlette 1.x echoes the caller's origin with allow-credentials: true where 0.47 returned *; nothing here uses cookies or auth, so this keeps the prior behavior.
  • Docker build cache moved from GHA to the GHCR registry so forks and local builds can pull it, plus uv cache mounts and reordered test-client layers (#​501).
  • response_format docs (correctly) now list aac as supported.
Fixed

v0.7.1

Compare Source

Added
  • /v1/download/{filename} takes an optional ?name= save-as name (sanitized, stored extension kept) and sets it in Content-Disposition. Omitting it keeps the previous name.
  • Web UI keyboard navigation and ARIA labeling across header, player controls, and editor.
Changed
  • Content-Disposition is now built by FileResponse rather than by hand, so the filename comes back quoted (filename="x.mp3") instead of bare. The name itself is unchanged when ?name= is omitted.
  • Web UI restyle: better use of space, responsive down to slim widths, playbar pinned to the bottom on narrow viewports.
  • Waveform slowed and softened, made framerate-independent, respects prefers-reduced-motion.
  • README: AMD GPU (ROCm) troubleshooting, clarified docker-compose comments.
Fixed
  • Downloads save as {voice}_{timestamp}.{format}, not the temp name (#​338). Covers right-click "Save audio as" too, since Content-Disposition outranks the link's download attribute.
  • Aborted streams no longer surface as playback failures; a user-initiated MEDIA_ERR_ABORTED is told apart from a real error.
  • Stream-to-file swap settles pending buffer operations instead of leaving the feeder awaiting forever.

v0.7.0

Compare Source

Added
  • AGENTS.md contributor guidelines, plus SKILL.md notes for the API, benchmarks, and web areas.
Changed / Optimizations
  • Docker images build on Python 3.12 (project floor stays 3.10 for local installs). Rust dropped from the CPU builder.
  • Runtime dependencies trimmed to remove deprecated imports
  • bumped requests,python-dotenv, capped transformers<6
  • Builds now explicitly require BuildKit (default since Docker 23, ~Jan 2023); utilizing COPY --exclude
  • Model bake reworked to ensure weights land exactly once (whether prexisting or downloaded at build)
  • ROCm image now bakes the model at build like CPU/GPU (instead of a first-run fetch)
  • GPU runtime now only uses torch shipped cuDNN/etc via pip wheels (#​482). (see table below for size changes)
  • Transcription benchmark reports split by device; RTF and first-token baselines refreshed.

Compressed image sizes + new bases:

Image v0.6.0 v0.7.0 Runtime base
cpu 1.66 GB 1.56 GB python:3.10-slim -> python:3.12-slim
gpu 6.81 GB 4.68 GB cuda:12.6.3-cudnn-runtime -> cuda:12.6.3-base
gpu (cu128) 8.11 GB 5.23 GB cuda:12.8.1-cudnn-runtime -> cuda:12.8.1-base
rocm 13.08 GB 13.36 GB unchanged; model now baked in
Fixed
  • Model validation checksums against downloaded release artifact to ensure consistency, downloads first to a temp dir to avoid clobbering pre-existing models in the case of network issues/corrupted downloads.
  • Model validation also rejects any custom files under 100MB to avoids false pass results (e.g. a 9-byte "Not found"), allowing a re-download instead of passing (#​301).
  • .dockerignore Fixed pycache ignore pattern to **/ to ensure nested .pyc/etc stay out of build contexts.
  • Removed dead pydub imports from the audio services.
  • _find_file rejects lookups that escape its search roots (../ sequences, absolute paths) to avoid unintentional exposure of files outside the voices/models/web dirs. Symlinks placed inside those dirs resolve as before.
  • Text normalizer: anchored decimal regex to prevent quadratic backtracking on digit floods, reordered range substitution so NUMBER_PATTERN no longer swallows hyphens meant as range separators, added version-number handling (2.0.1 renders as "two point zero point one" instead of being split).

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/remsky/kokoro-fastapi-gpu](https://github.com/remsky/Kokoro-FastAPI) | minor | `v0.6.0` → `v0.9.0` | --- ### Release Notes <details> <summary>remsky/Kokoro-FastAPI (ghcr.io/remsky/kokoro-fastapi-gpu)</summary> ### [`v0.9.0`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v090---2026-09-09) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.8.2...v0.9.0) ##### Added - Voice clone-tuning from a short reference clip via [inno-kokoro](https://github.com/remsky/inno-kokoro): - `POST /dev/tune` speaks with the tuned voice (passes through to `/v1/audio/speech`) or returns the `.pt` via `return_voice_pack=true`, - When `ALLOW_LOCAL_VOICE_SAVING=true`, saves it as `<name>_tuned` with `save_voice=<name>`. - Off by default, requires `ENABLE_INNO_TUNER=true`. See [docs/inno-tune.md](docs/inno-tune.md). - Web player: Tune tab (record or upload a clip, generate, download or save the pack). - Four tuned voices bundled with `_inno` suffix: - `af_amelia_inno`, `af_goodall_inno`, `am_price_inno`, `bm_atten_inno`. - `normalization_options.remove_emoji`, off by default: drop emoji instead of reading their names ([#&#8203;353](https://github.com/remsky/Kokoro-FastAPI/issues/353)). - `normalization_options.caps_normalization`, on by default: all-caps names and headers read as words, short acronyms (`FBI`) still spelled. ##### Changed - Normalizer split into per-language classes, registry keyed by lang code. - CONTRIBUTING.md documents standardized contract to add additional languages - `DEFAULT_VOICE` applies to requests that omit a voice, not just warmup. Reported as `default_voice` on `/v1/audio/voices`. - Web player: - normalize checkbox replaced by a menu with every `normalization_options` field; - voice list sorted by grade then name, `DEFAULT_VOICE` preselected. ##### Fixed - Aborting a stream mid-playback no longer segfaults the server on a follow-up request with a new lang\_code engine ([#&#8203;288](https://github.com/remsky/Kokoro-FastAPI/issues/288), [#&#8203;337](https://github.com/remsky/Kokoro-FastAPI/issues/337)). - Blank lines end a sentence, single newlines still join ([#&#8203;519](https://github.com/remsky/Kokoro-FastAPI/issues/519), [#&#8203;525](https://github.com/remsky/Kokoro-FastAPI/issues/525) by [@&#8203;Christian-Sidak](https://github.com/Christian-Sidak)). - Very long unpunctuated non-English text no longer truncates. - Blank or emoji-only input is a 400 on the streaming path too, not an empty 200. - Web player: voice search and alias minor fixes. - Normalization fixes: - Number reading: `3,497` as thousands not a year ([#&#8203;259](https://github.com/remsky/Kokoro-FastAPI/issues/259)); - `MP3`, `B2B`, `v1.0`, `COVID-19` read as written; - `.5` as zero point five; long digit runs no longer stall or 500. - Phone numbers, `3.5 GHz`, `1 min` (with `unit_normalization`), `DVDs`/`DVD's`, `12:30:15 pm` read correctly. - `--` reads as a dash and no longer fuses words or drops word timestamps ([#&#8203;249](https://github.com/remsky/Kokoro-FastAPI/issues/249)). ### [`v0.8.2`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v082---2026-09-05) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.8.1...v0.8.2) ##### Added - Optional model auto-unload after an idle timeout (`MODEL_AUTO_UNLOAD_TIMEOUT_SECONDS`, default off) to release VRAM. Reloads on the next request. `/dev/model` reports load/idle state and `POST /dev/reload` pre-warms the model, both behind `ALLOW_DEV_UNLOAD`. - `/v1/audio/voices` entries carry the per-voice grades from [VOICES.md](https://huggingface.co/hexgrad/Kokoro-82M/blob/main/VOICES.md), where graded; added in web player dropdown w/ hover for the target quality and training duration. - Web player: `Normalize text` toggle in settings, off sends input as written ([#&#8203;391](https://github.com/remsky/Kokoro-FastAPI/issues/391), [#&#8203;523](https://github.com/remsky/Kokoro-FastAPI/issues/523) by [@&#8203;webdevsamran](https://github.com/webdevsamran)). ##### Changed - Sentence splitting via UAX [#&#8203;29](https://github.com/remsky/Kokoro-FastAPI/issues/29) segmentation instead of regex; e.g: `etc.`, `Dr.`, and CJK punctuation split more accurately ([#&#8203;308](https://github.com/remsky/Kokoro-FastAPI/issues/308), adapts [#&#8203;415](https://github.com/remsky/Kokoro-FastAPI/issues/415) by [@&#8203;lionel-rowe](https://github.com/lionel-rowe)). - ROCm: MIOpen off by default for better performance re: tensor shape recompilation (2.4s vs 0.27s on gfx1100). `ENABLE_MIOPEN=true` restores it ([#&#8203;518](https://github.com/remsky/Kokoro-FastAPI/issues/518) by [@&#8203;s-kerdel](https://github.com/s-kerdel)). - Compose files no longer mount `api/` or set defaults already baked into the image (`DOWNLOAD_MODEL`, `PYTHONPATH`, etc). ##### Fixed - `DEFAULT_VOICE_CODE` now applies on the speech endpoints and `/dev/generate_from_phonemes` ([#&#8203;514](https://github.com/remsky/Kokoro-FastAPI/issues/514), [#&#8203;515](https://github.com/remsky/Kokoro-FastAPI/issues/515) by [@&#8203;Christian-Sidak](https://github.com/Christian-Sidak), [#&#8203;516](https://github.com/remsky/Kokoro-FastAPI/issues/516)). - Entrypoint and `start-*.sh` honour `HOST` / `PORT`, so `HOST=::` binds IPv6-only ([#&#8203;408](https://github.com/remsky/Kokoro-FastAPI/issues/408), reported by [@&#8203;felixls](https://github.com/felixls)). ### [`v0.8.1`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v081---2026-08-24) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.8.0...v0.8.1) ##### Fixed - `/v1/audio/voices/combine` accepts weighted syntax (`af_bella(2)+af_sky(1)`), matching the speech endpoints ([#&#8203;285](https://github.com/remsky/Kokoro-FastAPI/issues/285)). - Oversized or pause-heavy requests now return 400 to avoid exhausting memory (reported by [@&#8203;sshpie](https://github.com/sshpie), GHSA-f64g-9jmv-pm22). Two new configurable limits: - `MAX_INPUT_LENGTH` (default 1\_000\_000) caps characters of text per request. - `MAX_TOTAL_PAUSE_S` (default 300) caps total `[pause:Ns]` / SSML `<break>` silence per request. - Native Windows installs (`start-cpu.ps1` etc) no longer need a C++ toolchain: `pyopenjtalk-plus` (a drop-in fork with prebuilt Windows wheels) replaces `pyopenjtalk` on win32 only ([#&#8203;508](https://github.com/remsky/Kokoro-FastAPI/issues/508), proposed by [@&#8203;siliconfps](https://github.com/siliconfps)). Needs a recent `uv`. Linux, macOS, and Docker are unchanged. ##### Changed - Documented `WEB_CONCURRENCY` (uvicorn worker count) in `docs/configuration.md` for parallel model loads/concurrency ([#&#8203;115](https://github.com/remsky/Kokoro-FastAPI/issues/115), [#&#8203;358](https://github.com/remsky/Kokoro-FastAPI/issues/358)). - Improved time-to-first-audio; sentence phonemization emits to avoid a first full-request pass. Some gradual latency growth at larger input sizes due to normalization pass. <div align="center"> | Input | v0.8.0 (eager) | v0.8.1 (lazy) | | | :--------- | -------------: | ------------: | ---: | | 5k chars | 0.31 s | 0.26 s | -16% | | 10k chars | 0.30 s | 0.27 s | -10% | | 50k chars | 0.45 s | 0.29 s | -36% | | 100k chars | 0.73 s | 0.31 s | -58% | | 250k chars | 1.41 s | 0.45 s | -68% | | 500k chars | 2.78 s | 0.56 s | -80% | | 1M chars | 5.21 s | 0.85 s | -84% | </div> ### [`v0.8.0`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v080---2026-08-14) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.7.2...v0.8.0) ##### Added - Multi-speaker input on `/v1/audio/speech` and `/dev/captioned_speech` ([#&#8203;294](https://github.com/remsky/Kokoro-FastAPI/issues/294)). Opt in per request with `allow_voice_tags: true`; disable server-wide with `ENABLE_VOICE_TAGS=false`. - Inline `[voice:name]` tags switch speaker mid-text. - `voice_aliases` mapping for named weighted voice mixes, with optional per-alias `rate`. - `/dev/captioned_speech` timestamps carry the resolved `voice` per word; the field is absent unless `allow_voice_tags` is on, so existing responses are unchanged. - `POST /dev/dialogue` for ordered multi-speaker turns. - SSML input (experimental). Disable server-wide with `ENABLE_SSML=false`. - `ssml: true` on `/v1/audio/speech` and `/dev/captioned_speech` translates and speaks in one call. Requires `allow_voice_tags: true`, since the translation emits `[voice:]` and `[rate:]` spans. - `POST /dev/ssml` returns the translated tokens as text instead, for inspecting them before synthesis. - `return_timing` on `/v1/audio/speech`: per-chunk `{text, start, end}` JSON sidecar next to the download (powers the web reader). - `MAX_PAUSE_DURATION_S` (default 60) caps a single `[pause:Ns]` tag or SSML `<break>`. - Web UI: - Voice alias/tag cast builder with import/export, pinning, and per-alias rate, synced with the editor (re: parallel work by [@&#8203;radzrader](https://github.com/radzrader), [#&#8203;272](https://github.com/remsky/Kokoro-FastAPI/discussions/272)). - Read-along mode: sentence highlighting synced to playback, bidirectional click to seek. - Find/replace across pages, direct page-number entry, download menu (audio / timings / both). - Wiki pages moved into `docs/`, versioned alongside the code. ##### Changed - Docker images compile to bytecode at build, \~40% faster startup. - Containers launch uvicorn directly rather than through `uv run`, which resolves startup permission failures on Unraid and similar hosts. - `[rate:]` tags scale the speaking voice's alias rate instead of replacing it, so a voice calibrated to 0.8 stays proportionally slower under `[rate:1.1]`. Matches how SSML engines treat rate. - Speed bounds (0.25 to 4.0) shared across speed fields and SSML. - Unrecognized `.env` keys warn at startup instead of refusing to boot. - README config table now covers every setting. ##### Fixed - Long generations swap from the live stream to the finished file as soon as it lands, so the scrubber shows true duration and seeking works mid-run. - Volume control state reconnected to the player. ##### Removed - Unused `ffmpeg` from all images (\~600MB); audio encoding already runs through PyAV's bundled copy. - Dead `pydub` dependency. - Unreachable list form of `voice` from the speech parser and unused `VoiceCombineRequest` schema. - Legacy Gradio UI (`ui/`) code cruft; superseded by the web player since \~v0.2.0 - Legacy ONNX config compose vars, endpoints e.g `/debug/session_pools`. - `OUTPUT_DIR`, `OUTPUT_DIR_SIZE_LIMIT_MB`, `SAMPLE_RATE` settings, never read. ### [`v0.7.2`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v072-2026-08-06) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.7.1...v0.7.2) ##### Security - `fastapi>=0.128.8`, `starlette>=1.3.1` to close CVE-2025-62727 (quadratic `Range` header parsing in `FileResponse`, reachable through the audio download path) ([#&#8203;500](https://github.com/remsky/Kokoro-FastAPI/issues/500)). ##### Changed - CORS `allow_credentials` now defaults off. Starlette 1.x echoes the caller's origin with `allow-credentials: true` where 0.47 returned `*`; nothing here uses cookies or auth, so this keeps the prior behavior. - Docker build cache moved from GHA to the GHCR registry so forks and local builds can pull it, plus uv cache mounts and reordered test-client layers ([#&#8203;501](https://github.com/remsky/Kokoro-FastAPI/issues/501)). - `response_format` docs (correctly) now list `aac` as supported. ##### Fixed - FLAC and WAV no longer lose the tail end of the audio; better muxer header patching at finalize ([#&#8203;497](https://github.com/remsky/Kokoro-FastAPI/issues/497), covers [#&#8203;448](https://github.com/remsky/Kokoro-FastAPI/issues/448) and [#&#8203;463](https://github.com/remsky/Kokoro-FastAPI/issues/463)). Diagnosis by [@&#8203;Technologicat](https://github.com/Technologicat). ### [`v0.7.1`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v071---2026-08-02) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.7.0...v0.7.1) ##### Added - `/v1/download/{filename}` takes an optional `?name=` save-as name (sanitized, stored extension kept) and sets it in `Content-Disposition`. Omitting it keeps the previous name. - Web UI keyboard navigation and ARIA labeling across header, player controls, and editor. ##### Changed - `Content-Disposition` is now built by `FileResponse` rather than by hand, so the filename comes back quoted (`filename="x.mp3"`) instead of bare. The name itself is unchanged when `?name=` is omitted. - Web UI restyle: better use of space, responsive down to slim widths, playbar pinned to the bottom on narrow viewports. - Waveform slowed and softened, made framerate-independent, respects `prefers-reduced-motion`. - README: AMD GPU (ROCm) troubleshooting, clarified docker-compose comments. ##### Fixed - Downloads save as `{voice}_{timestamp}.{format}`, not the temp name ([#&#8203;338](https://github.com/remsky/Kokoro-FastAPI/issues/338)). Covers right-click "Save audio as" too, since `Content-Disposition` outranks the link's `download` attribute. - Aborted streams no longer surface as playback failures; a user-initiated `MEDIA_ERR_ABORTED` is told apart from a real error. - Stream-to-file swap settles pending buffer operations instead of leaving the feeder awaiting forever. ### [`v0.7.0`](https://github.com/remsky/Kokoro-FastAPI/blob/HEAD/CHANGELOG.md#v070---2026-07-31) [Compare Source](https://github.com/remsky/Kokoro-FastAPI/compare/v0.6.0...v0.7.0) ##### Added - `AGENTS.md` contributor guidelines, plus `SKILL.md` notes for the API, benchmarks, and web areas. ##### Changed / Optimizations - Docker images build on Python 3.12 (project floor stays 3.10 for local installs). Rust dropped from the CPU builder. - Runtime dependencies trimmed to remove deprecated imports - bumped `requests`,`python-dotenv`, capped `transformers<6` - Builds now explicitly require BuildKit (default since Docker 23, \~Jan 2023); utilizing `COPY --exclude` - Model bake reworked to ensure weights land exactly once (whether prexisting or downloaded at build) - ROCm image now bakes the model at build like CPU/GPU (instead of a first-run fetch) - GPU runtime now only uses torch shipped cuDNN/etc via pip wheels ([#&#8203;482](https://github.com/remsky/Kokoro-FastAPI/issues/482)). (see table below for size changes) - Transcription benchmark reports split by device; RTF and first-token baselines refreshed. Compressed image sizes + new bases: <div align="center"> | Image | v0.6.0 | v0.7.0 | Runtime base | | :---------- | -------: | -------: | :------------------------------------------------ | | cpu | 1.66 GB | 1.56 GB | `python:3.10-slim` -> `python:3.12-slim` | | gpu | 6.81 GB | 4.68 GB | `cuda:12.6.3-cudnn-runtime` -> `cuda:12.6.3-base` | | gpu (cu128) | 8.11 GB | 5.23 GB | `cuda:12.8.1-cudnn-runtime` -> `cuda:12.8.1-base` | | rocm | 13.08 GB | 13.36 GB | unchanged; model now baked in | </div> ##### Fixed - Model validation checksums against downloaded release artifact to ensure consistency, downloads first to a temp dir to avoid clobbering pre-existing models in the case of network issues/corrupted downloads. - Model validation also rejects any custom files under 100MB to avoids false pass results (e.g. a 9-byte "Not found"), allowing a re-download instead of passing (#&#8203;301). - `.dockerignore` Fixed pycache ignore pattern to `**/` to ensure nested .pyc/etc stay out of build contexts. - Removed dead `pydub` imports from the audio services. - `_find_file` rejects lookups that escape its search roots (`../` sequences, absolute paths) to avoid unintentional exposure of files outside the voices/models/web dirs. Symlinks placed inside those dirs resolve as before. - Text normalizer: anchored decimal regex to prevent quadratic backtracking on digit floods, reordered range substitution so `NUMBER_PATTERN` no longer swallows hyphens meant as range separators, added version-number handling (`2.0.1` renders as "two point zero point one" instead of being split). </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTMuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI1My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
renovate-bot force-pushed renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x from 8425cb520e to a1b6ceaf86 2026-09-21 19:16:47 +00:00 Compare
renovate-bot changed title from chore(deps): update ghcr.io/remsky/kokoro-fastapi-gpu docker tag to v0.7.1 to chore(deps): update ghcr.io/remsky/kokoro-fastapi-gpu docker tag to v0.9.0 2026-09-21 19:16:49 +00:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x:renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x

Merge

Merge the changes and update on Forgejo.
git switch main
git merge --no-ff renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git rebase main
git switch main
git merge --ff-only renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git rebase main
git switch main
git merge --no-ff renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch main
git merge --squash renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch main
git merge --ff-only renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git switch main
git merge renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ops/homelab!131
No description provided.