1 package ai.picovoice.porcupine.demo;
3 import static org.junit.Assert.assertSame;
4 import static org.junit.Assert.assertTrue;
6 import android.content.Context;
7 import android.content.res.AssetManager;
9 import androidx.test.ext.junit.runners.AndroidJUnit4;
10 import androidx.test.platform.app.InstrumentationRegistry;
12 import com.microsoft.appcenter.espresso.Factory;
13 import com.microsoft.appcenter.espresso.ReportHelper;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Rule;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
21 import java.io.BufferedInputStream;
22 import java.io.BufferedOutputStream;
24 import java.io.FileInputStream;
25 import java.io.FileOutputStream;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.io.OutputStream;
29 import java.nio.ByteBuffer;
30 import java.nio.ByteOrder;
31 import java.util.ArrayList;
37 @RunWith(AndroidJUnit4.class)
40 public ReportHelper reportHelper = Factory.getReportHelper();
43 AssetManager assetManager;
44 String testResourcesPath;
49 reportHelper.label(
"Stopping App");
53 public void Setup() throws IOException {
54 testContext = InstrumentationRegistry.getInstrumentation().getContext();
55 appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
56 assetManager = testContext.getAssets();
57 extractAssetsRecursively(
"test_resources");
58 testResourcesPath =
new File(appContext.getFilesDir(),
"test_resources").getAbsolutePath();
60 accessKey = appContext.getString(
R.string.pvTestingAccessKey);
100 File keywordPath =
new File(testResourcesPath,
"keyword_files/en/hey_barista_android.ppn");
101 File modelPath =
new File(testResourcesPath,
"model_files/porcupine_params.pv");
118 File keywordPath =
new File(testResourcesPath,
"keyword_files/en/hey_barista_android.ppn");
119 File keywordPath2 =
new File(testResourcesPath,
"keyword_files/en/pico_clock_android.ppn");
120 String[] keywordPaths =
new String[]{keywordPath.getAbsolutePath(), keywordPath2.getAbsolutePath()};
136 boolean didFail =
false;
137 File keywordPath =
new File(testResourcesPath,
"keyword_files/de/ananas_android.ppn");
138 File modelPath =
new File(testResourcesPath,
"model_files/porcupine_params.pv");
154 boolean didFail =
false;
155 File modelPath =
new File(testResourcesPath,
"bad_path/bad_path.pv");
171 boolean didFail =
false;
187 boolean didFail =
false;
203 boolean didFail =
false;
217 boolean didFail =
false;
218 File keywordPath =
new File(testResourcesPath,
"bad_path/bad_path.ppn");
233 File keywordPath =
new File(testResourcesPath,
"keyword_files/en/hey_barista_android.ppn");
234 boolean didFail =
false;
250 boolean didFail =
false;
251 File keywordPath =
new File(testResourcesPath,
"keyword_files/en/alexa_linux.ppn");
271 File testAudio =
new File(testResourcesPath,
"audio_samples/porcupine.wav");
272 FileInputStream audioInputStream =
new FileInputStream(testAudio);
276 ByteBuffer pcmBuff = ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN);
278 audioInputStream.skip(44);
280 boolean keywordDetected =
false;
281 while (audioInputStream.available() > 0) {
282 int numRead = audioInputStream.read(pcmBuff.array());
284 pcmBuff.asShortBuffer().get(pcm);
285 int keywordIndex = p.
process(pcm);
286 if (keywordIndex == 0) {
287 keywordDetected =
true;
293 assertTrue(keywordDetected);
328 File testAudio =
new File(testResourcesPath,
"audio_samples/multiple_keywords.wav");
329 FileInputStream audioInputStream =
new FileInputStream(testAudio);
333 ByteBuffer pcmBuff = ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN);
335 audioInputStream.skip(44);
337 ArrayList<Integer> detectionResults =
new ArrayList<>();
338 while (audioInputStream.available() > 0) {
339 int numRead = audioInputStream.read(pcmBuff.array());
341 pcmBuff.asShortBuffer().get(pcm);
342 int keywordIndex = p.
process(pcm);
343 if (keywordIndex >= 0) {
344 detectionResults.add(keywordIndex);
350 assertSame(expectedResults.length, detectionResults.size());
351 for (
int i = 0; i < expectedResults.length; i++) {
353 assertTrue(detectionResults.get(i) < inputBuiltInKeywords.length);
355 assertSame(expectedKeyword, keywordDetected);
361 File keywordPath =
new File(testResourcesPath,
"keyword_files/de/ananas_android.ppn");
362 File modelPath =
new File(testResourcesPath,
"model_files/porcupine_params_de.pv");
378 File keywordPath =
new File(testResourcesPath,
"keyword_files/es/emparedado_android.ppn");
379 File modelPath =
new File(testResourcesPath,
"model_files/porcupine_params_es.pv");
395 File keywordPath =
new File(testResourcesPath,
"keyword_files/fr/framboise_android.ppn");
396 File modelPath =
new File(testResourcesPath,
"model_files/porcupine_params_fr.pv");
412 String[] list = assetManager.list(path);
413 if (list.length > 0) {
414 File outputFile =
new File(appContext.getFilesDir(), path);
415 if (!outputFile.exists()) {
419 for (String file : list) {
420 String filepath = path +
"/" + file;
421 extractAssetsRecursively(filepath);
424 extractTestFile(path);
430 InputStream is =
new BufferedInputStream(assetManager.open(filepath), 256);
431 File absPath =
new File(appContext.getFilesDir(), filepath);
432 OutputStream os =
new BufferedOutputStream(
new FileOutputStream(absPath), 256);
434 while ((r = is.read()) != -1) {