Recursive AI
LibraryC#Available

onespeech

Speech recognition for .NET, in C#. OneSpeech transcribes audio, times words, labels speakers and supports live sessions in managed .NET 10.

Open source, MIT or Apache-2.0, made by Recursive AI. Version 1.0.0 is on NuGet, for .NET 10. Open-weight models run on onemodel; oneaudio decodes and resamples audio. No native inference runtime is required. OneSpeech is unaffiliated with other products or companies named OneSpeech.

dotnet add package RecursiveAI.OneSpeech

A quick look

One call returns a timed, diarized, language-tagged transcript. Failed word timing is null, never invented, and a speaker label is anonymous and local to the document.

The output shown is from a run on 1.0.0 from NuGet, on a three-second LibriSpeech recording whose reference text is “stuff it into you his belly counselled him”. The default file model, Whisper large-v3-turbo, heard “stuffered”. Getting started has the whole program.

Getting started
Program.csC#
Transcript t = Speech.Transcribe(
    "1089-134686-0001.flac", language: "en");
 
Console.WriteLine(t.Text);
// stuffered into you, his belly counseled him.
 
foreach (Word w in t.Words.Take(3))
    Console.WriteLine($"{w.Start} {w.Text}");
// 00:00:00.5460000  stuffered
// 00:00:00.8660000  into
// 00:00:01.1860000  you,
 
foreach (Turn turn in t.Turns)
    Console.WriteLine(turn.Speaker.Id);
// speaker-1
 
File.WriteAllText("t.json", t.ToJson());
What it does

What it does

Transcription

Whisper large-v3-turbo is the file default; Whisper tiny to large-v3, Qwen3-ASR 0.6B and 1.7B and Moonshine are selected by name. Long files are chunked at speech boundaries with constant PCM memory. Output as text, JSON, SRT or VTT.

Transcribing files

Word timing

Each word records how it was timed: native timestamps first, then Qwen3-ForcedAligner, omniASR-CTC and DTW. “Failed word timing is null, never invented.” Speech.Align times text you already have, up to 60 seconds.

Word timing

Speaker labels

The default diarizer, Silero VAD with CAM++ embeddings and clustering, labels who spoke when, merged into the transcript. It doesn’t detect overlapping speech; Nemotron 3 Diarization is an opt-in, overlap-aware upgrade.

Diarization

Live sessions

Speech.Listen “emits replacing partials, immutable finals, endpoints and speaker turns on one audio clock.” It reads mono 16 kHz PCM you supply; it doesn’t capture a microphone. Moonshine streaming tiny is the live default.

Live sessions

Speaker recognition

Speech.Enroll, Identify and Verify, held in process memory only. Speaker embeddings are biometric data. Obtain informed consent, limit retention and access, and check applicable law, including Illinois BIPA and GDPR Article 9, before enrollment, identification or verification.

Speaker recognition

Offline and captions

Model packages put CAM++ English and Moonshine weights in your build, so a live session needs no download. .Media reads MP4, MKV and other containers and writes SRT, VTT, ASS and TTML; .Cli is the onespeech tool.

Command line and model packages
Measured against

What it is compared with

Each row below is from the project’s release revalidation, on full LibriSpeech test-clean and test-other or 20,000 fixed speaker trials. “‘Within noise’ means the difference interval includes zero.”

OneSpeech, againstVerdict
Whisper large-v3-turbo and small, fp32, against openai-whisper 20250625Within noise
Whisper large-v3-turbo and small, mixed-int8, against faster-whisper 1.2.1 (CT2 4.8.5 int8)Within noise
Moonshine streaming tiny, offline, against Transformers 5.22.2Within noise
CAM++ English against ModelScope 1.40.2, and ECAPA-TDNN against SpeechBrain 1.1.2 (EER and minDCF)Within noise
  • Word error rate. Whisper large-v3-turbo fp32 scores 2.267% on test-clean against the reference’s 2.289%, and 4.275% on test-other against 4.331%.
  • Speed. “The tier-1 live default meets real time on one core on both machines, with 0 B/chunk of our working allocation. This does not imply that all file models run in real time on one core: turbo’s measured RTF is 1.712 on 60 seconds and 1.332 on 600 seconds.”
  • Scope. In the results’ own words, “these results are not a cross-hardware guarantee,” and “No speed comparison with a native implementation is made here.”
Measured results and limits
Models

Models by role, and their licences

“Tier 1 is ungated MIT/Apache-2.0/BSD and may be redistributed and selected by default. Tier 2 loads only from pinned publisher files, never from our mirror or model packages, never by default.”

RoleModelsTier / licenceSelection
File recognitionWhisper tiny/base/small/large-v3; large-v3-turbo1 / Apache-2.0; turbo MITTurbo default
File recognitionQwen3-ASR 0.6B / 1.7B1 / Apache-2.0By name; 1.7B accuracy option
Live / edge recognitionMoonshine English tiny/base and streaming tiny/small/medium1 / MITStreaming-tiny live default
RecognitionParakeet-TDT-0.6B-v32 / CC-BY-4.0By name only
TimingQwen3-ForcedAligner-0.6B; omniASR-CTC-300M1 / Apache-2.0Timing policy
Voice activitySilero VAD 6.2.31 / MITEmbedded
DiarizationSilero + CAM++ + spectral/AHC clustering1 / MIT + Apache-2.0Default; no overlap detection
DiarizationNemotron 3 Diarization2 / OpenMDW-1.1Explicit overlap-aware upgrade
Segmentationpyannote segmentation-3.0 / community-12 / MIT gated / CC-BY-4.0 gatedLocal segmentation-3.0 + our overlap-aware clustering; community-1 reference only
Speaker embeddingsCAM++ English/Chinese; ECAPA-TDNN1 / Apache-2.0CAM++ English default; Chinese for Chinese speech
Tier-2 models and gates
Limits

Known limits at 1.0.0

  • Overlapping speech. “The default clustering diarizer does not detect overlapping speech.” The Nemotron upgrade “does not separate simultaneous voices.”
  • No microphone. Speech.Listen consumes caller-supplied PCM. “It does not capture a microphone.”
  • First use. “The model argument selects a role, not the entire pipeline.” Transcription also needs a speaker embedder and, without native timings, aligners: “Even Whisper tiny can require several GB on first use.” Speech.PrefetchAsync prepares a machine ahead of time.
  • Streaming and alignment. TranscribeStream “does not perform whole-file speaker assignment,” and standalone Align “accepts at most 60 seconds.”
The README
Privacy and consent

Voices are biometric data

“Speaker embeddings are biometric data. Obtain informed consent, limit retention and access, and check applicable law, including Illinois BIPA and GDPR Article 9, before enrollment, identification or verification.”

The library does not persist embeddings; your application remains responsible for audio, transcripts, logs and any copies it keeps. In the README’s words, “This is not legal advice.”

Status and packages

Go further