ElBruno.Speech.Abstractions 1.6.1

dotnet add package ElBruno.Speech.Abstractions --version 1.6.1
                    
NuGet\Install-Package ElBruno.Speech.Abstractions -Version 1.6.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ElBruno.Speech.Abstractions" Version="1.6.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ElBruno.Speech.Abstractions" Version="1.6.1" />
                    
Directory.Packages.props
<PackageReference Include="ElBruno.Speech.Abstractions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ElBruno.Speech.Abstractions --version 1.6.1
                    
#r "nuget: ElBruno.Speech.Abstractions, 1.6.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ElBruno.Speech.Abstractions@1.6.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ElBruno.Speech.Abstractions&version=1.6.1
                    
Install as a Cake Addin
#tool nuget:?package=ElBruno.Speech.Abstractions&version=1.6.1
                    
Install as a Cake Tool

ElBruno.Speech

ElBruno.Speech Banner

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

Local-first speech runtime for .NET — VAD → STT → LLM → TTS 🎙️

A reusable, local-first speech runtime for .NET 8 and .NET 10. Built on Microsoft.Extensions.AI provider boundaries — works with local models (Whisper, VibeVoice, Qwen-TTS, Ollama) and cloud providers (Azure OpenAI, OpenAI) without changing orchestration code.

Audio input
    ↓
Audio normalization · resampling · framing · buffering
    ↓
Voice Activity Detection (Silero VAD)
    ↓
Turn detection · utterance assembly
    ↓
ISpeechToTextClient
    ↓
IChatClient
    ↓
Streaming text segmentation
    ↓
ITextToSpeechClient
    ↓
Audio output

What's New

Date Version Highlights
2026-11-03 1.6.1 Dependency patch: updates Microsoft.Extensions.Hosting.Abstractions to 10.0.14 and ONNX Runtime to 1.31.1. No public API or pipeline-default changes.
2026-10-26 1.6.0 Stable Ollama Phonon TTS: community-confirmed WAV generation and playback on Apple Silicon with .NET 8/10, all twelve packages, and dependency updates. See release notes for scope and platform limits.
2026-10-25 1.6.0-preview.5 Zero-configuration Ollama: examples use AddOllamaSpeech() with local server and Phonon defaults, plus explicit default-value regression coverage. See release notes.
2026-10-25 1.6.0-preview.4 Simpler Ollama URLs: configure a server root, let the library resolve the speech route, and keep existing complete endpoint URLs. See release notes.
2026-10-25 1.6.0-preview.3 Ollama Phonon TTS: opt-in MEAI provider, WAV/PCM streaming, runnable C# sample, and explicit platform/verification limits. See release notes.
2026-08-02 1.1.0 BlazorComponents — ElBruno.Speech.BlazorComponents Razor Class Library with six ready-to-use speech pipeline UI components
2026-08-02 1.0.0 First stable release — production pipeline, 70+ tests, OpenTelemetry, CLI tool, and Aspire sample
2026-07-30 0.6.0 Dependency updates — MEAI 10.8.1, ONNX Runtime 1.28.0, and Extensions 10.0.10
2026-07-21 0.5.4 Production hardening — STT timeout and error isolation per pipeline stage
2026-07-05 0.5.3 MEAI IRealtimeClient adapter — SpeechPipelineRealtimeAdapter wrapping the pipeline as an IRealtimeClient

Packages

Package NuGet Downloads Description
ElBruno.Speech.Abstractions NuGet Downloads Audio types, VAD contracts, session interfaces, error types
ElBruno.Speech.Audio NuGet Downloads WAV I/O, PCM conversion, resampling, framing, ring buffers
ElBruno.Speech.Vad.Silero NuGet Downloads Silero VAD via ONNX Runtime — streaming voice activity detection
ElBruno.Speech.Stt.Parakeet NuGet Downloads Experimental opt-in multilingual Parakeet TDT v3 local STT, available since 1.6.0-preview.1
ElBruno.Speech.Stt.Whisper NuGet Downloads Experimental opt-in multilingual Whisper large-v3 local CPU STT, available since 1.6.0-preview.2
ElBruno.Speech.Tts.Ollama 1.6.0 Downloads Ollama Phonon TTS via ITextToSpeechClient, including incremental audio streaming
ElBruno.Speech.Pipeline NuGet Downloads VAD → STT → LLM → TTS orchestration, bounded channels, barge-in
ElBruno.Speech.AspNetCore NuGet Downloads WebSocket endpoint, session registry, health checks
ElBruno.Speech.NAudio NuGet Downloads Windows microphone and speaker via NAudio
ElBruno.Speech.OpenTelemetry NuGet Downloads Activities, metrics, Aspire-compatible instrumentation
ElBruno.Speech.Cli NuGet Downloads elbrunospeech dotnet tool
ElBruno.Speech.BlazorComponents NuGet Downloads Blazor Server RCL — 6 ready-to-use speech pipeline UI components

