1
0
mirror of https://github.com/Picovoice/porcupine.git synced 2022-01-28 03:27:53 +03:00

Github actions nodejs add machines and non-English tests (#598)

This commit is contained in:
Iliad Ramezani
2021-12-23 15:50:27 -08:00
committed by GitHub
parent 0f8c3bdcd4
commit b380aa4ea6
2 changed files with 199 additions and 14 deletions

View File

@@ -32,11 +32,12 @@ defaults:
working-directory: binding/nodejs
jobs:
build:
runs-on: ubuntu-latest
build-github-hosted:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [14.x, 16.x]
steps:
@@ -55,3 +56,22 @@ jobs:
- name: Test
run: yarn test --access_key=${{secrets.PV_VALID_ACCESS_KEY}}
build-self-hosted:
runs-on: ${{ matrix.machine }}
strategy:
matrix:
machine: [rpi2, rpi3, rpi4, jetson, beaglebone]
steps:
- uses: actions/checkout@v2
- name: Pre-build dependencies
run: npm install --global yarn
- name: Install dependencies
run: yarn install
- name: Test
run: yarn test --access_key=${{secrets.PV_VALID_ACCESS_KEY}}

View File

@@ -18,14 +18,30 @@ const WaveFile = require("wavefile").WaveFile;
const { PvArgumentError, PvStateError } = require("./errors");
const { getPlatform } = require("./platforms");
const { GRASSHOPPER } = require("./builtin_keywords.js");
const { count } = require("console");
const MODEL_PATH = "./lib/common/porcupine_params.pv";
const MODEL_PATH_DE = "../../lib/common/porcupine_params_de.pv";
const MODEL_PATH_ES = "../../lib/common/porcupine_params_es.pv";
const MODEL_PATH_FR = "../../lib/common/porcupine_params_fr.pv";
const SENSITIVITIES_1 = [0.5];
const SENSITIVITIES_2 = [0.5, 0.5];
const WAV_PATH_PORCUPINE = "../../resources/audio_samples/porcupine.wav";
const DEFAULT_SENSITIVITY_ARRAY = [0.5];
const WAV_PATH_PORCUPINE =
"../../resources/audio_samples/porcupine.wav";
const WAV_PATH_MULTIPLE_KEYWORDS =
"../../resources/audio_samples/multiple_keywords.wav";
const WAV_PATH_SINGLE_KEYWORD_DE =
"../../resources/audio_samples/heuschrecke.wav";
const WAV_PATH_MULTIPLE_KEYWORDS_DE =
"../../resources/audio_samples/multiple_keywords_de.wav";
const WAV_PATH_SINGLE_KEYWORD_ES =
"../../resources/audio_samples/manzana.wav";
const WAV_PATH_MULTIPLE_KEYWORDS_ES =
"../../resources/audio_samples/multiple_keywords_es.wav";
const WAV_PATH_SINGLE_KEYWORD_FR =
"../../resources/audio_samples/mon_chouchou.wav";
const WAV_PATH_MULTIPLE_KEYWORDS_FR =
"../../resources/audio_samples/multiple_keywords_fr.wav";
const platform = getPlatform();
@@ -36,10 +52,38 @@ const keywordPathsMultipleAmericanoBumblebee = [
`../../resources/keyword_files/${platform}/americano_${platform}.ppn`,
`../../resources/keyword_files/${platform}/bumblebee_${platform}.ppn`,
];
const keywordPathsSingleDe = [
`../../resources/keyword_files_de/${platform}/heuschrecke_${platform}.ppn`,
];
const keywordPathsMultipleDe = [
`../../resources/keyword_files_de/${platform}/ananas_${platform}.ppn`,
`../../resources/keyword_files_de/${platform}/heuschrecke_${platform}.ppn`,
`../../resources/keyword_files_de/${platform}/leguan_${platform}.ppn`,
`../../resources/keyword_files_de/${platform}/stachelschwein_${platform}.ppn`,
];
const keywordPathsSingleEs = [
`../../resources/keyword_files_es/${platform}/manzana_${platform}.ppn`,
];
const keywordPathsMultipleEs = [
`../../resources/keyword_files_es/${platform}/emparedado_${platform}.ppn`,
`../../resources/keyword_files_es/${platform}/leopardo_${platform}.ppn`,
`../../resources/keyword_files_es/${platform}/manzana_${platform}.ppn`,
];
const keywordPathsSingleFr = [
`../../resources/keyword_files_fr/${platform}/mon chouchou_${platform}.ppn`,
];
const keywordPathsMultipleFr = [
`../../resources/keyword_files_fr/${platform}/framboise_${platform}.ppn`,
`../../resources/keyword_files_fr/${platform}/mon chouchou_${platform}.ppn`,
`../../resources/keyword_files_fr/${platform}/parapluie_${platform}.ppn`,
];
const ACCESS_KEY = process.argv.filter((x) => x.startsWith('--access_key='))[0].split('--access_key=')[1];
function porcupineDetectionCounts(engineInstance, waveFilePath) {
function porcupineDetectionCounts(engineInstance, relativeWaveFilePath) {
const path = require("path");
const waveFilePath = path.join(__dirname, relativeWaveFilePath);
const waveBuffer = fs.readFileSync(waveFilePath);
const waveAudioFile = new WaveFile(waveBuffer);
@@ -77,7 +121,7 @@ describe("successful keyword detections", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSinglePorcupine,
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
let counts = porcupineDetectionCounts(porcupineEngine, WAV_PATH_PORCUPINE);
@@ -89,7 +133,7 @@ describe("successful keyword detections", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
[GRASSHOPPER],
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
let counts = porcupineDetectionCounts(
@@ -105,7 +149,7 @@ describe("successful keyword detections", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
[99],
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
}).toThrow(PvArgumentError);
});
@@ -114,7 +158,7 @@ describe("successful keyword detections", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSinglePorcupine,
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
let counts = porcupineDetectionCounts(
@@ -126,10 +170,11 @@ describe("successful keyword detections", () => {
});
test("multiple keyword multiple detection", () => {
const sensitivities = new Array(keywordPathsMultipleAmericanoBumblebee.length).fill(0.5);
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsMultipleAmericanoBumblebee,
SENSITIVITIES_2
sensitivities
);
let counts = porcupineDetectionCounts(
@@ -148,7 +193,7 @@ describe("manual paths", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSinglePorcupine,
SENSITIVITIES_1,
DEFAULT_SENSITIVITY_ARRAY,
MODEL_PATH
);
@@ -158,6 +203,126 @@ describe("manual paths", () => {
});
});
describe("keyword detection in DE", () => {
test("single keyword single detection in DE", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSingleDe,
DEFAULT_SENSITIVITY_ARRAY,
MODEL_PATH_DE
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_SINGLE_KEYWORD_DE
);
let heuschreckeCount = counts.get(0);
expect(heuschreckeCount).toEqual(1);
});
test("multiple keyword multiple detection in DE", () => {
const sensitivities = new Array(keywordPathsMultipleDe.length).fill(0.5);
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsMultipleDe,
sensitivities,
MODEL_PATH_DE
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_MULTIPLE_KEYWORDS_DE
);
let ananasCount = counts.get(0);
let heuschreckeCount = counts.get(1);
let leguanCount = counts.get(2);
let stachelschweinCount = counts.get(3);
expect(ananasCount).toEqual(1);
expect(heuschreckeCount).toEqual(1);
expect(leguanCount).toEqual(1);
expect(stachelschweinCount).toEqual(1);
});
});
describe("keyword detection in ES", () => {
test("single keyword single detection in ES", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSingleEs,
DEFAULT_SENSITIVITY_ARRAY,
MODEL_PATH_ES
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_SINGLE_KEYWORD_ES
);
let manzanaCount = counts.get(0);
expect(manzanaCount).toEqual(1);
});
test("multiple keyword multiple detection in ES", () => {
const sensitivities = new Array(keywordPathsMultipleEs.length).fill(0.5);
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsMultipleEs,
sensitivities,
MODEL_PATH_ES
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_MULTIPLE_KEYWORDS_ES
);
let emparedadoCount = counts.get(0);
let leopardoCount = counts.get(1);
let manzanaCount = counts.get(2);
expect(emparedadoCount).toEqual(1);
expect(leopardoCount).toEqual(1);
expect(manzanaCount).toEqual(1);
});
});
describe("keyword detection in FR", () => {
test("single keyword single detection in FR", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSingleFr,
DEFAULT_SENSITIVITY_ARRAY,
MODEL_PATH_FR
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_SINGLE_KEYWORD_FR
);
let monChouchouCount = counts.get(0);
expect(monChouchouCount).toEqual(1);
});
test("multiple keyword multiple detection in FR", () => {
const sensitivities = new Array(keywordPathsMultipleFr.length).fill(0.5);
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsMultipleFr,
sensitivities,
MODEL_PATH_FR
);
let counts = porcupineDetectionCounts(
porcupineEngine,
WAV_PATH_MULTIPLE_KEYWORDS_FR
);
let framboiseCount = counts.get(0);
let monChouchouCount = counts.get(1);
let parapluieCount = counts.get(2);
expect(framboiseCount).toEqual(2);
expect(monChouchouCount).toEqual(1);
expect(parapluieCount).toEqual(1);
});
});
describe("basic parameter validation", () => {
test("num of keywords does not match num of sensitivities", () => {
expect(() => {
@@ -173,7 +338,7 @@ describe("basic parameter validation", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
`../../resources/keyword_files/${platform}/porcupine_${platform}.ppn`,
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
} catch (error) {
expect(error.message.includes("array"));
@@ -238,7 +403,7 @@ describe("invalid state", () => {
let porcupineEngine = new Porcupine(
ACCESS_KEY,
keywordPathsSinglePorcupine,
SENSITIVITIES_1
DEFAULT_SENSITIVITY_ARRAY
);
let counts = porcupineDetectionCounts(porcupineEngine, WAV_PATH_PORCUPINE);