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:
24
.github/workflows/nodejs.yml
vendored
24
.github/workflows/nodejs.yml
vendored
@@ -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}}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user