Installation

dotnet add package ElBruno.Speech.Pipeline
dotnet add package ElBruno.Speech.Vad.Silero

Ollama Phonon text-to-speech

dotnet add package ElBruno.Speech.Tts.Ollama --version 1.6.0

Register services.AddOllamaSpeech() from ElBruno.Speech.Tts.Ollama to resolve Microsoft.Extensions.AI.ITextToSpeechClient. The provider supports configurable endpoint, model, voice, WAV/PCM output, cancellation, and incremental HTTP audio streaming. See the provider guide and complete C# demo.

No options are required: services.AddOllamaSpeech() uses http://localhost:11434/, model phonon, the default voice, and WAV output. Supply OllamaSpeechOptions only to override settings, such as a remote server. From 1.6.0-preview.4, the library resolves the speech route automatically; /v1 bases and existing full speech endpoints also work. The older preview.3 requires the full route.

Current platform limit: Ollama speech runs on Apple Silicon Macs with MLX. Windows/Linux support is pending upstream, with no promised date. A Windows C# client can call a compatible remote Ollama server. On the local Windows host, Ollama 0.40.11 rejected ollama pull phonon because MLX was unavailable. Community reports on issue #106 confirm real WAV generation and playback on Apple M2 with .NET 8 and M2 Max with .NET 10 using preview.5. These are user-reported English-speech checks, not comprehensive voice, streaming, quality, or performance benchmarks. No standalone Phonon runtime or non-Ollama fallback is included.

Install the CLI tool globally:

dotnet tool install -g ElBruno.Speech.Cli
elbrunospeech --help

Quick Start

// Register providers
services.AddWhisper(o => o.Model = KnownWhisperModels.WhisperBaseEn);
services.AddLocalLLMs(o => o.Model = KnownModels.Phi35MiniInstruct);
services.AddVibeVoiceTTS(o => o.SampleRate = 24_000);
services.AddSileroVad(o => o.MinimumSilenceDuration = TimeSpan.FromMilliseconds(500));

// Build the pipeline
services.AddSpeechPipeline(builder =>
{
    builder
        .UseVoiceActivityDetector<SileroVoiceActivityDetector>()
        .UseSpeechToText(sp => sp.GetRequiredService<ISpeechToTextClient>())
        .UseChatClient(sp => sp.GetRequiredService<IChatClient>())
        .UseTextToSpeech(sp => sp.GetRequiredService<ITextToSpeechClient>())
        .UseSentenceChunking(o =>
        {
            o.MinimumCharacters = 24;
            o.MaximumCharacters = 220;
            o.FlushTimeout = TimeSpan.FromMilliseconds(350);
        })
        .UseBargeIn(o => o.CancelOnSpeechStart = true);
});

// Use it
var pipeline = sp.GetRequiredService<ISpeechPipeline>();
await using var session = await pipeline.CreateSessionAsync();

await session.WriteAudioAsync(frame);
await foreach (var update in session.GetUpdatesAsync())
{
    // SpeechStartedUpdate, FinalTranscriptUpdate, AssistantAudioChunkUpdate, ...
}

Experimental multilingual Parakeet STT

An opt-in local Parakeet TDT v3 provider is available in 1.6.0-preview.1 as ElBruno.Speech.Stt.Parakeet, using the verified elbruno ONNX model bundle. It supports Spanish and other model languages without changing Whisper defaults. Native token-start metadata is preserved; word/segment intervals and language ID are explicitly unavailable. See usage, requirements, and evaluation limits.

Opt-in Whisper large-v3

ElBruno.Speech.Stt.Whisper is included in 1.6.0. It adds a separate local whisper.cpp CPU provider without replacing the existing ElBruno.Whisper package or changing defaults. It uses a pinned, explicitly downloaded multilingual large-v3 model. See setup, native requirements, and limitations and the fixed-reference FLEURS comparison.

CLI Tool

elbrunospeech devices                        # list audio input/output devices
elbrunospeech transcribe recording.wav       # transcribe a WAV file
elbrunospeech vad recording.wav             # run voice activity detection
elbrunospeech talk "Hello world" out.wav    # synthesize text to WAV

Observability

builder.Services.AddOpenTelemetry()
    .AddSpeechPipelineTelemetry();           // meter: ElBruno.Speech, source: ElBruno.Speech
// Aspire automatically configures OTLP export via OTEL_EXPORTER_OTLP_ENDPOINT

Samples

