move portaudio common record code to microphone (#2264)
Co-authored-by: cqm <cqm@97kid.com>
This commit is contained in:
@@ -116,7 +116,6 @@ int32_t main() {
|
|||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
||||||
std::cout << "Num devices: " << num_devices << "\n";
|
|
||||||
if (num_devices == 0) {
|
if (num_devices == 0) {
|
||||||
std::cerr << " If you are using Linux, please try "
|
std::cerr << " If you are using Linux, please try "
|
||||||
"./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n";
|
"./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n";
|
||||||
@@ -124,39 +123,24 @@ int32_t main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE");
|
const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE");
|
||||||
if (pDeviceIndex) {
|
if (pDeviceIndex) {
|
||||||
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
mic.PrintDevices(device_index);
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (sample_rate_str) {
|
if (sample_rate_str) {
|
||||||
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
||||||
mic_sample_rate = atof(sample_rate_str);
|
mic_sample_rate = atof(sample_rate_str);
|
||||||
}
|
}
|
||||||
|
if(!mic.OpenDevice(device_index, mic_sample_rate, 1, RecordCallback,
|
||||||
|
nullptr) == false) {
|
||||||
|
std::cerr << "Failed to open microphone device\n";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
float sample_rate = 16000;
|
float sample_rate = 16000;
|
||||||
LinearResampler resampler;
|
LinearResampler resampler;
|
||||||
if (mic_sample_rate != sample_rate) {
|
if (mic_sample_rate != sample_rate) {
|
||||||
@@ -168,27 +152,6 @@ int32_t main() {
|
|||||||
lowpass_cutoff, lowpass_filter_width);
|
lowpass_cutoff, lowpass_filter_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
|
||||||
PaError err =
|
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, // RecordCallback is run in a separate
|
|
||||||
// thread created by portaudio
|
|
||||||
nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t window_size = 512; // samples, please don't change
|
int32_t window_size = 512; // samples, please don't change
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
@@ -276,11 +239,5 @@ int32_t main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ int32_t main() {
|
|||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
||||||
std::cout << "Num devices: " << num_devices << "\n";
|
|
||||||
if (num_devices == 0) {
|
if (num_devices == 0) {
|
||||||
std::cerr << " If you are using Linux, please try "
|
std::cerr << " If you are using Linux, please try "
|
||||||
"./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n";
|
"./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n";
|
||||||
@@ -120,33 +119,13 @@ int32_t main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE");
|
const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE");
|
||||||
if (pDeviceIndex) {
|
if (pDeviceIndex) {
|
||||||
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
mic.PrintDevices(device_index);
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (sample_rate_str) {
|
if (sample_rate_str) {
|
||||||
@@ -163,26 +142,10 @@ int32_t main() {
|
|||||||
resampler = LinearResampler::Create(mic_sample_rate, sample_rate,
|
resampler = LinearResampler::Create(mic_sample_rate, sample_rate,
|
||||||
lowpass_cutoff, lowpass_filter_width);
|
lowpass_cutoff, lowpass_filter_width);
|
||||||
}
|
}
|
||||||
|
if (mic.OpenDevice(device_index, mic_sample_rate, 1, RecordCallback,
|
||||||
PaStream *stream;
|
nullptr) == false) {
|
||||||
PaError err =
|
std::cerr << "Failed to open microphone device\n";
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
return -1;
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, // RecordCallback is run in a separate
|
|
||||||
// thread created by portaudio
|
|
||||||
nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t window_size = 512; // samples, please don't change
|
int32_t window_size = 512; // samples, please don't change
|
||||||
@@ -272,11 +235,5 @@ int32_t main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "portaudio.h" // NOLINT
|
|
||||||
|
|
||||||
namespace sherpa_onnx {
|
namespace sherpa_onnx {
|
||||||
|
|
||||||
Microphone::Microphone() {
|
Microphone::Microphone() {
|
||||||
@@ -20,10 +18,85 @@ Microphone::Microphone() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Microphone::~Microphone() {
|
Microphone::~Microphone() {
|
||||||
|
CloseDevice();
|
||||||
PaError err = Pa_Terminate();
|
PaError err = Pa_Terminate();
|
||||||
if (err != paNoError) {
|
if (err != paNoError) {
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
||||||
exit(-1);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Microphone::GetDeviceCount() const {
|
||||||
|
return Pa_GetDeviceCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
int Microphone::GetDefaultInputDevice() const {
|
||||||
|
return Pa_GetDefaultInputDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Microphone::PrintDevices(int device_index) const {
|
||||||
|
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
||||||
|
fprintf(stderr, "Num devices: %d\n", num_devices);
|
||||||
|
for (int32_t i = 0; i != num_devices; ++i) {
|
||||||
|
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
||||||
|
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
||||||
|
info->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Microphone::OpenDevice(int index, int sample_rate, int channel, PaStreamCallback cb, void* userdata) {
|
||||||
|
if (index < 0 || index >= Pa_GetDeviceCount()) {
|
||||||
|
fprintf(stderr, "Invalid device index: %d\n", index);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PaDeviceInfo *info = Pa_GetDeviceInfo(index);
|
||||||
|
if (!info) {
|
||||||
|
fprintf(stderr, "No device info found for index: %d\n", index);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseDevice();
|
||||||
|
|
||||||
|
fprintf(stderr, "Use device: %d\n", index);
|
||||||
|
fprintf(stderr, " Name: %s\n", info->name);
|
||||||
|
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
||||||
|
|
||||||
|
PaStreamParameters param;
|
||||||
|
param.device = index;
|
||||||
|
param.channelCount = channel;
|
||||||
|
param.sampleFormat = paFloat32;
|
||||||
|
param.suggestedLatency = info->defaultLowInputLatency;
|
||||||
|
param.hostApiSpecificStreamInfo = nullptr;
|
||||||
|
|
||||||
|
PaError err = Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
||||||
|
sample_rate,
|
||||||
|
0, // frames per buffer
|
||||||
|
paClipOff, // we won't output out of range samples
|
||||||
|
// so don't bother clipping them
|
||||||
|
cb, userdata);
|
||||||
|
if (err != paNoError) {
|
||||||
|
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = Pa_StartStream(stream);
|
||||||
|
fprintf(stderr, "Started\n");
|
||||||
|
|
||||||
|
if (err != paNoError) {
|
||||||
|
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
||||||
|
CloseDevice();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Microphone::CloseDevice() {
|
||||||
|
if (stream) {
|
||||||
|
PaError err = Pa_CloseStream(stream);
|
||||||
|
if (err != paNoError) {
|
||||||
|
fprintf(stderr, "Pa_CloseStream error: %s\n", Pa_GetErrorText(err));
|
||||||
|
}
|
||||||
|
stream = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,22 @@
|
|||||||
|
|
||||||
#ifndef SHERPA_ONNX_CSRC_MICROPHONE_H_
|
#ifndef SHERPA_ONNX_CSRC_MICROPHONE_H_
|
||||||
#define SHERPA_ONNX_CSRC_MICROPHONE_H_
|
#define SHERPA_ONNX_CSRC_MICROPHONE_H_
|
||||||
|
#include "portaudio.h" // NOLINT
|
||||||
|
|
||||||
namespace sherpa_onnx {
|
namespace sherpa_onnx {
|
||||||
|
|
||||||
class Microphone {
|
class Microphone {
|
||||||
|
PaStream *stream = nullptr;
|
||||||
public:
|
public:
|
||||||
Microphone();
|
Microphone();
|
||||||
~Microphone();
|
~Microphone();
|
||||||
|
|
||||||
|
int GetDeviceCount() const;
|
||||||
|
int GetDefaultInputDevice() const;
|
||||||
|
void PrintDevices(int sel) const;
|
||||||
|
|
||||||
|
bool OpenDevice(int index, int sample_rate, int channel, PaStreamCallback cb, void* userdata);
|
||||||
|
void CloseDevice();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sherpa_onnx
|
} // namespace sherpa_onnx
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
#include "sherpa-onnx/csrc/alsa.h"
|
#include "sherpa-onnx/csrc/alsa.h"
|
||||||
#include "sherpa-onnx/csrc/macros.h"
|
#include "sherpa-onnx/csrc/macros.h"
|
||||||
#include "sherpa-onnx/csrc/microphone.h"
|
|
||||||
#include "sherpa-onnx/csrc/speaker-embedding-extractor.h"
|
#include "sherpa-onnx/csrc/speaker-embedding-extractor.h"
|
||||||
#include "sherpa-onnx/csrc/speaker-embedding-manager.h"
|
#include "sherpa-onnx/csrc/speaker-embedding-manager.h"
|
||||||
#include "sherpa-onnx/csrc/wave-reader.h"
|
#include "sherpa-onnx/csrc/wave-reader.h"
|
||||||
|
|||||||
@@ -79,11 +79,7 @@ for a list of pre-trained models to download.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr, "If you are using Linux, please switch to \n");
|
fprintf(stderr, "If you are using Linux, please switch to \n");
|
||||||
@@ -97,26 +93,7 @@ for a list of pre-trained models to download.
|
|||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
mic.PrintDevices(device_index);
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
|
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
@@ -124,24 +101,9 @@ for a list of pre-trained models to download.
|
|||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
if(!mic.OpenDevice(device_index, mic_sample_rate, 1,
|
||||||
PaError err =
|
RecordCallback, s.get())) {
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
fprintf(stderr, "portaudio error: %d\n", device_index);
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, s.get());
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,11 +126,5 @@ for a list of pre-trained models to download.
|
|||||||
Pa_Sleep(20); // sleep for 20ms
|
Pa_Sleep(20); // sleep for 20ms
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,11 +120,7 @@ for more models.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr, "If you are using Linux, please switch to \n");
|
fprintf(stderr, "If you are using Linux, please switch to \n");
|
||||||
@@ -138,26 +134,7 @@ for more models.
|
|||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
mic.PrintDevices(device_index);
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
@@ -165,24 +142,9 @@ for more models.
|
|||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1,
|
||||||
PaError err =
|
RecordCallback, nullptr /* user_data */)){
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
fprintf(stderr, "portaudio error: %d\n", device_index);
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,11 +188,5 @@ for more models.
|
|||||||
}
|
}
|
||||||
t.join();
|
t.join();
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,9 +220,6 @@ Note that `zh` means Chinese, while `en` means English.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
@@ -238,52 +235,18 @@ Note that `zh` means Chinese, while `en` means English.
|
|||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
mic.PrintDevices(device_index);
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
float sample_rate = 16000;
|
|
||||||
|
|
||||||
PaStream *stream;
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1,
|
||||||
PaError err =
|
RecordCallback, nullptr /* user_data */)){
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
fprintf(stderr, "portaudio error: %d\n", device_index);
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,11 +286,5 @@ Note that `zh` means Chinese, while `en` means English.
|
|||||||
}
|
}
|
||||||
t.join();
|
t.join();
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,11 +136,7 @@ for a list of pre-trained models to download.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr, "If you are using Linux, please switch to \n");
|
fprintf(stderr, "If you are using Linux, please switch to \n");
|
||||||
@@ -154,26 +150,8 @@ for a list of pre-trained models to download.
|
|||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
mic.PrintDevices(device_index);
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
@@ -181,24 +159,9 @@ for a list of pre-trained models to download.
|
|||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1,
|
||||||
PaError err =
|
RecordCallback, nullptr /* user_data */)){
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
fprintf(stderr, "portaudio error: %d\n", device_index);
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,11 +195,5 @@ for a list of pre-trained models to download.
|
|||||||
}
|
}
|
||||||
t.join();
|
t.join();
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,11 +106,7 @@ for a list of pre-trained models to download.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr, "If you are using Linux, please switch to \n");
|
fprintf(stderr, "If you are using Linux, please switch to \n");
|
||||||
@@ -124,51 +120,18 @@ for a list of pre-trained models to download.
|
|||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
mic.PrintDevices(device_index);
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
float mic_sample_rate = 16000;
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
float sample_rate = 16000;
|
|
||||||
|
|
||||||
PaStream *stream;
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1,
|
||||||
PaError err =
|
RecordCallback, nullptr /* user_data */)){
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
fprintf(stderr, "portaudio error: %d\n", device_index);
|
||||||
sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, s.get());
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,11 +176,5 @@ for a list of pre-trained models to download.
|
|||||||
Pa_Sleep(20); // sleep for 20ms
|
Pa_Sleep(20); // sleep for 20ms
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,17 +113,7 @@ to download models for offline ASR.
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
if (num_devices == 0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
" If you are using Linux, please try "
|
|
||||||
"./build/bin/sherpa-onnx-vad-alsa-offline-asr\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@@ -137,33 +127,20 @@ to download models for offline ASR.
|
|||||||
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
mic.PrintDevices(device_index);
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1, RecordCallback, nullptr)) {
|
||||||
|
fprintf(stderr, "Failed to open device %d\n", device_index);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
float sample_rate = 16000;
|
float sample_rate = 16000;
|
||||||
std::unique_ptr<sherpa_onnx::LinearResample> resampler;
|
std::unique_ptr<sherpa_onnx::LinearResample> resampler;
|
||||||
if (mic_sample_rate != sample_rate) {
|
if (mic_sample_rate != sample_rate) {
|
||||||
@@ -175,25 +152,6 @@ to download models for offline ASR.
|
|||||||
mic_sample_rate, sample_rate, lowpass_cutoff, lowpass_filter_width);
|
mic_sample_rate, sample_rate, lowpass_cutoff, lowpass_filter_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
|
||||||
PaError err =
|
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto vad = std::make_unique<sherpa_onnx::VoiceActivityDetector>(vad_config);
|
auto vad = std::make_unique<sherpa_onnx::VoiceActivityDetector>(vad_config);
|
||||||
|
|
||||||
fprintf(stderr, "Started. Please speak\n");
|
fprintf(stderr, "Started. Please speak\n");
|
||||||
@@ -236,11 +194,5 @@ to download models for offline ASR.
|
|||||||
Pa_Sleep(100); // sleep for 100ms
|
Pa_Sleep(100); // sleep for 100ms
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,11 +74,8 @@ wget https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/siler
|
|||||||
|
|
||||||
sherpa_onnx::Microphone mic;
|
sherpa_onnx::Microphone mic;
|
||||||
|
|
||||||
PaDeviceIndex num_devices = Pa_GetDeviceCount();
|
|
||||||
fprintf(stderr, "Num devices: %d\n", num_devices);
|
|
||||||
|
|
||||||
int32_t device_index = Pa_GetDefaultInputDevice();
|
int32_t device_index = Pa_GetDefaultInputDevice();
|
||||||
|
|
||||||
if (device_index == paNoDevice) {
|
if (device_index == paNoDevice) {
|
||||||
fprintf(stderr, "No default input device found\n");
|
fprintf(stderr, "No default input device found\n");
|
||||||
fprintf(stderr, "If you are using Linux, please switch to \n");
|
fprintf(stderr, "If you are using Linux, please switch to \n");
|
||||||
@@ -91,35 +88,20 @@ wget https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/siler
|
|||||||
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
fprintf(stderr, "Use specified device: %s\n", pDeviceIndex);
|
||||||
device_index = atoi(pDeviceIndex);
|
device_index = atoi(pDeviceIndex);
|
||||||
}
|
}
|
||||||
|
mic.PrintDevices(device_index);
|
||||||
|
|
||||||
for (int32_t i = 0; i != num_devices; ++i) {
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
|
|
||||||
fprintf(stderr, " %s %d %s\n", (i == device_index) ? "*" : " ", i,
|
|
||||||
info->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaStreamParameters param;
|
|
||||||
param.device = device_index;
|
|
||||||
|
|
||||||
fprintf(stderr, "Use device: %d\n", param.device);
|
|
||||||
|
|
||||||
const PaDeviceInfo *info = Pa_GetDeviceInfo(param.device);
|
|
||||||
fprintf(stderr, " Name: %s\n", info->name);
|
|
||||||
fprintf(stderr, " Max input channels: %d\n", info->maxInputChannels);
|
|
||||||
|
|
||||||
param.channelCount = 1;
|
|
||||||
param.sampleFormat = paFloat32;
|
|
||||||
|
|
||||||
param.suggestedLatency = info->defaultLowInputLatency;
|
|
||||||
param.hostApiSpecificStreamInfo = nullptr;
|
|
||||||
float mic_sample_rate = 16000;
|
float mic_sample_rate = 16000;
|
||||||
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE");
|
||||||
if (pSampleRateStr) {
|
if (pSampleRateStr) {
|
||||||
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate);
|
||||||
mic_sample_rate = atof(pSampleRateStr);
|
mic_sample_rate = atof(pSampleRateStr);
|
||||||
}
|
}
|
||||||
float sample_rate = 16000;
|
if (!mic.OpenDevice(device_index, mic_sample_rate, 1, RecordCallback, nullptr)) {
|
||||||
|
fprintf(stderr, "Failed to open microphone device %d\n", device_index);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sample_rate = 16000;
|
||||||
std::unique_ptr<sherpa_onnx::LinearResample> resampler;
|
std::unique_ptr<sherpa_onnx::LinearResample> resampler;
|
||||||
if (mic_sample_rate != sample_rate) {
|
if (mic_sample_rate != sample_rate) {
|
||||||
float min_freq = std::min(mic_sample_rate, sample_rate);
|
float min_freq = std::min(mic_sample_rate, sample_rate);
|
||||||
@@ -130,30 +112,8 @@ wget https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/siler
|
|||||||
mic_sample_rate, sample_rate, lowpass_cutoff, lowpass_filter_width);
|
mic_sample_rate, sample_rate, lowpass_cutoff, lowpass_filter_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
PaStream *stream;
|
|
||||||
PaError err =
|
|
||||||
Pa_OpenStream(&stream, ¶m, nullptr, /* &outputParameters, */
|
|
||||||
mic_sample_rate,
|
|
||||||
0, // frames per buffer
|
|
||||||
paClipOff, // we won't output out of range samples
|
|
||||||
// so don't bother clipping them
|
|
||||||
RecordCallback, nullptr);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Pa_StartStream(stream);
|
|
||||||
|
|
||||||
auto vad = std::make_unique<sherpa_onnx::VoiceActivityDetector>(config);
|
auto vad = std::make_unique<sherpa_onnx::VoiceActivityDetector>(config);
|
||||||
|
|
||||||
fprintf(stderr, "Started\n");
|
|
||||||
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t window_size = config.silero_vad.window_size;
|
int32_t window_size = config.silero_vad.window_size;
|
||||||
bool printed = false;
|
bool printed = false;
|
||||||
|
|
||||||
@@ -202,11 +162,5 @@ wget https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/siler
|
|||||||
Pa_Sleep(100); // sleep for 100ms
|
Pa_Sleep(100); // sleep for 100ms
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Pa_CloseStream(stream);
|
|
||||||
if (err != paNoError) {
|
|
||||||
fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user