Skip to main content
net8.0

Local Whisper speech-to-text using ONNX Runtime. Auto-downloads models from HuggingFace. Supports tiny, base, small, medium, and large models.

Published
Mar 30, 2026
6mo ago
Total Downloads
2.5K
2,529

Install

dotnet add package ElBruno.Whisper --version 0.1.0
ProductVersions
.NET
net8.0

README

ElBruno.Whisper

NuGet NuGet Downloads Build Status License: MIT HuggingFace .NET GitHub stars Twitter Follow

Run local Whisper speech-to-text in .NET 🎀

Transcribe audio to text in .NET using OpenAI's Whisper model. Powered by ONNX Runtime with automatic model download from HuggingFace.

Features

  • πŸ“¦ Automatic model download β€” models are fetched from HuggingFace on first use
  • πŸ”Š Multiple model sizes β€” tiny β†’ base β†’ small β†’ medium β†’ large (pick your speed/accuracy tradeoff)
  • πŸš€ Zero friction β€” works out of the box with sensible defaults (tiny.en)
  • 🌍 Multilingual support β€” transcribe 99+ languages with multilingual models
  • πŸ’‰ DI-friendly β€” register with AddWhisper() in ASP.NET Core
  • πŸ“Š Progress reporting β€” track model downloads with real-time callbacks
  • 🎯 English-optimized models β€” dedicated .en variants for best accuracy on English audio

Installation

dotnet add package ElBruno.Whisper

Quick Start

using ElBruno.Whisper;

// Create client (downloads tiny.en model on first run)
using var client = await WhisperClient.CreateAsync();

var result = await client.TranscribeAsync("audio.wav");
Console.WriteLine(result.Text);

First Run

The first time you create a WhisperClient, the model is downloaded from HuggingFace to your local cache directory (~75 MB - 3 GB depending on model size). This typically takes 10-60 seconds depending on your internet connection and chosen model.

Track download progress:

using var client = await WhisperClient.CreateAsync(
    progress: new Progress<ElBruno.HuggingFace.DownloadProgress>(p =>
    {
        if (p.Stage == ElBruno.HuggingFace.DownloadStage.Downloading)
            Console.WriteLine($"{p.CurrentFile}: {p.PercentComplete:F0}%");
        else
            Console.WriteLine($"{p.Stage}: {p.Message}");
    })
);

Subsequent runs load instantly from cache (%LOCALAPPDATA%/ElBruno/Whisper/models).

Model Selection

Whisper offers various model sizes. English-optimized models (.en suffix) are smaller and faster for English audio:

using var client = await WhisperClient.CreateAsync(new WhisperOptions
{
    Model = KnownWhisperModels.WhisperSmallEn
});

var result = await client.TranscribeAsync("english-audio.wav");
Console.WriteLine(result.Text);

Available Models

Size English Multilingual Parameters Approx Size Speed
tiny tiny.en tiny 39M 75 MB ⚑⚑⚑⚑⚑
base base.en base 74M 140 MB ⚑⚑⚑⚑
small small.en small 244M 460 MB ⚑⚑⚑
medium medium.en medium 769M 1.5 GB ⚑⚑
large β€” large 1550M 3.0 GB ⚑

Use English-optimized (.en) models for:

  • English audio only (slightly smaller, faster, better accuracy on English)

Use Multilingual models for:

  • Non-English audio
  • Mixed-language content
  • Language auto-detection

Progress Tracking

Monitor both file downloads and transcription progress:

var downloadProgress = new Progress<ElBruno.HuggingFace.DownloadProgress>(p =>
{
    if (p.Stage == ElBruno.HuggingFace.DownloadStage.Downloading)
        Console.Write($"\r⬇️ {p.PercentComplete:F0}%");
    else
        Console.WriteLine($"\nβœ“ {p.Message}");
});

using var client = await WhisperClient.CreateAsync(progress: downloadProgress);

var result = await client.TranscribeAsync("audio.wav");
Console.WriteLine($"βœ“ Transcribed: {result.Text}");

Dependency Injection

Register Whisper in ASP.NET Core or other DI-enabled applications:

builder.Services.AddWhisper(options =>
{
    options.Model = KnownWhisperModels.WhisperBaseEn;
});

// Inject WhisperClient anywhere
public class TranscriptionService(WhisperClient whisper) { ... }

Transcription Result

The TranscriptionResult includes:

var result = await client.TranscribeAsync("audio.wav");

Console.WriteLine(result.Text);                    // Transcribed text
Console.WriteLine(result.DetectedLanguage);       // Detected language (for multilingual models)
Console.WriteLine(result.Duration);               // Audio duration

Troubleshooting

Model download fails?

  • Check your internet connection
  • For private HuggingFace models, set the HF_TOKEN environment variable

Out of memory?

  • Use a smaller model (tiny or base instead of medium/large)
  • Transcribe shorter audio files in chunks

For detailed troubleshooting, see docs.

Samples

Sample Description
HelloWhisper Minimal console transcription
BlazorWhisper Blazor app with audio recording and real-time transcription

Documentation

Building from Source

git clone https://github.com/elbruno/ElBruno.Whisper
cd ElBruno.Whisper
dotnet build ElBruno.Whisper.slnx
dotnet test ElBruno.Whisper.slnx

🀝 Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ“„ License

This project is licensed under the MIT License β€” see the LICENSE file for details.

Related Projects

πŸ™ Acknowledgments

πŸ‘‹ About the Author

Made with ❀️ by Bruno Capuano (ElBruno)

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

Compatibility metadata lists 1 target framework; confirm the exact target used by your application.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.