Sample Description
FileToSpeech WAV file → transcript → answer → WAV output
ParakeetTranscribe Local WAV → Parakeet transcript and native token-start JSON (opt-in)
WhisperTranscribe Local WAV → opt-in Whisper large-v3 transcript and unreviewed native segment JSON
OllamaSpeechDemo C# Phonon TTS: complete WAV, incremental PCM, audio validation, and optional playback (requires an MLX-capable Ollama host)
LocalVoiceAgent Microphone → VAD → Whisper → LLM → VibeVoice → speaker (barge-in)
WebSocketVoiceAgent ASP.NET Core WebSocket endpoint + browser client
AspireVoiceAgent Full Aspire AppHost with tracing, metrics, and dashboard


Requirements

  • .NET 8.0 or .NET 10.0
  • Windows, Linux, or macOS
  • NAudio package requires Windows (microphone/speaker I/O)

Building from Source

git clone https://github.com/elbruno/ElBruno.Speech.git
cd ElBruno.Speech
dotnet restore
dotnet build
dotnet test --filter "Category!=Integration"

Speech test fixtures

Reusable Spanish/English speech fixtures, CC BY 4.0 licensing, offline validation, and opt-in model evaluation are documented in Speech test fixtures.

Working with Copilot and Squad

Normal Copilot sessions can work on this repository without loading Squad. Squad is optional: select the Squad custom agent in your client or run copilot --agent squad to use its team orchestration and safety rules. The coordinator integrity check runs only in that custom agent.

If a normal session reports that the Squad coordinator is missing or truncated, update your checkout to include the instruction-scope fix and start a new Copilot session so it reloads .github/copilot-instructions.md. Existing sessions can retain the old instructions. If you select Squad and its loaded instructions are incomplete, stop orchestration and restart with the complete custom agent; do not add a canary to bypass the check.


📄 License

MIT — see LICENSE.

The FLEURS audio and reference transcripts under tests/fixtures/speech are separately licensed CC BY 4.0. See their attribution and license notices.


👋 About the Author

Hi! I'm ElBruno 🧡, a passionate developer and content creator exploring AI, .NET, and modern development practices.

Made with ❤️ by ElBruno

If you like this project, consider following my work across platforms:

  • 📻 Podcast: No Tienen Nombre — Spanish-language episodes on AI, development, and tech culture
  • 💻 Blog: ElBruno.com — Deep dives on embeddings, RAG, .NET, and local AI
  • 📺 YouTube: youtube.com/elbruno — Demos, tutorials, and live coding
  • 🔗 LinkedIn: @elbruno — Professional updates and insights
  • 𝕏 Twitter: @elbruno — Quick tips, releases, and tech news

🙏 Acknowledgments

Product 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 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (7)

Showing the top 5 NuGet packages that depend on ElBruno.Speech.Abstractions:

Package Downloads
ElBruno.Speech.Audio

Audio primitives for ElBruno.Speech — WAV I/O, PCM conversion, resampling, framing, and ring buffers.

ElBruno.Speech.Pipeline

Speech pipeline orchestration for ElBruno.Speech — VAD → STT → LLM → TTS with bounded channels, barge-in, and session management.

ElBruno.Speech.Vad.Silero

Silero VAD provider for ElBruno.Speech — ONNX Runtime inference, stateful streaming voice activity detection.

ElBruno.Speech.AspNetCore

ASP.NET Core integration for ElBruno.Speech — WebSocket endpoint, session registry, health checks, and protocol handling.

ElBruno.Speech.NAudio

Windows audio I/O for ElBruno.Speech via NAudio — microphone input, speaker output, and device enumeration.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.6.1 194 11/3/2026
1.6.0 257 10/26/2026
1.6.0-preview.5 101 10/25/2026
1.6.0-preview.4 96 10/25/2026
1.6.0-preview.3 92 10/25/2026
1.6.0-preview.2 106 10/22/2026
1.6.0-preview.1 89 10/22/2026
1.5.0 208 10/6/2026
1.4.1 260 8/25/2026
1.4.0 259 8/19/2026
1.3.0 246 8/16/2026
1.2.0 278 8/4/2026
1.1.0 267 8/2/2026
1.0.0 245 8/2/2026
0.6.0 239 7/30/2026
0.5.4 253 7/21/2026
0.5.3 258 7/5/2026
0.5.2 248 7/3/2026
0.5.1 251 7/3/2026
0.5.0 252 7/3/2026

Patch release updating Microsoft.Extensions.Hosting.Abstractions to 10.0.14 and Microsoft.ML.OnnxRuntime to 1.31.1. No public API or speech pipeline default changes. All twelve ElBruno.Speech packages, including BlazorComponents, are released together.