dotnet add package RecursiveAI.OneSpeechRequires .NET 10 (net10.0); .NET 9 and earlier aren’t supported.
sample.flac is included in the example zip.
using OneSpeech; var result = Speech.Transcribe( "sample.flac", model: "Qwen/Qwen3-ASR-0.6B"); Console.WriteLine(result.Text);
First use downloads about 1.88 GB for Qwen3-ASR-0.6B, plus about 1.87 GB for English timing and speaker models, and caches the publisher files and locally converted graphs in ~/.cache/onespeech/models on Linux (change the cache location).
Stuff it into you. His belly counseled him.The zip includes sample.flac, the unmodified mono 16 kHz LibriSpeech test-clean utterance 1089-134686-0001: “Stuff it into you, his belly counseled him.” Attribution: Vassil Panayotov, Guoguo Chen, Daniel Povey and Sanjeev Khudanpur (2015), CC BY 4.0. Recognition output can differ from that reference.
Transcribing a file also detects speech, labels speakers and uses a separate model for word timing. The core NuGet package does not contain the weights.
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; applications remain responsible for audio, transcripts, logs and any copies they retain. This is not legal advice.
Invalid or corrupt audio is rejected; I/O and model acquisition failures propagate as exceptions.
Unzip the example, then dotnet run.
Variations
Force English
Replace the transcription call with:
var result = Speech.Transcribe("sample.flac", language: "en", model: "Qwen/Qwen3-ASR-0.6B");
First use downloads about 1.88 GB for Qwen3-ASR-0.6B, plus about 1.87 GB for English timing and speaker models, and caches the publisher files and locally converted graphs in ~/.cache/onespeech/models on Linux (change the cache location).
The same recording prints:
Stuff it into you. His belly counseled him.Select the documented 1.7B checkpoint
The pinned catalog also declares Qwen/Qwen3-ASR-1.7B; use that model ID instead of Qwen/Qwen3-ASR-0.6B to select it explicitly. It downloads about 4.70 GB of publisher files before conversion, with additional timing and speaker models for file transcription, into the same model cache. The 1.7B option was not run for this example; all output on this page comes from 0.6B.
Related recipes
The short answer
Pass model: "Qwen/Qwen3-ASR-0.6B" to Speech.Transcribe. OneSpeech resolves the pinned checkpoint, verifies its publisher files and converts missing runtime files locally before recognition. Choosing this model does not change the default recognizer for other calls. File transcription also finds speech, labels speakers and determines word times.
What is Qwen 3 ASR?
Qwen3-ASR is a speech recognition model family. OneSpeech supports its 0.6B and 1.7B checkpoints, including the audio encoder, projector and language decoder. The weights are not embedded in the core NuGet package. The documented checkpoints are ungated and Apache-2.0; the model catalog records their revisions and file hashes.
The example selects the 0.6B checkpoint by its complete catalog ID. It is a file-transcription call, not a hosted API request or a Python subprocess. OneSpeech’s Qwen3 documentation describes local conversion from verified model data without executing model-repository code. Keep the model cache between runs so subsequent calls can reuse prepared files.
Recognition and timing are separate models
A low-level Qwen3Recognizer does not automatically download a timing model. Its words have null timing unless a timing stage supplies it. When you transcribe a file, OneSpeech tries Qwen3-ForcedAligner before its other word-timing methods for supported languages. The aligner is a distinct model with its own input contract, not a timestamp mode on the recognition decoder.
For whole-file Qwen transcription, recognition finishes across the speech sections before the timing models load. The recognition models are released first. It then reads the audio again and detects speech using the same settings; the speech intervals must match the first pass exactly. A mismatch raises an error rather than shifting the timestamps. This lifetime separation avoids keeping recognition and timing models loaded together, but it is not a promise that a particular amount of RAM is sufficient for every workload. No full-file PCM or decoder history is retained by that documented path.
Which languages does Qwen ASR support?
The recognition-language list is the pinned Qwen3 language table; it is separate from the aligner’s list below. A null language hint asks for the model’s language output; a supported tag forces a language. The variation above forces English. Unsupported tags are refused.
The separate forced aligner accepts zh, en, yue, fr, de, it, ja, ko, pt, ru and es. Recognition language support and timing language support are not interchangeable. Word times outside the aligner’s valid predictions can remain unknown; the timing stage does not invent boundaries to fill gaps.
Does Qwen3-ASR support streaming?
No. For live partial results, use the Moonshine streaming recipe. The Qwen3 family in OneSpeech does not declare true live partials or translation. Use file transcription here when you need a completed transcript with the shared processing stages. Low-level recognition takes finite mono 16 kHz float PCM; input longer than 30 seconds uses VAD-first chunks with fresh decoder state for each chunk.
Recognition is greedy and has a per-chunk token budget. Reaching that budget throws instead of silently returning truncated text. An empty recording produces an empty document; invalid samples are rejected. These are recognition contracts, not reasons to equate a returned transcript with a word-for-word reference. The live recognition recipe covers a family that actually emits replacing partial hypotheses.