---
title: "Transcribe audio with Qwen3-ASR in C#"
url: https://recursiveai.org/onespeech/cookbook/transcribe-with-qwen3-asr/
description: "Select Qwen3-ASR explicitly to transcribe a recording. Missing model files download on first use; recognition runs locally."
version: "1.1.0"
---

# Transcribe audio with Qwen3-ASR in C#

**OneSpeech** is a free, open-source speech recognition library for .NET from Recursive AI. MIT or Apache-2.0, no native dependencies.

[NuGet](https://www.nuget.org/packages/RecursiveAI.OneSpeech) · [GitHub](https://github.com/recursive-ai-oss/onespeech-csharp) · [Docs](https://recursiveai.org/onespeech/docs/) · [Download example (.zip)](https://recursiveai.org/onespeech/cookbook/transcribe-with-qwen3-asr/transcribe-with-qwen3-asr.zip)

```shell
dotnet add package RecursiveAI.OneSpeech
```

Requires [.NET 10](https://dotnet.microsoft.com/download/dotnet/10.0) (net10.0); .NET 9 and earlier aren’t supported.

`sample.flac` is included in the example zip.

```csharp
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](https://recursiveai.org/onespeech/cookbook/configure-speech-model-cache/)).

```text
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](https://www.openslr.org/12): “Stuff it into you, his belly counseled him.” Attribution: Vassil Panayotov, Guoguo Chen, Daniel Povey and Sanjeev Khudanpur (2015), [CC BY 4.0](https://creativecommons.org/licenses/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](https://recursiveai.org/onespeech/cookbook/transcribe-with-qwen3-asr/transcribe-with-qwen3-asr.zip), then `dotnet run`.

## Variations

### Force English

Replace the transcription call with:

```csharp
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](https://recursiveai.org/onespeech/cookbook/configure-speech-model-cache/)).

The same recording prints:

```text
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](https://recursiveai.org/onespeech/cookbook/configure-speech-model-cache/). The 1.7B option was not run for this example; all output on this page comes from 0.6B.

## Related recipes

- [Transcribe an audio file](https://recursiveai.org/onespeech/cookbook/transcribe-audio-file/)
- [Run offline speech recognition](https://recursiveai.org/onespeech/cookbook/offline-speech-recognition/)
- [Get word timestamps](https://recursiveai.org/onespeech/cookbook/word-timestamps/)

## 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](https://recursiveai.org/onespeech/docs/qwen3/) 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](https://github.com/recursive-ai-oss/onespeech-csharp/blob/d4711130104790dbe65888d782a30a68bf40bab4/src/OneSpeech/Qwen3/Qwen3Languages.cs); 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](https://recursiveai.org/onespeech/cookbook/stream-with-moonshine/). 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](https://recursiveai.org/onespeech/cookbook/stream-with-moonshine/) covers a family that actually emits replacing partial hypotheses.
