---
title: "Changelog"
url: https://recursiveai.org/onespeech/docs/changelog/
description: "All notable changes are documented here, following Keep a Changelog."
version: "1.0.0"
source: https://github.com/recursive-ai-oss/onespeech-csharp/blob/63002de486786163a0a7800a51811e76d511fae6/CHANGELOG.md
---

# Changelog

All notable changes are documented here, following Keep a Changelog.

## [1.0.0] - 2026-11-10

First release. Measured results and limits: [docs/results.md](https://recursiveai.org/onespeech/docs/results/).

### Highlights
- **Transcription** with four model families behind one seam: Whisper (tiny to large-v3 and large-v3-turbo, the default), Qwen3-ASR 0.6B and 1.7B, FastConformer (Parakeet-TDT-0.6B-v3 and Nemotron 3.5 ASR streaming, by name), and Moonshine (the live default). VAD-first long-file chunking in constant memory, language identification, optional mixed-int8 variants.
- **Word timing** from the best available method in a fixed order (native, Qwen3-ForcedAligner, omniASR-CTC, DTW), recorded per word; public `Speech.Align` for any text and audio.
- **Diarization**: a tier-1 default of Silero VAD, CAM++ embeddings and spectral/AHC clustering with resegmentation, merged into the transcript. The default does **not** detect overlapping speech. Tier-2 upgrades, loaded by name from the publisher: Nemotron 3 Diarization (overlap-aware, up to eight speakers) and the gated pyannote segmentation-3.0 slot.
- **Speaker recognition**: embeddings (CAM++, ECAPA-TDNN), enrolment, identification and verification with calibrated thresholds; in-memory only, never persisted.
- **Live sessions** with one event model (`Partial`, `Final`, `Endpoint`, `SpeakerTurn`) on one audio clock; true streaming partials on Moonshine and Nemotron 3.5 ASR, utterance mode for the other families.
- **Contextual biasing** through `WithPhrases` where the model supports it; other models refuse with a typed error.
- **Packages**: `RecursiveAI.OneSpeech`, `.Media` (containers, SRT/VTT/ASS/TTML, caption muxing), `.Cli` (the `onespeech` tool), and offline weight packages `.Models.CamPlusEnglish`, `.Models.MoonshineTiny`, `.Models.MoonshineBase`, `.Models.MoonshineStreamingTiny`. NativeAOT and trim clean; no native code.
- **Models**: tier-1 (MIT, Apache-2.0) models download on first use; tier-2 (CC-BY-4.0, OpenMDW-1.1, gated) models load only by name from the publisher's files and are never redistributed.

Changes since the last preview follow.

### Added
- The gated pyannote segmentation-3.0 model in the segmentation slot, with an overlap-aware diarizer over it (`PyannoteDiarizer`), loaded from publisher files the user is entitled to; never a default.
- Mixed-int8 variants of Whisper large-v3-turbo, Whisper small and Moonshine streaming-tiny, selected by model ID (`-int8`) and converted locally from the same pinned weights; defaults remain fp32.
- Contextual phrase biasing through `SpeechRecognizer.WithPhrases`: Whisper prompt conditioning, Qwen3-ASR context, and shallow fusion over a phrase trie for Parakeet and custom CTC/RNN-T/TDT models. Families that cannot bias refuse with `CapabilityNotSupportedException`.
- `Speech.Enroll`, `Speech.Identify`, `Speech.Verify` and `Speech.ClearSpeakers`, with enrolled names on transcript speakers.
- `Speech.PrefetchAsync(language, model)` fetches every model a call would need.
- Path-input `*Async` overloads for every verb, and stream input for `TranscribeStream` and `DetectLanguageAsync`.
- Uniform `Load(ResolvedModel, ...)` and `LoadAsync(store, model, ...)` on every downloadable family.
- `ModelUnavailableException`, and `ModelId` on model errors.
- `TranscriptJsonConverter`, so plain System.Text.Json writes the documented schema-1 shape; value equality for `Transcript`, `Segment`, `Turn` and `ModelInfo`.

### Changed
- Requires RecursiveAI.OneModel 1.2.0.
- Faster CAM++ feature extraction with identical output.

### Fixed
- `Transcript.ToJson` and `FromJson` handle recordings up to 24 hours (documented limits, checked before allocating).
- One language-tag rule for every entry point; unsupported languages are refused, and `Align` no longer returns untimed words when no aligner applies.
- The role base classes implement `IDisposable`. Wrappers and sessions borrow, and never dispose, the models they use.
- `CreateLiveSession` accepts any `VoiceActivityDetector`.
- Consistent optional `language` and `cancellationToken` parameters, with the token last everywhere; `MediaInput.TranscribeStreamAsync` is renamed `TranscribeStream`.
- `WhisperOptions.Progress` is `IProgress<TimeSpan>`; `MoonshineOptions.IntraOpThreads` is renamed `Threads`; thread counts default to 1.
- Invalid in-memory PCM throws `ArgumentException`.
- The Silero VAD provenance ID is the catalog ID `silero/vad-v6.2.3`.

## [0.4.0-preview.1]

### Added
- Qwen3-ASR 0.6B and 1.7B recognition, language identification and context biasing, and Qwen3-ForcedAligner word timing.
- CTC forced alignment with omniASR-CTC-300M and public `Speech.Align` for any text and audio.
- Moonshine recognition with true streaming partials, incremental decoding with cached attention, and live sessions that keep up in real time on one core with no steady-state allocation in OneSpeech's own code per audio chunk.
- Online speaker clustering for live sessions.
- Parakeet-TDT-0.6B-v3 and Nemotron 3 Diarization by name, loaded from the publisher's files and converted locally. They are never defaults and are never redistributed. Nemotron 3 Diarization detects overlapping speech.
- Gated publisher models: a user token is sent only to the publisher's own file URLs, with typed errors for missing tokens, rejected tokens and gates not yet accepted.
- Custom CTC and RNN-T/TDT models of a known shape, decoded by the public `Decoding` primitives with native word timing.
- NeMo mel features.
- `RecursiveAI.OneSpeech.Media`: audio from any container OneMedia opens, caption export (`ToSrt`, `ToVtt`, `ToAss`, `ToTtml`) and caption muxing.
- Whisper large-v3.

### Changed
- Requires RecursiveAI.OneModel 1.2.0-preview.2.
- Qwen3 BF16 graphs are converted only when requested.

## [0.2.0-preview.1]

### Added
- Live sessions with one event model (`PartialEvent`, `FinalEvent`, `EndpointEvent`, `SpeakerTurnEvent`): finals are immutable, partials carry a revision, and all events share one audio clock. `Speech.Listen` and `Speech.TranscribeStream`; utterance mode (voice-activity endpointed finals) for offline recognizers.
- Chinese speech uses the Chinese CAM++ speaker embedder for diarization; other languages use the English one.
- A diarization speech-activity profile fitted on development meetings.

### Fixed
- Transcript JSON writes times exactly at 100-ns resolution instead of rounding through binary floating point.

## [0.1.0-preview.1]

### Added
- Shared speech contracts, the `Transcript` document model and its versioned, bounded JSON form.
- `Speech.Transcribe`, `TranscribeAsync` and `DetectLanguage`: transcription of WAV, MP3, FLAC, Ogg, M4A/3GP/ADTS and AMR files, returning words with timings, confidence and timing method, segments, language and speaker turns.
- Whisper recognition (tiny, base, small, large-v3-turbo) with greedy and beam decoding, temperature fallback, VAD-first long-form chunking, cross-attention word timing and language identification.
- Embedded Silero VAD v6.2.3.
- Speaker embeddings (CAM++ English and Chinese, ECAPA-TDNN), an in-memory speaker registry, and clustering diarization (spectral and agglomerative) merged into transcripts, including channel diarization for separated-party stereo. The clustering diarizer does not detect overlapping speech.
- A pinned model catalog with verified download, local conversion on first use, a per-user cache, the `ModelSource` hook and `onespeech models pull`.

### Known limitations
- Whisper large-v3 was refused with a typed error in this release (fixed in 0.4.0-preview.1).
