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.
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.Alignfor 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
WithPhraseswhere the model supports it; other models refuse with a typed error. - Packages:
RecursiveAI.OneSpeech,.Media(containers, SRT/VTT/ASS/TTML, caption muxing),.Cli(theonespeechtool), 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 withCapabilityNotSupportedException. Speech.Enroll,Speech.Identify,Speech.VerifyandSpeech.ClearSpeakers, with enrolled names on transcript speakers.Speech.PrefetchAsync(language, model)fetches every model a call would need.- Path-input
*Asyncoverloads for every verb, and stream input forTranscribeStreamandDetectLanguageAsync. - Uniform
Load(ResolvedModel, ...)andLoadAsync(store, model, ...)on every downloadable family. ModelUnavailableException, andModelIdon model errors.TranscriptJsonConverter, so plain System.Text.Json writes the documented schema-1 shape; value equality forTranscript,Segment,TurnandModelInfo.
Changed
- Requires RecursiveAI.OneModel 1.2.0.
- Faster CAM++ feature extraction with identical output.
Fixed
Transcript.ToJsonandFromJsonhandle recordings up to 24 hours (documented limits, checked before allocating).- One language-tag rule for every entry point; unsupported languages are refused, and
Alignno 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. CreateLiveSessionaccepts anyVoiceActivityDetector.- Consistent optional
languageandcancellationTokenparameters, with the token last everywhere;MediaInput.TranscribeStreamAsyncis renamedTranscribeStream. WhisperOptions.ProgressisIProgress<TimeSpan>;MoonshineOptions.IntraOpThreadsis renamedThreads; 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.Alignfor 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
Decodingprimitives 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.ListenandSpeech.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
Transcriptdocument model and its versioned, bounded JSON form. Speech.Transcribe,TranscribeAsyncandDetectLanguage: 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
ModelSourcehook andonespeech models pull.
Known limitations
- Whisper large-v3 was refused with a typed error in this release (fixed in 0.4.0-preview.1).