Tesserae.Lauschwerk
26.10.72899
dotnet add package Tesserae.Lauschwerk --version 26.10.72899
NuGet\Install-Package Tesserae.Lauschwerk -Version 26.10.72899
<PackageReference Include="Tesserae.Lauschwerk" Version="26.10.72899" />
<PackageVersion Include="Tesserae.Lauschwerk" Version="26.10.72899" />
<PackageReference Include="Tesserae.Lauschwerk" />
paket add Tesserae.Lauschwerk --version 26.10.72899
#r "nuget: Tesserae.Lauschwerk, 26.10.72899"
#:package Tesserae.Lauschwerk@26.10.72899
#addin nuget:?package=Tesserae.Lauschwerk&version=26.10.72899
#tool nuget:?package=Tesserae.Lauschwerk&version=26.10.72899
Tesserae.Lauschwerk
On-device voice input for Tesserae applications: keep the user's voice and drop the rest, tell when someone speaks, hear any typed wake word, recognize a voice. Typed C# (Transpose) over the Lauschwerk web SDK - a Rust engine compiled to WebAssembly, which the package carries - plus ready-made Tesserae components. Everything runs in the browser - no server, no key, no telemetry.
Preview (0.x). Apache-2.0, code and weights. Where it comes from: the repository's README.
Install
<PackageReference Include="Tesserae.Lauschwerk" Version="..." />
The build copies the SDK into your site at assets/js/lauschwerk/ (about 620 KB, the engine included).
Nothing is fetched until something needs it.
The models ship in the package (7.5 MB for all five, sha256-checked at build) and the build copies them to
assets/js/lauschwerk/models/, where the SDK loads them from by default: nothing is downloaded from a third
party, and no user sends anyone their IP. To serve them from somewhere else (a CDN):
LauschwerkJs.ModelBaseUrl = "https://models.example.com/lauschwerk"; // once, before the first input
A call (WebRTC)
using Tesserae.Lauschwerk;
var input = await LauschwerkJs.CreateCallInputAsync(new CallInputSettings { Learn = true, FarEnd = remoteTrack });
pc.addTrack(input.Track); // only the user's voice goes out
input.Bind(pc.getSenders()[0]);
input.VoiceprintLearned += print => localStorage.setItem("print", print.ToJson());
A voice agent
var input = await LauschwerkJs.CreateAgentInputAsync(new AgentInputSettings { FarEndManual = true, Format = PcmFormat.Int16, SampleRate = 24000 });
input.Audio += pcm => socket.send(pcm); // continuous 32 ms packets
input.Utterance += u => Transcribe(u.Pcm); // one per sentence, 300 ms pre-roll
input.FarEndActive(true); // the agent starts speaking
A wake word
var word = await LauschwerkJs.CompileWordAsync("Hey Nova", SpeechLanguage.English); // any word, 7 languages
var wake = await LauschwerkJs.CreateWakeListenerAsync(new WakeListenerSettings(word));
wake.Wake += e => StartListening(e.Audio);
Files
var r = await LauschwerkJs.ProcessAsync(file, new ProcessSettings { Focus = true, Cue = true });
r.Audio; // AudioClip, 16 kHz, processed
r.Speech; // where speech is
r.ToWav(); // Blob
Components
using static Tesserae.Lauschwerk.LauschwerkUI;
| Factory | What it is |
|---|---|
CallInputPanel() / AgentInputPanel() |
start/stop, mode, speaking, latency, microphone and output meters, learn progress |
WakeWordPanel("Hey Nova") |
type a word, pick a language, listen; live closeness and a list of wakes |
WordEnrollmentPanel("Hey Nova") |
the user says the word three times: a calibrated word and a voiceprint |
VoiceprintEnrollment() |
read a text aloud, get a voiceprint; .RememberIn(key) keeps it |
AudioFileProcessor() |
pick or drop a recording: before/after waveforms with speech and wakes, playable, downloadable |
ModelPreloader(LauschwerkUsage.Call) |
a settings row that downloads a usage's models ahead of time |
LevelMeter(), Waveform(clip), LiveWaveform(), ListeningOverlay(), SpeechIndicator(), ModeBadge() |
the pieces the panels are made of; LiveWaveform scrolls live audio (Bind(agentInput), Track(track), Feed(samples)) and highlights a stretch of it (Mark(secondsAgoStart, secondsAgoEnd), MarkWake(wakeEvent) for where a wake word was heard); ListeningOverlay opens a panel over the page with the sound as bars (the Listening Studies "Bars") and, with ShowTranscript(), the words as they are heard (SetTranscript) |
They draw with Tesserae's --tss-* tokens, so they follow light and dark mode and the custom themes.
Good to know
- A near microphone, one person. lauschwerk keeps the closest voice (or the voice of a print). 16 kHz voice: the output carries speech up to 8 kHz.
- Only a missing microphone fails an input (
LauschwerkException.Code:mic.denied,mic.not-found,mic.busy,page.insecure,browser.unsupported). Models still loading, a failed download, a slow device: the input runsVoiceMode.Rawwith aRawReason, and the SDK retries. - Content Security Policy:
script-src 'self' 'wasm-unsafe-eval'; worker-src 'self'- the worker and worklet are same-origin files, noblob:needed. Add the models' origin toconnect-srcif they are not on yours. - Privacy: no network call besides the models. A voiceprint your app stores is biometric data (GDPR art. 9).
A sample gallery with a page per feature lives in the repository.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Tesserae (>= 2026.10.72651)
- Transpose.BCL (>= 26.10.7126)
- Transpose.Core (>= 26.10.6989)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Tesserae.Lauschwerk:
| Package | Downloads |
|---|---|
|
Curiosity.FrontEnd
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.10.72899 | 2,377 | 10/26/2026 |
| 26.10.72885 | 100 | 10/26/2026 |
| 26.10.72876 | 145 | 10/26/2026 |
| 26.10.72872 | 99 | 10/26/2026 |
| 26.10.72871 | 95 | 10/26/2026 |
| 26.10.72870 | 90 | 10/26/2026 |