reactPicovoice SDK - React Web Quick Start

  • Wake Word Detection
  • Offline Hotword Detection
  • Local Voice Commands
  • Always Listening
  • Voice Activation
  • NLU
  • Follow-on command


  • yarn (or npm)
  • Secure browser context (i.e. HTTPS or localhost)


  • Chrome, Edge
  • Firefox
  • Safari

Install the NPM packages

Using Picovoice with React requires installing three packages: the binding package, @picovoice/picovoice-web-react, the language-specific web worker package (e.g. @picovoice/picovoice-web-en-worker), and the @picovoice/web-voice-processor.

Use yarn or npm to install the packages to your project:

yarn add @picovoice/picovoice-web-react @picovoice/picovoice-web-en-worker @picovoice/web-voice-processor


npm install @picovoice/picovoice-web-react @picovoice/picovoice-web-en-worker @picovoice/web-voice-processor

Demo application

There is a React demo project available on the Picovoice GitHub repository. The demo project was bootstrapped with Create React App.

Clone Picovoice GitHub repository

If using SSH, clone the Picovoice repository with:

git clone --recurse-submodules [email protected]:Picovoice/picovoice.git

If using HTTPS, then type:

git clone --recurse-submodules

Install dependencies and run

Use yarn or npm to install the demo dependencies and start it:

yarn start


npm install
npm run start

Open http://localhost:3000 to view it in the browser.

Try Picovoice SDK

The demo uses "Bumblebee" as the Porcupine wake word and "Alarm Clock" as the Rhino context for follow-on commands.

When the demo is loaded and you have granted microphone permissions, say the following e.g.:

"Bumblebee, set a timer for five minutes"

The output should look similar to below:

Keyword Detections:
"isFinalized": true,
"isUnderstood": true,
"intent": "setTimer",
"slots": {
"minutes": "5"

You can see that when the wake word "Bumblebee" is detected, internally Picovoice SDK switches control to the Rhino ('rhn') engine for naturally-spoken command inference. Rhino operates on a specific domain for dramatic efficiency and performance gains over generic Speech-to-Text transcription approaches. In this instance, it understands commands in the domain of "Alarm Clock".

The voice engine control will return to Porcupine ('ppn'), which will once again be listening for "Bumblebee" to start the voice interaction again.

"Bumblebee, what's the meaning of life?"

Keyword Detections:
"isFinalized": true,
"isUnderstood": false,
"intent": null,
"slots": {}

This command falls outside of the domain of "Alarm Clock" and is therefore not understood.

The Alarm Clock was trained to understand a particular set of expressions. These are built using a simple grammar and grouped together into a YAML file. This file is trained by Picovoice Console to create a .rhn file.

- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:minutes [minute, minutes] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:minutes [minute, minutes]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:hours [hour, hours]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:minutes [minute, minutes] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:minutes [minute, minutes]"
- "set (a, an, the) [alarm, timer] for $pv.TwoDigitInteger:seconds [second, seconds]"
- "$pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:minutes [minute, minutes] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "$pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:minutes [minute, minutes]"
- "$pv.TwoDigitInteger:hours [hour, hours] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "$pv.TwoDigitInteger:hours [hour, hours]"
- "$pv.TwoDigitInteger:minutes [minute, minutes] (and) $pv.TwoDigitInteger:seconds [second, seconds]"
- "$pv.TwoDigitInteger:minutes [minute, minutes]"
- "$pv.TwoDigitInteger:seconds [second, seconds]"
- "reset (the) (timer)"
- "[pause, stop] (the) (timer)"
- "resume (the) (timer)"

Issue with this doc? Please let us know.