Skip to content

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

License

Notifications You must be signed in to change notification settings

Picovoice/pvrecorder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.