Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nodejs binding #3

Merged
merged 27 commits into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
workflows & readmes
  • Loading branch information
albho committed Aug 7, 2024
commit 58f48436e9a47f88bfda745971540fd0c644c36f
35 changes: 35 additions & 0 deletions .github/workflows/nodejs-codestyle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Node.js Codestyle

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- '**/nodejs/*.js'
- '**/nodejs/*.ts'
- '.github/workflows/nodejs-codestyle.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- '**/nodejs/*.js'
- '**/nodejs/*.ts'
- '.github/workflows/nodejs-codestyle.yml'

jobs:
check-nodejs-codestyle:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up Node.js LTS
uses: actions/setup-node@v3
with:
node-version: lts/*

- name: Pre-build dependencies
run: npm install yarn

- name: Run Binding Linter
run: yarn && yarn lint
working-directory: binding/nodejs
81 changes: 81 additions & 0 deletions .github/workflows/nodejs-demos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Node.js Demos

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'demo/nodejs/**'
- '!demo/nodejs/README.md'
- '.github/workflows/nodejs-demos.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- 'demo/nodejs/**'
- '!demo/nodejs/README.md'
- '.github/workflows/nodejs-demos.yml'

defaults:
run:
working-directory: demo/nodejs

jobs:
build-github-hosted:
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [ubuntu-latest]
node-version: [16.x, 18.x, 20.x]

steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}

- name: Pre-build dependencies
run: npm install yarn

# ************** REMOVE AFTER RELEASE ********************
- name: Build Node.js SDK
run: yarn && yarn build
working-directory: binding/nodejs
# ********************************************************

- name: Install dependencies
run: yarn install

- name: Run get audio devices
run: node demo.js --show_audio_devices

build-self-hosted:
runs-on: ${{ matrix.machine }}

strategy:
matrix:
machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-32, rpi5-64, pv-windows, pv-ios]

steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Pre-build dependencies
run: npm install yarn

# ************** REMOVE AFTER RELEASE ********************
- name: Build Node.js SDK
run: yarn && yarn build
working-directory: binding/nodejs
# ********************************************************

- name: Install dependencies
run: yarn install

- name: Run get audio devices
run: node demo.js --show_audio_devices
83 changes: 83 additions & 0 deletions .github/workflows/nodejs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Node.js

on:
workflow_dispatch:
push:
branches: [ main ]
paths:
- 'binding/nodejs/**'
- '!binding/nodejs/README.md'
- 'lib/node/**'
- '.github/workflows/nodejs.yml'
pull_request:
branches: [ main, 'v[0-9]+.[0-9]+' ]
paths:
- 'binding/nodejs/**'
- '!binding/nodejs/README.md'
- 'lib/node/**'
- '.github/workflows/nodejs.yml'

defaults:
run:
working-directory: binding/nodejs

jobs:
build-github-hosted:
runs-on: ${{ matrix.os }}

strategy:
matrix:
os: [ubuntu-latest]
node-version: [16.x, 18.x, 20.x]

steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}

- name: Pre-build dependencies
run: npm install yarn

- name: Install dependencies
run: yarn install

- name: Setup build
run: yarn prepare

- name: Build
run: yarn build

- name: Test
run: yarn test

build-self-hosted:
runs-on: ${{ matrix.machine }}

strategy:
matrix:
machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-32, rpi5-64, pv-windows, pv-ios]

steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- name: Pre-build dependencies
run: npm install yarn

- name: Install dependencies
run: yarn install

- name: Setup build
run: yarn prepare

- name: Build
run: yarn build

- name: Test
run: yarn test
75 changes: 73 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

<!-- markdown-link-check-disable -->
[![PyPI](https://img.shields.io/pypi/v/pvspeaker)](https://pypi.org/project/pvspeaker/)
[![npm](https://img.shields.io/npm/v/@picovoice/pvspeaker-node?label=npm%20%5Bnode%5D)](https://www.npmjs.com/package/@picovoice/pvspeaker-node)
<!-- markdown-link-check-enable -->

Made in Vancouver, Canada by [Picovoice](https://picovoice.ai)
Expand All @@ -19,9 +20,11 @@ PvSpeaker is an easy-to-use, cross-platform audio player designed for real-time
- [Source Code](#source-code)
- [Demos](#demos)
- [Python](#python-demo)
- [Node.js](#nodejs-demo)
- [C](#c-demo)
- [SDKs](#sdks)
- [Python](#python)
- [Python](#python)
- [Node.js](#nodejs)

## Source Code

Expand Down Expand Up @@ -66,6 +69,30 @@ Replace `{INPUT_WAV_PATH}` with the path to the PCM WAV file you wish to play.

For more information about the Python demos go to [demo/python](demo/python).

### Node.js Demo

Install the demo package:

```console
yarn global add @picovoice/pvspeaker-node-demo
```

To show the available audio devices run:

```console
pvspeaker-node-demo --show_audio_devices
```

With a working speaker connected to your device run the following in the terminal:

```console
pvspeaker-node-demo --input_wav_path ${INPUT_WAV_PATH}
```

Replace `{INPUT_WAV_PATH}` with the path to the `wav` file you wish to play.

For more information about Node.js demo, go to [demo/nodejs](demo/nodejs).

### C Demo

Run the following commands to build the demo app:
Expand Down Expand Up @@ -139,4 +166,48 @@ Once you are done (i.e. no longer need PvSpeaker to write and/or play PCM), free
speaker.delete()
```

For more information about the PvSpeaker Python SDK, go to [binding/python](binding/python).
For more information about the PvSpeaker Python SDK, go to [binding/python](binding/python).

### Node.js

Install Node.js binding:

```console
yarn add @picovoice/pvspeaker-node
```

To start playing audio, initialize the instance and run `start()`:

```typescript
const { PvSpeaker } = require("@picovoice/pvspeaker-node");

const sampleRate = 22050;
const bitsPerSample = 16;
const speaker = new PvSpeaker(sampleRate, bitsPerSample);

speaker.start()
```

Write frames of audio:

```typescript
function getNextAudioFrame(): Uint8Array | Int16Array | Int32Array {
//
}

speaker.writeSync(getNextAudioFrame())
```

To stop recording, call `stop()` on the instance:

```typescript
speaker.stop();
```

Once you are done, free the resources acquired by PvSpeaker. You do not have to call `stop()` before `release()`:

```typescript
speaker.release();
```

For more information about the PvSpeaker Node.js SDK, go to [binding/nodejs](binding/nodejs).
74 changes: 74 additions & 0 deletions binding/nodejs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# PvSpeaker Binding for Node.js

## PvSpeaker

PvSpeaker is an easy-to-use, cross-platform audio player designed for real-time speech audio processing. It allows developers to send raw PCM frames to an audio device's output stream.

## Compatibility

- Node.js 14+
- Runs on Linux (x86_64), macOS (x86_64 and arm64), Windows (x86_64), and Raspberry Pi (3, 4, 5).

## Installation

```console
yarn add @picovoice/pvspeaker-node
```

## Usage

Initialize and start `PvSpeaker`:

```javascript
const { PvSpeaker } = require("@picovoice/pvspeaker-node");

const sampleRate = 22050;
const bitsPerSample = 16;
const recorder = new PvSpeaker(sampleRate, bitsPerSample);

recorder.start()
```

(or)

Use `getAvailableDevices()` to get a list of available devices and then initialize the instance based on the index of a device:

```javascript

const { PvSpeaker } = require("@picovoice/pvspeaker-node");

const devices = PvSpeaker.getAvailableDevices()

const sampleRate = 22050;
const bitsPerSample = 16;
const deviceIndex = 0;
const recorder = new PvSpeaker(sampleRate, bitsPerSample, deviceIndex);

recorder.start()
```

Write frames of audio:

```typescript
function getNextAudioFrame(): Uint8Array | Int16Array | Int32Array {
//
}

speaker.writeSync(getNextAudioFrame())
```

To stop recording, call `stop()` on the instance:

```typescript
speaker.stop();
```

Once you are done, free the resources acquired by PvSpeaker. You do not have to call `stop()` before `release()`:

```typescript
speaker.release();
```

## Demos

[@picovoice/pvspeaker-demo](https://www.npmjs.com/package/@picovoice/pvspeaker-demo) provides command-line utilities for playing audio from a file.
Loading