android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java
Go to the documentation of this file.
1 /*
2  Copyright 2021 Picovoice Inc.
3 
4  You may not use this file except in compliance with the license. A copy of the license is
5  located in the "LICENSE" file accompanying this source.
6 
7  Unless required by applicable law or agreed to in writing, software distributed under the
8  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
9  express or implied. See the License for the specific language governing permissions and
10  limitations under the License.
11 */
12 
13 package ai.picovoice.porcupine;
14 
15 import android.content.Context;
16 import android.content.res.Resources;
17 
18 import java.io.BufferedInputStream;
19 import java.io.BufferedOutputStream;
20 import java.io.File;
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;
26 
35 public class Porcupine {
36 
37  private static final int[] KEYWORDS_RESOURCES = {
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,
41  };
42  private static final HashMap<BuiltInKeyword, String> BUILT_IN_KEYWORD_PATHS = new HashMap<>();
43 
44  private static String DEFAULT_MODEL_PATH;
45  private static boolean isExtracted;
46 
47  static {
48  System.loadLibrary("pv_porcupine");
49  }
50 
51  private long handle;
52 
64  private Porcupine(
65  String accessKey,
66  String modelPath,
67  String[] keywordPaths,
68  float[] sensitivities) throws PorcupineException {
69  handle = init(accessKey, modelPath, keywordPaths, sensitivities);
70  }
71 
75  public void delete() {
76  if (handle != 0) {
77  delete(handle);
78  handle = 0;
79  }
80  }
81 
94  public int process(short[] pcm) throws PorcupineException {
95  if (handle == 0) {
96  throw new PorcupineException(
97  new IllegalStateException("Attempted to call Porcupine process after delete."));
98  }
99  if (pcm == null) {
100  throw new PorcupineException(
101  new IllegalArgumentException("Passed null frame to Porcupine process."));
102  }
103 
104  if (pcm.length != getFrameLength()) {
105  throw new PorcupineException(
106  new IllegalArgumentException(
107  String.format("Porcupine process requires frames of length %d. " +
108  "Received frame of size %d.", getFrameLength(), pcm.length)));
109  }
110 
111  return process(handle, pcm);
112  }
113 
119  public native String getVersion();
120 
126  public native int getFrameLength();
127 
133  public native int getSampleRate();
134 
135  private native long init(
136  String accessKey,
137  String modelPath,
138  String[] keywordPaths,
139  float[] sensitivities);
140 
141  private native void delete(long object);
142 
143  private native int process(long object, short[] pcm);
144 
145  public enum BuiltInKeyword {
159  TERMINATOR
160  }
161 
165  public static class Builder {
166 
167  private String accessKey = null;
168  private String modelPath = null;
169  private String[] keywordPaths = null;
170  private BuiltInKeyword[] keywords = null;
171  private float[] sensitivities = null;
172 
173  public Builder setAccessKey(String accessKey) {
174  this.accessKey = accessKey;
175  return this;
176  }
177 
178  public Builder setModelPath(String modelPath) {
179  this.modelPath = modelPath;
180  return this;
181  }
182 
184  this.keywordPaths = keywordPaths;
185  return this;
186  }
187 
189  this.keywordPaths = new String[]{keywordPaths};
190  return this;
191  }
192 
194  this.keywords = keywords;
195  return this;
196  }
197 
199  this.keywords = new BuiltInKeyword[]{keyword};
200  return this;
201  }
202 
204  this.sensitivities = sensitivities;
205  return this;
206  }
207 
208  public Builder setSensitivity(float sensitivity) {
209  this.sensitivities = new float[]{sensitivity};
210  return this;
211  }
212 
213  private void extractPackageResources(Context context) throws PorcupineIOException {
214  final Resources resources = context.getResources();
215 
216  try {
217  for (final int resourceId : KEYWORDS_RESOURCES) {
218  final String keywordName = resources.getResourceEntryName(resourceId);
219  final String keywordPath = extractResource(context,
220  resources.openRawResource(resourceId),
221  keywordName + ".ppn");
222  BUILT_IN_KEYWORD_PATHS.put(BuiltInKeyword.valueOf(keywordName.toUpperCase()), keywordPath);
223  }
224 
226  resources.openRawResource(R.raw.porcupine_params),
227  resources.getResourceEntryName(R.raw.porcupine_params) + ".pv");
228 
229  isExtracted = true;
230  } catch (IOException ex) {
231  throw new PorcupineIOException(ex);
232  }
233  }
234 
235  private String extractResource(Context context, InputStream srcFileStream, String dstFilename) throws IOException {
236  InputStream is = new BufferedInputStream(srcFileStream, 256);
237  OutputStream os = new BufferedOutputStream(context.openFileOutput(dstFilename, Context.MODE_PRIVATE), 256);
238  int r;
239  while ((r = is.read()) != -1) {
240  os.write(r);
241  }
242  os.flush();
243 
244  is.close();
245  os.close();
246  return new File(context.getFilesDir(), dstFilename).getAbsolutePath();
247  }
248 
256  public Porcupine build(Context context) throws PorcupineException {
257 
258  if (!isExtracted) {
260  }
261 
262  if (modelPath == null) {
264  } else {
265  File modelFile = new File(modelPath);
266  String modelFilename = modelFile.getName();
267  if (!modelFile.exists() && !modelFilename.equals("")) {
268  try {
270  context.getAssets().open(modelPath),
271  modelFilename);
272  } catch (IOException ex) {
273  throw new PorcupineIOException(ex);
274  }
275  }
276  }
277 
278  if (this.accessKey == null || this.accessKey.equals("")) {
279  throw new PorcupineInvalidArgumentException("No AccessKey provided to Porcupine.");
280  }
281 
282  if (this.keywordPaths != null && this.keywords != null) {
283  throw new PorcupineInvalidArgumentException("Both 'keywords' and 'keywordPaths' were set. " +
284  "Only one of the two arguments may be set for initialization.");
285  }
286 
287  if (this.keywordPaths == null) {
288  if (this.keywords == null) {
289  throw new PorcupineInvalidArgumentException("Either 'keywords' or 'keywordPaths' must be set.");
290  }
291 
292  this.keywordPaths = new String[keywords.length];
293  for (int i = 0; i < keywords.length; i++) {
294  this.keywordPaths[i] = BUILT_IN_KEYWORD_PATHS.get(keywords[i]);
295  }
296  } else {
297  for (int i = 0; i < keywordPaths.length; i++) {
298  if (keywordPaths[i] == null || keywordPaths[i].equals("")) {
299  throw new PorcupineInvalidArgumentException("Empty keyword path passed to Porcupine.");
300  }
301 
302  File keywordFile = new File(keywordPaths[i]);
303  String keywordFilename = keywordFile.getName();
304  if (!keywordFile.exists() && !keywordFilename.equals("")) {
305  try {
307  context.getAssets().open(keywordPaths[i]),
308  keywordFilename);
309  } catch (IOException ex) {
310  throw new PorcupineIOException(ex);
311  }
312  }
313  }
314  }
315 
316  if (sensitivities == null) {
317  sensitivities = new float[keywordPaths.length];
318  Arrays.fill(sensitivities, 0.5f);
319  }
320 
321  if (sensitivities.length != keywordPaths.length) {
323  String.format("Number of keywords (%d) " +
324  "does not match number of sensitivities (%d)",
325  keywordPaths.length,
326  sensitivities.length));
327  }
328 
330  }
331  }
332 }
R
#define R
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/stb_vorbis.c:5104
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.OK_GOOGLE
OK_GOOGLE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:156
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.ALEXA
ALEXA
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:146
ai.picovoice.porcupine.Porcupine.Builder.setKeyword
Builder setKeyword(BuiltInKeyword keyword)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:198
context
ma_context context
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:56
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.BUMBLEBEE
BUMBLEBEE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:149
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.GRAPEFRUIT
GRAPEFRUIT
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:151
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.PICOVOICE
PICOVOICE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:157
ai.picovoice.porcupine.Porcupine.Builder
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:165
ai.picovoice.porcupine.Porcupine.Builder.setKeywordPaths
Builder setKeywordPaths(String[] keywordPaths)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:183
ai.picovoice.porcupine.Porcupine.getVersion
native String getVersion()
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.HEY_SIRI
HEY_SIRI
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:154
ai.picovoice.porcupine.Porcupine.Builder.build
Porcupine build(Context context)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:256
ai.picovoice.porcupine.Porcupine.Builder.sensitivities
float[] sensitivities
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:171
ai.picovoice.porcupine.Porcupine.Builder.accessKey
String accessKey
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:167
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.COMPUTER
COMPUTER
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:150
f
f
ai.picovoice.porcupine.Porcupine.Builder.setKeywordPath
Builder setKeywordPath(String keywordPaths)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:188
ai.picovoice.porcupine.Porcupine.KEYWORDS_RESOURCES
static final int[] KEYWORDS_RESOURCES
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:37
ai.picovoice.porcupine.PorcupineException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineException.java:13
ai.picovoice.porcupine.Porcupine.Builder.extractResource
String extractResource(Context context, InputStream srcFileStream, String dstFilename)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:235
ai.picovoice.porcupine.Porcupine.DEFAULT_MODEL_PATH
static String DEFAULT_MODEL_PATH
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:44
ai.picovoice.porcupine.Porcupine.Builder.extractPackageResources
void extractPackageResources(Context context)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:213
ai.picovoice.porcupine.Porcupine.getFrameLength
native int getFrameLength()
ai.picovoice.porcupine.Porcupine.Builder.setSensitivities
Builder setSensitivities(float[] sensitivities)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:203
ai.picovoice.porcupine.Porcupine.Builder.keywordPaths
String[] keywordPaths
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:169
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.BLUEBERRY
BLUEBERRY
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:148
ai.picovoice.porcupine.Porcupine.BUILT_IN_KEYWORD_PATHS
static final HashMap< BuiltInKeyword, String > BUILT_IN_KEYWORD_PATHS
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:42
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.AMERICANO
AMERICANO
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:147
ai.picovoice.porcupine.Porcupine.Builder.setKeywords
Builder setKeywords(BuiltInKeyword[] keywords)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:193
ai.picovoice.porcupine.Porcupine.Builder.modelPath
String modelPath
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:168
ai.picovoice.porcupine.Porcupine.handle
long handle
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:51
ai.picovoice.porcupine.Porcupine.Porcupine
Porcupine(String accessKey, String modelPath, String[] keywordPaths, float[] sensitivities)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:64
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.GRASSHOPPER
GRASSHOPPER
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:152
ai.picovoice.porcupine.Porcupine.init
native long init(String accessKey, String modelPath, String[] keywordPaths, float[] sensitivities)
ai.picovoice.porcupine.Porcupine.process
int process(short[] pcm)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:94
ai.picovoice.porcupine.Porcupine.getSampleRate
native int getSampleRate()
ai.picovoice.porcupine.Porcupine.Builder.setAccessKey
Builder setAccessKey(String accessKey)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:173
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.JARVIS
JARVIS
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:155
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.PORCUPINE
PORCUPINE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:158
ai.picovoice.porcupine.Porcupine
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:35
ai.picovoice.porcupine.Porcupine.BuiltInKeyword.HEY_GOOGLE
HEY_GOOGLE
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:153
ai.picovoice.porcupine.Porcupine.Builder.setSensitivity
Builder setSensitivity(float sensitivity)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:208
ai.picovoice.porcupine.Porcupine.Builder.setModelPath
Builder setModelPath(String modelPath)
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:178
ai.picovoice.porcupine.Porcupine.BuiltInKeyword
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:145
ai.picovoice.porcupine.PorcupineInvalidArgumentException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineInvalidArgumentException.java:13
ai.picovoice.porcupine.Porcupine.Builder.keywords
BuiltInKeyword[] keywords
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:170
ai.picovoice.porcupine.PorcupineIOException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineIOException.java:13
ai.picovoice.porcupine.Porcupine.isExtracted
static boolean isExtracted
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:45


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:50