csharpPorcupine - .NET API

  • Wake Word Detection
  • Local Voice Commands
  • Offline Keyword Spotting
  • Always Listening
  • Voice Activation
  • Linux
  • macOS
  • Windows
  • .NET
  • C#

This document outlines how to integrate Porcupine wake word engine within an application using its .NET API.


  • .NET SDK 3.1+


  • .NET Standard 2.0, .NET Core 2.0+ and .NET Framework 4.6.1+
  • Runs on Linux (x86_64), macOS (x86_64) and Windows (x86_64)


Create an instance of the engine

using Pv;
Porcupine handle = Porcupine.Create(keywords: new List<string> { "picovoice" });

handle is an instance of Porcupine that detects utterances of "Picovoice". The keywords input argument is a shorthand for accessing default keyword model files shipped with the package. The list of default keywords can be retrieved by

using Pv;
foreach (string keyword in Porcupine.KEYWORDS)

Porcupine can detect multiple keywords concurrently

using Pv;
Porcupine handle = Porcupine.Create(keywords: new List<string>{ "bumblebee", "picovoice" });

To detect non-default keywords use the keywordPaths input argument instead

using Pv;
var keywordPaths = new List<string>{ "/absolute/path/to/keyword/one", "/absolute/path/to/keyword/two", ...}
Porcupine handle = Porcupine.Create(keywordPaths: keywordPaths);

The sensitivity of the engine can be tuned per-keyword using the sensitivities input argument

using Pv;
Porcupine handle = Porcupine.Create(keywords: new List<string>{ "grapefruit", "porcupine" },
sensitivities: new List<float>{ 0.6f, 0.35f });

Sensitivity is the parameter that enables trading miss rate for the false alarm rate. It is a floating point number within [0, 1]. A higher sensitivity reduces the miss rate at the cost of increased false alarm rate.

When initialized, the valid sample rate is given by handle.SampleRate. Expected frame length (number of audio samples in an input array) is handle.FrameLength. The engine accepts 16-bit linearly-encoded PCM and operates on single-channel audio.

short[] GetNextAudioFrame()
// .. get audioFrame
return audioFrame;
var keywordIndex = handle.Process(GetNextAudioFrame());
if(keywordIndex >= 0)
// .. detection event logic/callback

Porcupine will have its resources freed by the garbage collector, but to have resources freed immediately after use, wrap it in a using statement:

using(Porcupine handle = Porcupine.Create(keywords: new List<string> { "picovoice" }))
// .. Porcupine usage here

Custom Wake Word

You can create custom Porcupine wake word models using Picovoice Console.

Issue with this doc? Please let us know.