Cross-platform audio recorder designed for real-time speech audio processing

Picovoice Picovoice Last update: Apr 28, 2024

PvRecorder

GitHub release GitHub

PyPI Nuget Go Reference npm Crates.io

Made in Vancouver, Canada by Picovoice

Twitter URL

YouTube Channel Views

PvRecorder is an easy-to-use, cross-platform audio recorder designed for real-time speech audio processing. It allows developers access to an audio device's input stream, broken up into data frames of a given size.

Table of Contents

Source Code

If you are interested in building PvRecorder from source or integrating it into an existing C project, the PvRecorder source code is located under the /project directory.

Demos

If using SSH, clone the repository with:

git clone --recurse-submodules [email protected]:Picovoice/pvrecorder.git

If using HTTPS, clone the repository with:

git clone --recurse-submodules https://github.com/Picovoice/pvrecorder.git

Python Demo

Install the demo package:

pip3 install pvrecorderdemo

To show the available audio devices run:

pv_recorder_demo --show_audio_devices

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

pv_recorder_demo --output_wav_path {OUTPUT_WAV_PATH}

Replace {OUTPUT_WAV_PATH} with the path to save the audio data in wav format.

For more information about the Python demos go to demo/python.

.NET Demo

From demo/dotnet/PvRecorderDemo run the following in the terminal to build the demo:

dotnet build

Make sure there is a working microphone connected to your device. From demo/dotnet/PvRecorderDemo run the following in the terminal:

dotnet run -- --output_wav_path ${OUTPUT_WAV_PATH}

For more information about the .NET demo, go to demo/dotnet.

Go Demo

The demo requires cgo, which on Windows may mean that you need to install a gcc compiler like MinGW to build it properly.

From demo/go run the following commands from the terminal.

go run demo.go --output_wav_path {OUTPUT_WAV_PATH}

Replace {OUTPUT_WAV_PATH} with a file path to save the audio data in wav format.

For more information about Go demo, go to demo/go.

Node.js Demo

Install the demo package:

yarn global add @picovoice/pvrecorder-node-demo

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

pvrecorder-node-demo --output_wav_path ${OUTPUT_WAV_PATH}

Replace {OUTPUT_WAV_PATH} with the file path to save the audio data in wav format.

For more information about NodeJS demo, go to demo/nodejs.

Rust Demo

Make sure there is a working microphone connected to your device. From demo/rust/ run the following in the terminal to build and run the demo:

cargo run --release -- --output_wav_path ${OUTPUT_WAV_PATH}

For more information about the Rust demo, go to demo/rust.

C Demo

Run the following commands to build the demo app:

cd demo/c
cmake -S . -B build -DPV_RECORDER_PLATFORM={PV_RECORDER_PLATFORM}
cmake --build build

The {PV_RECORDER_PLATFORM} variable will set the compilation flags for the given platform. Exclude this variable to get a list of possible values.

Get a list of available audio recording devices:

./pv_recorder_demo --show_audio_devices

Record to a file with a given audio device index:

./pv_recorder_demo -o test.wav -d 2

Hit Ctrl+C to stop recording. If no audio device index (-d) is provided, the demo will use the system's default recording device.

For more information about the C demo, go to demo/c.

SDKs

Python

To start recording, initialize an instance and run start():

from pvrecorder import PvRecorder

recorder = PvRecorder(frame_length=512)
recorder.start()

Read frames of audio:

while recorder.is_recording:
    frame = recorder.read()
    # process audio frame

To stop recording, run stop() on the instance:

recorder.stop()

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

recorder.delete()

For more information about the PvRecorder Python SDK, go to binding/python.

.NET

Install the .NET SDK using NuGet or the dotnet CLI:

dotnet add package PvRecorder

Initialize and begin recording:

using Pv;

PvRecorder recorder = PvRecorder.Create(frameLength: 512);
recorder.Start();

Read frames of audio:

while (recorder.IsRecording)
{
    short[] frame = recorder.Read();
    // process audio frame
}

To stop recording:

recorder.Stop();

Once you are done, free the resources acquired by PvRecorder. You do not have to call Stop() before Dispose():

recorder.Dispose();

For more information about the PvRecorder .NET SDK, go to binding/dotnet.

Go

To install the PvRecorder Go module to your project, use the command:

go get github.com/Picovoice/pvrecorder/binding/go

To start recording, initialize an instance and run Start():

import . "github.com/Picovoice/pvrecorder/binding/go"

recorder = NewPvRecorder(/*FrameLength*/512)
recorder.Init()
if err != nil {
    // handle init error
}
defer recorder.Delete()

err = recorder.Start()
if err != nil {
    // handle start error
}

Get a frame of audio by calling the Read() function:

frame, err := recorder.Read()
if err != nil {
    // handle error
}

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

recorder.Stop()

Once you are done, free the resources acquired by PvRecorder. You do not have to call Stop() before Delete():

recorder.Delete()

For more information about the PvRecorder Go SDK, go to binding/go.

Node.js

Install Node.js binding:

yarn add @picovoice/pvrecorder-node

To start recording, initialize the instance and run start():

const frameLength = 512;
const recorder = new PvRecorder(frameLength);
recorder.start()

Read frames of audio:

while (recorder.isRecording) {
    const frame = await recorder.read();
    // process audio frame
}

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

recorder.stop();

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

recorder.release();

For more information about the PvRecorder Node.js SDK, go to binding/nodejs.

Rust

Add pv_recorder to your app's Cargo.toml manifest:

[dependencies]
pv_recorder = "*"

To start recording, initialize the instance and run start():

use pv_recorder::PvRecorderBuilder

let frame_length = 512;
let recorder = PvRecorderBuilder::new(frame_length).init()?;
recorder.start()?;

Read frames of audio:

while recorder.is_recording() {
    let frame = recorder.read()?;
    // process audio frame
}

To stop recording, run stop() on the instance:

recorder.stop()?;

For more information about the PvRecorder Rust SDK, go to binding/rust.

Releases

v1.2.0 - July 13th, 2023

  • API improvements
  • Improved docs
  • Added unit tests and actions for each SDK
  • Addressed race condition when stop is called during a read
  • Fixed .NET version support
  • Demos write to WAV files

v1.1.0 - November 10th, 2022

  • Added logs that warn users if recorded audio is silent for a few number of seconds.

Subscribe to our newsletter