Skip to content

tu-studio/anira

Repository files navigation

anira Logo

Build Status

anira is a high-performance library designed to enable easy real-time safe integration of neural network inference within audio applications. Compatible with multiple inference backends, LibTorch, ONNXRuntime, and Tensorflow Lite, anira bridges the gap between advanced neural network architectures and real-time audio processing.

Features

  • Real-time Safe Execution: Ensures deterministic runtimes suitable for real-time audio applications
  • Thread Pool Management: Utilizes a static thread pool to avoid oversubscription and enables efficient parallel inference
  • Built-in Benchmarking: Includes tools for evaluating the real-time performance of neural networks
  • Comprehensive Inference Engine Support: Integrates common inference engines, LibTorch, ONNXRuntime, and TensorFlow Lite
  • Flexible Neural Network Integration: Supports a variety of neural network models, including stateful and stateless models
  • Cross-Platform Compatibility: Works seamlessly on macOS, Linux, and Windows

Usage

An extensive anira usage guide can be found here.

The basic usage of anira is as follows:

#include <anira/anira.h>

// Create a model configuration struct for your neural network
anira::InferenceConfig myNNConfig(
    "path/to/your/model.onnx (or *.pt, *.tflite)", // Model path
    {2048, 1, 150}, // Input shape
    {2048, 1}, // Output shape
    42.66f // Maximum inference time in ms
);

// Create a pre- and post-processor instance
anira::PrePostProcessor myPrePostProcessor;

// Create an InferenceHandler instance
anira::InferenceHandler inferenceHandler(myPostProcessor, myNNConfig);

// Prepare audio data for inference
anira::HostAudioConfig audioConfig {
    1, // currently only mono is supported
    bufferSize,
    sampleRate
};

// Allocate memory for audio processing
inferenceHandler.prepare(audioConfig);

// Real-time safe audio processing in process callback of your application
processBlock(float** audioData, int numSamples) {
    inferenceHandler.process(audioData, numSamples);
}
// audioData now contains the processed audio samples

Install

On Apple Silicon Macs you need to install the OpenMP library via Homebrew (brew install libomp).

CMake

anira can be easily integrated into your CMake project. Either add anira as a submodule or download the pre-built binaries from the releases page.

Add as a git submodule

# Add anira repo as a submodule
git submodule add https://github.com/tu-studio/anira.git modules/anira

In your CMakeLists.txt, add anira as a subdirectory and link your target to the anira library:

# Setup your project and target
project(your_project)
add_executable(your_target main.cpp ...)

# Add anira as a subdirectory
add_subdirectory(modules/anira)

#Link your target to the anira library
target_link_libraries(your_target anira::anira)

With pre-built binaries

Download the pre-built binaries from your operating system and architecture from the releases page.

# Setup your project and target
project(your_project)
add_executable(your_target main.cpp ...)

# Add the path to the anira library as cmake prefix path and find the package
list(APPEND CMAKE_PREFIX_PATH "path/to/anira")
find_package(anira REQUIRED)

# Link your target to the anira library
target_link_libraries(your_target anira::anira)

Build from source

You can also build anira from source using CMake. All dependencies are automatically installed during the build process.

git clone https://github.com/tu-studio/anira
cmake . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --target anira

Build options

By default, all three inference engines are installed. You can disable specific backends as needed:

  • LibTorch: -DANIRA_WITH_LIBTORCH=OFF
  • OnnxRuntime: -DANIRA_WITH_ONNXRUNTIME=OFF
  • Tensrflow Lite. -DANIRA_WITH_TFLITE=OFF

Moreover the following options are available:

  • Build anira with benchmark capabilities: -DANIRA_WITH_BENCHMARK=ON
  • Populate example neural models: -DANIRA_WITH_EXTRAS=ON
  • Build example applications: -DANIRA_WITH_EXAMPLES=ON

Note: The example applications require the example neural models to be populated and therefore the -DANIRA_WITH_EXTRAS=ON option.

Documentation

For using anira with your custom models, check out the extensive usage guide. Detailed documentation on anira's API and will be available soon in our upcoming wiki.

Benchmark capabilities

anira allows users to benchmark and compare the inference performance of different neural network models, backends, and audio configurations. The benchmarking capabilities can be enabled during the build process by setting the -DANIRA_WITH_BENCHMARK=ON flag. The benchmarks are implemented using the Google Benchmark and Google Test libraries. Both libraries are automatically linked with the anira library in the build process when benchmarking is enabled. To provide a reproducible and easy-to-use benchmarking environment, anira provides a custom Google benchmark fixture anira::benchmark::ProcessBlockFixture that is used to define benchmarks. This fixture offers many useful functions for setting up and running benchmarks. For more information on how to use the benchmarking capabilities, check out the benchmarking guide.

Examples

Build in examples

  • Simple JUCE Audio Plugin: Demonstrates how to use anira in a real-time audio JUCE / VST3-Plugin.
  • Benchmark: Demonstrates how to use anira for benchmarking of different neural network models, backends and audio configurations.
  • Minimal Inference: Demonstrates how minimal inference applications can be implemented in all three backends.

Other examples

  • nn-inference-template: Another more JUCE / VST3-Plugin that uses anira for real-time safe neural network inference. This plugin is more complex than the simple JUCE Audio Plugin example and has a more appealing GUI.

Real-time safety

anira's real-time safety is checked in this repository with the radsan sanitizer.

Citation

If you use anira in your research or project, please cite our work:

@software{anira2024ackvaschulz,
  author = {Valentin Ackva and Fares Schulz},
  title = {anira: an architecture for neural network inference in real-time audio application},
  url = {https://github.com/tu-studio/anira},
  version = {x.x.x},
  year = {2024},
}

Contributors

License

This project is licensed under Apache-2.0.