@picovoice/picovoice-react
Version:
React component for Picovoice SDK for Web
257 lines (185 loc) • 8.2 kB
Markdown
# Picovoice SDK for React
# Picovoice
Made in Vancouver, Canada by [Picovoice](https://picovoice.ai)
Picovoice is an end-to-end platform for building voice products on your terms. It enables creating voice experiences
similar to Alexa and Google. But it entirely runs 100% on-device. Picovoice is
- **Private:** Everything is processed offline. Intrinsically HIPAA and GDPR-compliant.
- **Reliable:** Runs without needing constant connectivity.
- **Zero Latency:** Edge-first architecture eliminates unpredictable network delay.
- **Accurate:** Resilient to noise and reverberation. It outperforms cloud-based alternatives by wide margins
[*](https://github.com/Picovoice/speech-to-intent-benchmark#results).
- **Cross-Platform:** Design once, deploy anywhere. Build using familiar languages and frameworks.
## Compatibility
- Chrome / Edge
- Firefox
- Safari
### Restrictions
IndexedDB and WebWorkers are required to use `Picovoice React`. Browsers without support (i.e. Firefox Incognito Mode)
should use the [`PicovoiceWeb binding`](https://github.com/Picovoice/picovoice/tree/master/sdk/web) main thread method.
## Installation
### Package
Using `yarn`:
```console
yarn add @picovoice/picovoice-react @picovoice/web-voice-processor
```
or using `npm`:
```console
npm install --save @picovoice/picovoice-react @picovoice/web-voice-processor
```
Picovoice is also available for React Native as a separate package. See [@picovoice/picovoice-react-native](https://www.npmjs.com/package/@picovoice/picovoice-react-native).
To use the Porcupine or Rhino engines individually with React, see [@picovoice/porcupine-react](https://www.npmjs.com/package/@picovoice/porcupine-web-react) and [@picovoice/porcupine-rhino-react](https://www.npmjs.com/package/@picovoice/rhino-react).
### AccessKey
Picovoice requires a valid `AccessKey` at initialization. `AccessKey` acts as your credentials when using
Picovoice SDKs.
You can get your `AccessKey` for free. Make sure to keep your `AccessKey` secret.
Signup or Login to [Picovoice Console](https://console.picovoice.ai/) to get your `AccessKey`.
## Usage
Picovoice requires a Porcupine keyword file (`.ppn`), a Rhino context file (`.rhn`) and model parameter files for both engines (`.pv`).
Each file offers two options on how to provide it to Picovoice:
### Public Directory
**NOTE**: Due to modern browser limitations of using a file URL, this method does __not__ work if used without hosting a server.
This method fetches the given file from the public directory and uses it to initialize Picovoice. Set the `publicPath` string to use this method.
### Base64
**NOTE**: This method works without hosting a server, but increases the size of the model file roughly by 33%.
This method uses a base64 string of the given file and uses it to initialize Picovoice.
Use the built-in script `pvbase64` to base64 your `.ppn`, `.rhn` or `.pv` file:
```console
npx pvbase64 -i ${PICOVOICE_FILE} -o ${BASE64_FILENAME}.js
```
The output will be a js file containing a string which you can import into any file of your project.
Set the `base64` string with the imported js string use this method.
### Picovoice Initialization Files
Picovoice saves and caches your model (`.pv`), keyword (`.ppn`) and context (`.rhn`) files in the IndexedDB to be used by Web Assembly.
Use a different `customWritePath` variable choose the name the file will have in storage and set the `forceWrite` value to true to force an overwrite of the file.
If the file changes, `version` should be incremented to force the cached file to be updated.
Either `base64` or `publicPath` must be set for each file to instantiate Picovoice. If both are set for a particular file, Picovoice will use the `base64` parameter.
```typescript
// Custom keyword (.ppn)
const porcupineKeyword = {
publicPath: ${KEYWORD_RELATIVE_PATH},
// or
base64: ${KEYWORD_BASE64_STRING},
label: ${KEYWORD_LABEL},
// Optional
customWritePath: 'custom_keyword',
forceWrite: true,
version: 1,
sensitivity: 0.6
}
// Context (.rhn)
const rhinoContext = {
publicPath: ${CONTEXT_RELATIVE_PATH},
// or
base64: ${CONTEXT_BASE64_STRING},
// Optionals
customWritePath: 'custom_context',
forceWrite: true,
version: 1,
sensitivity: 0.3,
}
// Model (.pv)
const porcupineOrRhinoModel = {
publicPath: ${MODEL_RELATIVE_PATH},
// or
base64: ${MODEL_BASE64_STRING},
// Optionals
customWritePath: 'custom_model',
forceWrite: true,
version: 1,
}
```
Additional engine options are provided via the `options` parameter.
Use `endpointDurationSec` and `requireEndpoint` to control the engine's endpointing behaviour.
An endpoint is a chunk of silence at the end of an utterance that marks the end of spoken command.
```typescript
// Optional. These are the default values
const options = {
endpointDurationSec: 1.0,
requireEndpoint: true
}
```
### Initialize Picovoice Hook
Use `usePicovoice` and `init` to initialize the Picovoice Hook:
```typescript
import { usePicovoice } from '@picovoice/porcupine-react';
const {
wakeWordDetection,
inference,
contextInfo,
isLoaded,
isListening,
error,
init,
start,
stop,
release,
} = usePicovoice();
await init(
${ACCESS_KEY},
porcupineKeyword,
porcupineModel,
rhinoContext,
rhinoModel
);
```
In case of any errors, use `error` state to check the error message, else
use the `isLoaded` variable to check if `Picovoice` has loaded.
### Processing Audio
The Picovoice React SDK takes care of audio processing internally using our [WebVoiceProcessor](https://github.com/Picovoice/web-voice-processor) to record audio.
To start listening for your wake word and follow-on commands, call the `start` function:
```typescript
await start();
```
If audio recording has begun, `isListening` will be set to true.
Use `wakeWordDetection` and `inference` to get results from Picovoice:
```typescript
useEffect(() => {
if (wakeWordDetection !== null) {
console.log(`Picovoice detected keyword: ${wakeWordDetection.label}`);
}
}, [wakeWordDetection])
useEffect(() => {
if (inference !== null) {
if (inference.isUnderstood) {
console.log(inference.intent)
console.log(inference.slots)
}
}
}, [inference])
```
Run `stop` to stop audio recording:
```typescript
await stop();
```
`isListening` should be set to false after `stop`.
### Release
When using in a component, you can run `release` to clean up all resources used by Picovoice:
```typescript
await release();
```
This will set `isLoaded` and `isListening` to false.
You do not need to call `release` when your component is unmounted - the hook will clean up automatically on unmount.
## Custom Keyword and Contexts
Create custom keywords and contexts using the [Picovoice Console](https://console.picovoice.ai/).
Train a Porcupine keyword to obtain a keyword file (`.ppn`) and a Rhino context to obtain a context file (`.rhn`).
To use them with the Web SDK, train the keywords and contexts for the target platform `Web (WASM)`.
These model files can be used directly with `publicPath`, but if `base64` is preferable, convert to base64
JavaScript variable using the built-in `pvbase64` script:
```console
npx pvbase64 -i ${INPUT_BINARY_FILE}.{ppn/rhn} -o ${OUTPUT_BASE64_FILE}.js -n ${BASE64_VAR_NAME}
```
Similar to the model file (`.pv`), these files are saved in IndexedDB to be used by Web Assembly.
Either `base64` or `publicPath` must be set for each file to initialize Picovoice. If both are set, Picovoice will use
the `base64` model.
```typescript
const picovoiceFile = {
publicPath: "${FILE_RELATIVE_PATH}",
// or
base64: "${FILE_BASE64_STRING}",
}
```
## Switching Languages
In order to use Picovoice with different languages you need to use the corresponding model file (`.pv`) for the desired language. The model files for all
supported languages are available in the [Porcupine](https://github.com/Picovoice/porcupine/tree/master/lib/common) and [Rhino](https://github.com/Picovoice/rhino/tree/master/lib/common) GitHub repositories.
## Demo
For example usage refer to the [React demo application](https://github.com/Picovoice/picovoice/tree/master/demo/react).