13 package ai.picovoice.porcupine;
15 import android.content.Context;
16 import android.content.res.Resources;
18 import java.io.BufferedInputStream;
19 import java.io.BufferedOutputStream;
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.util.Arrays;
25 import java.util.HashMap;
38 R.raw.alexa,
R.raw.americano,
R.raw.blueberry,
R.raw.bumblebee,
R.raw.computer,
R.raw.grapefruit,
39 R.raw.grasshopper,
R.raw.hey_google,
R.raw.hey_siri,
R.raw.jarvis,
R.raw.ok_google,
R.raw.picovoice,
40 R.raw.porcupine,
R.raw.terminator,
48 System.loadLibrary(
"pv_porcupine");
67 String[] keywordPaths,
69 handle =
init(accessKey, modelPath, keywordPaths, sensitivities);
75 public void delete() {
97 new IllegalStateException(
"Attempted to call Porcupine process after delete."));
101 new IllegalArgumentException(
"Passed null frame to Porcupine process."));
106 new IllegalArgumentException(
107 String.format(
"Porcupine process requires frames of length %d. " +
135 private native
long init(
138 String[] keywordPaths,
139 float[] sensitivities);
141 private native
void delete(
long object);
143 private native
int process(
long object,
short[] pcm);
209 this.sensitivities =
new float[]{sensitivity};
214 final Resources resources =
context.getResources();
218 final String keywordName = resources.getResourceEntryName(resourceId);
220 resources.openRawResource(resourceId),
221 keywordName +
".ppn");
226 resources.openRawResource(
R.raw.porcupine_params),
227 resources.getResourceEntryName(
R.raw.porcupine_params) +
".pv");
230 }
catch (IOException ex) {
236 InputStream is =
new BufferedInputStream(srcFileStream, 256);
237 OutputStream os =
new BufferedOutputStream(
context.openFileOutput(dstFilename, Context.MODE_PRIVATE), 256);
239 while ((r = is.read()) != -1) {
246 return new File(
context.getFilesDir(), dstFilename).getAbsolutePath();
266 String modelFilename = modelFile.getName();
267 if (!modelFile.exists() && !modelFilename.equals(
"")) {
272 }
catch (IOException ex) {
278 if (this.accessKey ==
null || this.accessKey.equals(
"")) {
282 if (this.keywordPaths !=
null && this.keywords !=
null) {
284 "Only one of the two arguments may be set for initialization.");
287 if (this.keywordPaths ==
null) {
288 if (this.keywords ==
null) {
292 this.keywordPaths =
new String[
keywords.length];
293 for (
int i = 0; i <
keywords.length; i++) {
303 String keywordFilename = keywordFile.getName();
304 if (!keywordFile.exists() && !keywordFilename.equals(
"")) {
309 }
catch (IOException ex) {
323 String.format(
"Number of keywords (%d) " +
324 "does not match number of sensitivities (%d)",