ElBruno.Whisper
0.2.0
dotnet add package ElBruno.Whisper --version 0.2.0
NuGet\Install-Package ElBruno.Whisper -Version 0.2.0
<PackageReference Include="ElBruno.Whisper" Version="0.2.0" />
<PackageVersion Include="ElBruno.Whisper" Version="0.2.0" />
<PackageReference Include="ElBruno.Whisper" />
paket add ElBruno.Whisper --version 0.2.0
#r "nuget: ElBruno.Whisper, 0.2.0"
#:package ElBruno.Whisper@0.2.0
#addin nuget:?package=ElBruno.Whisper&version=0.2.0
#tool nuget:?package=ElBruno.Whisper&version=0.2.0
ElBruno.Whisper
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
.envariants 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_TOKENenvironment 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
- Getting Started โ installation, first steps, configuration
- API Reference โ full API documentation
- Architecture โ design decisions and internal structure
- Testing Guide โ running tests, test organization, CI/CD pipeline
- Test Audio Files โ audio resources for testing and transcription validation
- Image Prompts โ prompts for generating blog and social media images
- Publishing โ NuGet package publishing with OIDC
Building from Source
git clone https://github.com/elbruno/ElBruno.Whisper
cd ElBruno.Whisper
dotnet build ElBruno.Whisper.slnx
dotnet test ElBruno.Whisper.slnx --filter "Category!=Integration"
Testing
The repository includes comprehensive unit and integration tests:
Quick test run (unit tests, no model download):
dotnet test ElBruno.Whisper.slnx --filter "Category!=Integration"
Full test run (includes integration with real models):
dotnet test ElBruno.Whisper.slnx
Test audio files are provided in testdata/audio/ for validation and transcription testing. For details, see the Testing Guide.
๐ค Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
๐ License
This project is licensed under the MIT License โ see the LICENSE file for details.
Related Projects
- ElBruno.LocalLLMs โ Run local LLMs in .NET
- ElBruno.HuggingFace โ HuggingFace model utilities for .NET
๐ Acknowledgments
- ONNX Runtime โ inference engine
- OpenAI Whisper โ speech-to-text model
- Hugging Face โ model hosting and community
- ONNX Community โ ONNX model conversions
๐ About the Author
Made with โค๏ธ by Bruno Capuano (ElBruno)
- ๐ Blog: elbruno.com
- ๐บ YouTube: youtube.com/elbruno
- ๐ LinkedIn: linkedin.com/in/elbruno
- ๐ Twitter: twitter.com/elbruno
- ๐๏ธ Podcast: notienenombre.com
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- ElBruno.HuggingFace.Downloader (>= 0.6.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.0)
- Microsoft.ML.OnnxRuntime (>= 1.22.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on ElBruno.Whisper:
| Package | Downloads |
|---|---|
|
ElBruno.MarkItDotNet.Whisper
Local audio transcription for ElBruno.MarkItDotNet using OpenAI Whisper via ONNX Runtime. Converts audio files to Markdown transcripts offline. |
GitHub repositories
This package is not used by any popular GitHub repositories.