Shiny.Speech.OpenAI
2.0.0
Prefix Reserved
dotnet add package Shiny.Speech.OpenAI --version 2.0.0
NuGet\Install-Package Shiny.Speech.OpenAI -Version 2.0.0
<PackageReference Include="Shiny.Speech.OpenAI" Version="2.0.0" />
<PackageVersion Include="Shiny.Speech.OpenAI" Version="2.0.0" />
<PackageReference Include="Shiny.Speech.OpenAI" />
paket add Shiny.Speech.OpenAI --version 2.0.0
#r "nuget: Shiny.Speech.OpenAI, 2.0.0"
#:package Shiny.Speech.OpenAI@2.0.0
#addin nuget:?package=Shiny.Speech.OpenAI&version=2.0.0
#tool nuget:?package=Shiny.Speech.OpenAI&version=2.0.0
Shiny.Speech
Cross-platform speech services for .NET MAUI and Blazor WebAssembly — speech-to-text, text-to-speech, audio capture, and audio playback with pluggable cloud providers.
Libraries
| Package | Description | Targets |
|---|---|---|
| Shiny.Speech | Core interfaces + native platform implementations (STT, TTS, audio capture, audio playback) | net10.0-ios, net10.0-android, net10.0-windows, net10.0 (Browser/WASM) |
| Shiny.Speech.Cloud | Cloud provider abstractions + CloudSpeechToText / CloudTextToSpeech implementations |
net10.0 |
| Shiny.Speech.Azure | Azure AI Speech provider (STT + TTS) | net10.0 |
| Shiny.Speech.ElevenLabs | ElevenLabs provider (TTS) | net10.0 |
Getting Started
Native Platform Speech
Use the built-in OS speech engines — no cloud account needed. Works on MAUI (iOS, Android, Windows) and Blazor WebAssembly (via Web Speech API).
builder.Services.AddSpeechServices();
// Registers: ISpeechToTextService, ITextToSpeechService, IAudioSource, IAudioPlayer
// On Browser/WASM: auto-detected via OperatingSystem.IsBrowser()
Azure AI Speech (Cloud)
builder.Services.AddAzureSpeech("your-subscription-key", "your-region");
ElevenLabs TTS (Cloud)
builder.Services.AddElevenLabsTextToSpeech("your-api-key");
Usage
Text-to-Speech
public class MyService(ITextToSpeechService tts)
{
public async Task SpeakAsync()
{
await tts.SpeakAsync("Hello world!", new TextToSpeechOptions
{
SpeechRate = 1.2f,
Pitch = 1.0f,
Volume = 0.8f
});
}
}
Speech-to-Text
The ISpeechToTextService uses a Start/Stop model with events, allowing multiple consumers to observe recognition results simultaneously.
public class MyService(ISpeechToTextService stt) : IDisposable
{
public async Task StartListeningAsync()
{
var access = await stt.RequestAccess();
if (access != AccessState.Available)
return;
// Subscribe to events
stt.ResultReceived += OnResult;
stt.KeywordHeard += OnKeyword;
stt.Error += OnError;
// Start listening (throws if already listening)
await stt.Start(new SpeechRecognitionOptions
{
Culture = CultureInfo.GetCultureInfo("en-US"),
SilenceTimeout = TimeSpan.FromSeconds(3),
Keywords = ["Yes", "No", "Maybe"]
});
}
public async Task StopListeningAsync()
{
await stt.Stop(); // no-op if not listening
stt.ResultReceived -= OnResult;
stt.KeywordHeard -= OnKeyword;
stt.Error -= OnError;
}
void OnResult(object? sender, SpeechRecognitionResult result)
=> Console.WriteLine($"[{(result.IsFinal ? "FINAL" : "partial")}] {result.Text}");
void OnKeyword(object? sender, string keyword)
=> Console.WriteLine($"Keyword detected: {keyword}");
void OnError(object? sender, SpeechRecognitionError error)
=> Console.WriteLine($"Error: {error.Message}");
public void Dispose() => StopListeningAsync().GetAwaiter().GetResult();
}
Extension Methods (Convenience)
// Simple: wait for silence (starts and stops automatically)
var text = await stt.ListenUntilSilence(cancellationToken: ct);
// Wake word: "Hey Computer, do something" → returns "do something"
var command = await stt.StatementAfterKeyword(["Hey Computer"], cancellationToken: ct);
// Wait for a specific keyword (with optional timeout)
var answer = await stt.WaitListenForKeywords(["Yes", "No"], timeout: TimeSpan.FromSeconds(30), cancellationToken: ct);
// Continuous keyword stream
await foreach (var keyword in stt.ListenForKeywords(["Up", "Down", "Left", "Right"], cancellationToken: ct))
{
Console.WriteLine($"Direction: {keyword}");
}
Custom Cloud Provider
Implement ISpeechToTextProvider and/or ITextToSpeechProvider from Shiny.Speech.Cloud:
public class MyCloudSttProvider : ISpeechToTextProvider
{
public async IAsyncEnumerable<SpeechRecognitionResult> RecognizeAsync(
Stream audioStream,
SpeechRecognitionOptions? options = null,
CancellationToken cancellationToken = default)
{
// Read PCM audio from audioStream (16kHz, 16-bit, mono)
// Yield recognition results...
}
}
// Register:
builder.Services.AddCloudSpeechToText<MyCloudSttProvider>();
Platform Requirements
| Platform | STT | TTS | Audio Capture | Audio Playback |
|---|---|---|---|---|
| iOS 15+ (incl. CarPlay) | SFSpeechRecognizer | AVSpeechSynthesizer | AVAudioEngine | AVAudioPlayer |
| Android 26+ | SpeechRecognizer | Android TTS | AudioRecord | MediaPlayer |
| Windows 10 19041+ | Windows.Media.SpeechRecognition | Windows.Media.SpeechSynthesis | AudioGraph | MediaPlayer |
| Browser (WASM) | Web Speech API (SpeechRecognition) |
Web Speech API (SpeechSynthesis) |
Web Audio API (getUserMedia + ScriptProcessorNode) |
HTML5 Audio |
Browser (Blazor WebAssembly)
No manifest changes needed — the browser prompts the user for microphone access automatically. Include the JS interop module in your index.html:
<script src="shiny-speech.js"></script>
Note:
IAudioSourcecaptures raw PCM audio in the browser using the Web Audio API (getUserMedia+ScriptProcessorNode), downsampled to 16kHz 16-bit mono. Audio playback (IAudioPlayer) accepts any browser-supported format via a base64 data URL.
iOS/macOS
Add to Info.plist:
<key>NSSpeechRecognitionUsageDescription</key>
<string>Speech recognition description</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone description</string>
Android
Add to AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- OpenAI (>= 2.10.0)
- Shiny.Speech.Cloud (>= 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.0 | 31 | 5/13/2026 |
| 2.0.0-beta-0002 | 40 | 5/13/2026 |
| 1.2.1 | 44 | 5/12/2026 |
| 1.2.1-beta-0002 | 50 | 5/11/2026 |