Rhino
Speech-to-Intent

unlimited voice interactions, higher accuracy, and on your terms

Start Building
Talk to Sales

Accurate

Rhino achieves superior accuracy compared to IBM Watson, Google Dialogflow, Amazon Lex, and Microsoft LUIS. Picovoice backs its performance claims with open-source and reproducible benchmarks. [1]

Rhino Speech-to-Intent accuracy compared to IBM ASR, Google speech recognition, AWS transcribe, and Azure STT
Rhino Speech-to-Intent cost compared to IBM Watson, Google Dialogflow, Amazon Lex, and Microsoft LUIS

Cost-Effective

Run voice AI entirely on commodity hardware, without unbounded cloud service fees. [1] [2] [3] [4] [5]

Try it!
Arrow (pointing at microphone button)
Press the microphone button to activate the demo
SmallMediumLarge
Single ShotDouble ShotTriple Shot
AmericanoCappuccinoCoffeeEspressoLatteMocha

Private

All voice data is processed on-device. Intrinsically HIPAA and GDPR compliant.

Zero-Latency

Edge-first architecture eliminates unpredictable network delay.

Reliable

100% of the voice recognition is on-device. No concurrency limit. No downtime.

rhino = pvrhino.create(
access_key,
context_path)
while not rhino.process(audio_frame()):
pass
inference = rhino.get_inference()
Build with Python
let rhino = new Rhino(
accessKey,
contextPath);
while (!rhino.process(audioFrame())) { }
let inference = rhino.getInference();
Build with NodeJS
RhinoManager rhinoManager = new RhinoManager.Builder()
.setAccessKey(accessKey)
.setContextPath(contextPath)
.build(
appContext,
new RhinoManagerCallback() {
@Override
public void invoke(RhinoInference inference) {
// Inference callback
}
}
);
rhinoManager.start()
Build with Android
let rhinoManager = RhinoManager(
accessKey: accessKey,
contextPath: contextPath,
onInferenceCallback: { inference in
// Inference callback
});
try rhinoManager.start()
Build with iOS
const {
contextInfo,
isLoaded,
isListening,
isError,
isTalking,
errorMessage,
pushToTalk,
start,
pause,
stop,
} = useRhino(
RhinoWorkerFactory,
{
accessKey: accessKey,
context: context,
start: true
},
(rhinoInference) => {
// Inference callback
}
);
Build with React
RhinoManager rhinoManager = await RhinoManager.create(
accessKey,
contextPath,
(inference) => {
// Inference callback
});
await rhinoManager.process()
Build with Flutter
let rhinoManager = await RhinoManager.create(
accessKey,
contextPath,
(inference) => {
// Inference callback
});
await rhinoManager.process()
Build with React Native
RhinoManager rhinoManager = RhinoManager.Create(
accessKey,
contextPath,
(inference) => {
// Inference callback
});
rhinoManager.Start();
Build with Unity
constructor(private rhinoService: RhinoService) {
this.inferenceDetection = rhinoService.inference$.subscribe(
inference => {
// Inference callback
}
)
}
async ngOnInit() {
await this.rhinoService.init(
RhinoWorkerFactory,
{
accessKey: accessKey,
context: context
}
)
}
Build with Angular
<Rhino
ref="rhino"
v-bind:rhinoFactoryArgs="{
accessKey: accessKey,
context: context
}"
v-bind:rhinoFactory="factory"
v-on:rhn-inference="rhnInferenceFn"
/>
methods: {
rhnInferenceFn: function (inference) {
// Inference callback
}
}
Build with Vue
Rhino rhino = Rhino.Create(
accessKey,
contextPath);
while (rhino.Process(AudioFrame())) { }
Inference inference = rhino.GetInference();
Build with .NET
Rhino rhino = new Rhino.Builder()
.setAccessKey(accessKey)
.setContextPath(contextPath)
.build();
while (!rhino.process(audioFrame())) { }
RhinoInference inference = rhino.getInference();
Build with Java
rhino := NewRhino(
accessKey,
contextPath)
err := rhino.Init()
for {
isFinalized, err := rhino.Process(AudioFrame())
if isFinalized {
break
}
}
inference, err := rhino.GetInference()
Build with Go
let rhino: Rhino =
RhinoBuilder::new(
access_key,
context_path
)
.init()
.expect("");
loop {
if let Ok(is_finalized) = rhino.process(&audio_frame()) {
if is_finalized {
if let Ok(inference) = rhino.get_inference() {
// Inference callback
}
}
}
}
Build with Rust
pv_rhino_init(
access_key,
model_path,
context_path,
sensitivity,
require_endpoint,
&rhino);
while (true) {
pv_rhino_process(
rhino,
audio_frame(),
&is_finalized);
if (is_finalized) {
pv_rhino_get_intent(
rhino,
&intent,
&num_slots,
&slots,
&values);
}
}
Build with C

English

German
Deutsch

French
Français

Spanish
Español

Japanese
日本語

Korean
한국어

Portuguese
Português

Italian
Italiano