Rustpotter

A free and open source wake word spotter forged in rust.

Warning!

This project is under active development and testing, api and model format are broken usually, consider rustpotter and all the related projects in beta until version 1.0.0 is published.

But don't hesitate to report any issues in the meantime.

Description

This project allows to detect specific wake words on a live audio stream.

To do so it generates a set of features from some audio samples to later compare them with the features generated from the live stream, to calculate the probability of a match.

The features can be loaded from a previous generated model file or extracted from the samples before start the live streaming.

Web Demo

This web demo is available so you can quickly try out Rustpotter using a web browser

It includes some models generated using multiple voices from a text-to-speech service, you can also load your own ones.

Audio Format

This project uses wav, it works internally with the spec 48000hz 16 bit 1 channel int, but allows to configure the detector to work with other specs.

The detector configuration is ignored when adding a keyword with samples (add_wakeword method) as the wav spec is read from each file header (so raw samples are not allowed).

Related projects

Versioning

All related packages use the version number of the rustpotter dependency (PATCH number could defer) so models generated with some version of the cli should work with other packages on the same version.

Some examples:

Create wakeword model:

rust let mut detector_builder = detector::FeatureDetectorBuilder::new(); let mut word_detector = detector_builder.build(); let name = String::from("hey home"); let path = String::from("./hey_home.rpw"); word_detector.add_wakeword( name.clone(), false, None, None, vec!["./<audio sample path>.wav", "./<audio sample path>2.wav", ...], ); match word_detector.create_wakeword_model(name.clone(), path) { Ok(_) => { println!("{} created!", name); } Err(message) => { panic!(message); } };

Spot wakeword:

```rust let mut detectorbuilder = detector::FeatureDetectorBuilder::new(); detectorbuilder.setthreshold(0.4); detectorbuilder.setsamplerate(16000); let mut worddetector = detectorbuilder.build(); let result = worddetector.addwakewordfrommodel(command.modelpath, command.averagetemplates, true, None); if result.iserr() { panic!("Unable to load wakeword model"); } while true { let mut framebuffer: Vec = vec![0; worddetector.getsamplesperframe()]; // fill the buffer ... let detection = worddetector.processpcmsigned(framebuffer); if detection.is_some() { println!("Detected '{}' with score {}!", detection.unwrap().wakeword, detection.unwrap().score) } }

```

References

This project started as a port of the project node-personal-wakeword and uses the method described in this medium article.

Motivation

The motivation behind this project is to learn about audio analysis and Rust. Also to have access to an open source personal wakeword spotter to use in other open projects.

Feel free to suggest any improvements or fixes.