v1.1.0 #522
ZachNagengast
announced in
Announcements
v1.1.0
#522
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Highlights
promptTokens, Chinese word timestamps,transcribeWithOptions, TTS chunk boundaries, and the model load/cache path.Warning
TTSKit's default model variants changed (a one-time download on upgrade) and speech generation now requires macOS 15 / iOS 18. The previous assets remain supported - see Model Assets.
WhisperKit: Incremental File Loading
By default, WhisperKit decodes an entire audio file into memory before transcribing, which can lead to OOM situations for multi-hour audio files.
.incrementalstreams it from disk in bounded-memory chunks instead:Chunks are cut at silence (VAD) boundaries, so the transcript matches a full-file run with
chunkingStrategy: .vad- only peak memory differs. Tune with.incremental(chunkDuration:chunkBufferSize:)(defaults: 120s chunks, 2 chunks buffered at a time).Also available via CLI:
swift run argmax-cli transcribe \ --model large-v3-v20240930_626MB \ --audio-path "path/to/large-audio.wav" \ --incremental-loadingThis will become a default option in a future release, so let us know how it works for you!
TTSKit: Faster Models
Both Qwen3-TTS decoders now ship as multifunction Core ML assets, which lets us load slightly different model forward pass configurations using the same set of weights.
SpeechDecoder (
TTSKitConfig.speechDecoderMode):.latencyOptimized(default, 1 audio frame/call, ~80ms in length) for lowest time-to-first-audio, or.throughputOptimized(4 frames/call, ~320ms) to speed up throughput overall at the cost of a slower initial buffer.MultiCodeDecoder (
TTSKitConfig.multiCodeDecoderMode): a talker frame expands into 15 residual codes..stepped(default) does that in 16 Core ML calls with host-side sampling;.fuseddoes the whole frame in one call with sampling and lookups inside the graph.Benchmarks in #494 and #513.
Via CLI:
swift run -c release argmax-cli tts --text "Hello there." \ --speech-decoder-mode throughputOptimized \ --multi-code-decoder-mode fused --playThe mode is read once at model load since it's considered an entirely separate model to the OS. Set it before constructing
TTSKit, or reload to switch at runtime. The two modes don't produce byte-identical audio, but it's audibly indistinguishable - fused sampling draws a different but equally valid sequence. The TTSKitExample app gains sidebar pickers for both modes.The layout is detected from the asset at load time, so the legacy single-function
W8A16variants keep working (#520) - see Model Assets.SpeakerKit: Speaker Centroid Embeddings
DiarizationResultnow carriesspeakerCentroidEmbeddings: [Int: [Float]]which can be used to link speakers across separate diarization runs without re-running the embedder:Within a single result - compare two local speaker ids:
Across separate runs - each
diarize(...)assigns its own localspeakerIds (0,1, …). To link speakers in a later chunk to an earlier one, take a centroid from the earlier result and pass it tonearestSpeakerCentroid(to:)on the later result:Centroids are in raw embedder space, so pick your own distance threshold that works best for your data.
Model Assets
TTSKit's default variants moved to multifunction assets:
W8A16W8A16-multifunctionW8A16W8A16-multifunctionBoth are published on
argmaxinc/ttskit-coremland download automatically on your nextsetupModels()/ first launch from huggingface. Expect a one-time download on upgrade if the models were downloaded previously, or:Keeping the previous
W8A16assetsThe decoders detect the model types at load time, so the legacy single-function variants keep working if you pin them to the pre-v1.1.0 variants:
If the assets are already in your cache, this will use them instead of downloading the new models.
The legacy assets only implement the default modes. Requesting
.throughputOptimizedor.fusedagainst them throwsTTSError.invalidConfigurationnaming the multifunction variant to use, rather than silently falling back.New minimum OS for TTSKit
TTSKit speech generation now requires macOS 15, iOS 18, watchOS 11, or visionOS 2 — the decode path moved to
MLTensor, and the pre-macOS 15 path was removed. This applies to both asset layouts, so pinningW8A16doesn't avoid it;loadModels()throwsTTSError.modelLoadingFailedon older OS versions. The package's declared platforms are unchanged (iOS 16 / macOS 13) and WhisperKit and SpeakerKit are unaffected - but a TTSKit app targeting iOS 17 will build and then fail at model load. We recommend available flags on your TTS entry points with#available(iOS 18, macOS 15, *), if you support iOS 17 or below.API Changes
Deprecations
AudioInputConfig->AudioInputOptions(typealias kept).WhisperKit.audioInputConfig->WhisperKit.audioInputOptions.WhisperKitConfig.audioInputConfig-> passaudioInputOptionsper call totranscribe(...). The stored value still works as the instance default.Breaking changes
Callers of
TTSKitare unaffected, but if you have a custom class that conforms to the SpeechDecoding protocol, the following changes are needed:decodeFrame(codes:cache:)/decodeFrameAsync(codes:cache:)takecodes: [[Int32]]instead of[Int32]- an outer array ofcodesPerStepframes.codesPerStep: Int, read from the loaded model'saudio_codesinput shape.New CLI flags
Community
Big thanks to everyone who shipped code, filed issues, and dug into reproductions for this release. 🙏
NLLanguagenormalization bug that had been breaking Chinese word timestamps for quite some time (#511).promptTokensempty-transcription bug (#514).This is a big release so let us know how it goes in your testing. Open an issue or join us in Discord. 🚀
What's Changed
promptTokensare set by @a2they in Fix empty transcription whenpromptTokensare set #514New Contributors
Full Changelog: v1.0.0...v1.1.0
This discussion was created from the release v1.1.0.
All reactions