Skip to main content
net10.0net8.0

Speech pipeline orchestration for ElBruno.Speech β€” VAD β†’ STT β†’ LLM β†’ TTS with bounded channels, barge-in, and session management.

Published
Oct 22, 2026
today
Total Downloads
2.1K
2,148

Install

dotnet add package ElBruno.Speech.Pipeline --version 1.6.0-preview.1
ProductVersions
.NET
net10.0net8.0

README

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-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.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

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 from source in 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.

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)
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

Related Repositories


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"

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.


πŸ‘‹ 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

Changes from Previous Version

No structural changes between v1.5.0 and v1.6.0-preview.1.

Adoption Assessment

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

This version is marked prerelease. Validate its API and upgrade path before production use.Compatibility metadata lists 2 target frameworks; confirm the exact target used by your application.The published metadata declares 14 direct dependency entries across framework groups. Inspect the resolved dependency graph for your target framework.

Related Guides & Workflows

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