Cross-platform audio for Novolis apps — outside any graphics engine.
| Package | Role |
|---|---|
Novolis.Audio |
Meta package (abstractions + runtime) |
Novolis.Audio.Abstractions |
IAudioEngine, ISoundHandle, NullAudioEngine |
Novolis.Audio.Runtime |
Generated facades + MiniaudioAudioEngine |
Novolis.Audio.Bindings |
Generated [LibraryImport] to novolis_audio |
Novolis.Audio.Native |
RID native binaries (transitive) |
Novolis.Audio.Manifests |
C# binding manifests (maintainers) |
| Package | Role |
|---|---|
Novolis.Audio.Core |
PCM buffers, WAV read/write |
Novolis.Audio.Codecs |
Codec contracts (WAV in Core today) |
Novolis.Audio.Effects |
PCM effect chains |
Novolis.Audio.Playback |
PCM playback (NaudioPcmPlayback) |
Novolis.Audio.Voice |
SpeakAsync / WriteToFileAsync facade |
Novolis.Audio.Voice.Abstractions |
TTS contracts |
Novolis.Audio.Voice.SherpaOnnx |
Sherpa-ONNX synthesizer |
Novolis.Audio.Voice.Phraseology |
ICAO phraseology |
Novolis.Audio.Voice.Atc |
ATC profile preset |
Native game playback uses a miniaudio C shim (novolis_audio.dll). Voice uses Sherpa ONNX + NAudio (separate stack).
using Novolis.Audio;
using Novolis.Audio.Runtime;
await using IAudioEngine engine = new MiniaudioAudioEngine();
if (!engine.Start())
return;
var sound = engine.LoadSound("click.wav");
engine.Play(sound);using Novolis.Audio.Voice;
IVoiceService voice = new VoiceServiceBuilder().BuildService();
await voice.SpeakAsync("Tower, ready for departure.");
await voice.WriteToFileAsync("Cleared for takeoff.", new FileInfo("atc.wav"));English Piper TTS model is bundled under models/en-us-piper-amy/ (Git LFS). Clone with git lfs install first. Override via NOVOLIS_VOICE_MODEL_DIR — see docs/voice-models.md.
dotnet run --project codegen/Novolis.Audio.Pipeline -- run maintainer
dotnet build Novolis.Audio.slnx -c Release