diff --git a/cxx-api-examples/parakeet-tdt-simulate-streaming-microphone-cxx-api.cc b/cxx-api-examples/parakeet-tdt-simulate-streaming-microphone-cxx-api.cc index 9f150679..922ac158 100644 --- a/cxx-api-examples/parakeet-tdt-simulate-streaming-microphone-cxx-api.cc +++ b/cxx-api-examples/parakeet-tdt-simulate-streaming-microphone-cxx-api.cc @@ -116,7 +116,6 @@ int32_t main() { sherpa_onnx::Microphone mic; PaDeviceIndex num_devices = Pa_GetDeviceCount(); - std::cout << "Num devices: " << num_devices << "\n"; if (num_devices == 0) { std::cerr << " If you are using Linux, please try " "./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n"; @@ -124,39 +123,24 @@ int32_t main() { } int32_t device_index = Pa_GetDefaultInputDevice(); - const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE"); if (pDeviceIndex) { fprintf(stderr, "Use specified device: %s\n", 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; const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (sample_rate_str) { fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate); 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; LinearResampler resampler; if (mic_sample_rate != sample_rate) { @@ -168,27 +152,6 @@ int32_t main() { 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 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; } diff --git a/cxx-api-examples/sense-voice-simulate-streaming-microphone-cxx-api.cc b/cxx-api-examples/sense-voice-simulate-streaming-microphone-cxx-api.cc index 0ace2336..f1efc079 100644 --- a/cxx-api-examples/sense-voice-simulate-streaming-microphone-cxx-api.cc +++ b/cxx-api-examples/sense-voice-simulate-streaming-microphone-cxx-api.cc @@ -112,7 +112,6 @@ int32_t main() { sherpa_onnx::Microphone mic; PaDeviceIndex num_devices = Pa_GetDeviceCount(); - std::cout << "Num devices: " << num_devices << "\n"; if (num_devices == 0) { std::cerr << " If you are using Linux, please try " "./build/bin/sense-voice-simulate-streaming-alsa-cxx-api\n"; @@ -120,33 +119,13 @@ int32_t main() { } int32_t device_index = Pa_GetDefaultInputDevice(); - const char *pDeviceIndex = std::getenv("SHERPA_ONNX_MIC_DEVICE"); if (pDeviceIndex) { fprintf(stderr, "Use specified device: %s\n", 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; const char *sample_rate_str = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (sample_rate_str) { @@ -163,26 +142,10 @@ int32_t main() { resampler = LinearResampler::Create(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, // 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); + if (mic.OpenDevice(device_index, mic_sample_rate, 1, RecordCallback, + nullptr) == false) { + std::cerr << "Failed to open microphone device\n"; + return -1; } 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; } diff --git a/sherpa-onnx/csrc/microphone.cc b/sherpa-onnx/csrc/microphone.cc index 956574f4..2fd71d1e 100644 --- a/sherpa-onnx/csrc/microphone.cc +++ b/sherpa-onnx/csrc/microphone.cc @@ -7,8 +7,6 @@ #include #include -#include "portaudio.h" // NOLINT - namespace sherpa_onnx { Microphone::Microphone() { @@ -20,10 +18,85 @@ Microphone::Microphone() { } Microphone::~Microphone() { + CloseDevice(); PaError err = Pa_Terminate(); if (err != paNoError) { 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; } } diff --git a/sherpa-onnx/csrc/microphone.h b/sherpa-onnx/csrc/microphone.h index 61cedbf3..8d651793 100644 --- a/sherpa-onnx/csrc/microphone.h +++ b/sherpa-onnx/csrc/microphone.h @@ -4,13 +4,22 @@ #ifndef SHERPA_ONNX_CSRC_MICROPHONE_H_ #define SHERPA_ONNX_CSRC_MICROPHONE_H_ +#include "portaudio.h" // NOLINT namespace sherpa_onnx { class Microphone { + PaStream *stream = nullptr; public: 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 diff --git a/sherpa-onnx/csrc/sherpa-onnx-alsa-offline-speaker-identification.cc b/sherpa-onnx/csrc/sherpa-onnx-alsa-offline-speaker-identification.cc index da00ea62..a14ff5c7 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-alsa-offline-speaker-identification.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-alsa-offline-speaker-identification.cc @@ -14,7 +14,6 @@ #include "sherpa-onnx/csrc/alsa.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-manager.h" #include "sherpa-onnx/csrc/wave-reader.h" diff --git a/sherpa-onnx/csrc/sherpa-onnx-keyword-spotter-microphone.cc b/sherpa-onnx/csrc/sherpa-onnx-keyword-spotter-microphone.cc index 4d75f9d4..4eed37c4 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-keyword-spotter-microphone.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-keyword-spotter-microphone.cc @@ -79,11 +79,7 @@ for a list of pre-trained models to download. sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); - int32_t device_index = Pa_GetDefaultInputDevice(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\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); } - 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; + mic.PrintDevices(device_index); const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { @@ -124,24 +101,9 @@ for a list of pre-trained models to download. mic_sample_rate = atof(pSampleRateStr); } - 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, 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)); + if(!mic.OpenDevice(device_index, mic_sample_rate, 1, + RecordCallback, s.get())) { + fprintf(stderr, "portaudio error: %d\n", device_index); exit(EXIT_FAILURE); } @@ -164,11 +126,5 @@ for a list of pre-trained models to download. 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; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-audio-tagging.cc b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-audio-tagging.cc index 0d568ec3..3dc1153b 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-audio-tagging.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-audio-tagging.cc @@ -120,11 +120,7 @@ for more models. sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); - int32_t device_index = Pa_GetDefaultInputDevice(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\n"); fprintf(stderr, "If you are using Linux, please switch to \n"); @@ -138,26 +134,7 @@ for more models. device_index = atoi(pDeviceIndex); } - 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; + mic.PrintDevices(device_index); float mic_sample_rate = 16000; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { @@ -165,24 +142,9 @@ for more models. mic_sample_rate = atof(pSampleRateStr); } - 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); - fprintf(stderr, "Started\n"); - - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); + if (!mic.OpenDevice(device_index, mic_sample_rate, 1, + RecordCallback, nullptr /* user_data */)){ + fprintf(stderr, "portaudio error: %d\n", device_index); exit(EXIT_FAILURE); } @@ -226,11 +188,5 @@ for more models. } t.join(); - err = Pa_CloseStream(stream); - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); - exit(EXIT_FAILURE); - } - return 0; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-speaker-identification.cc b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-speaker-identification.cc index d3518c09..0d5c6322 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-speaker-identification.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline-speaker-identification.cc @@ -220,9 +220,6 @@ Note that `zh` means Chinese, while `en` means English. sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); - int32_t device_index = Pa_GetDefaultInputDevice(); if (device_index == paNoDevice) { 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); } - 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); - } + mic.PrintDevices(device_index); - 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; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate); mic_sample_rate = atof(pSampleRateStr); } - float sample_rate = 16000; - 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); - fprintf(stderr, "Started\n"); - - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); + if (!mic.OpenDevice(device_index, mic_sample_rate, 1, + RecordCallback, nullptr /* user_data */)){ + fprintf(stderr, "portaudio error: %d\n", device_index); exit(EXIT_FAILURE); } @@ -323,11 +286,5 @@ Note that `zh` means Chinese, while `en` means English. } t.join(); - err = Pa_CloseStream(stream); - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); - exit(EXIT_FAILURE); - } - return 0; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline.cc b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline.cc index a9875545..4d00b9ba 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-microphone-offline.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-microphone-offline.cc @@ -136,11 +136,7 @@ for a list of pre-trained models to download. sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); - int32_t device_index = Pa_GetDefaultInputDevice(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\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); } - 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); - } + mic.PrintDevices(device_index); - 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; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { @@ -181,24 +159,9 @@ for a list of pre-trained models to download. mic_sample_rate = atof(pSampleRateStr); } - 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); - fprintf(stderr, "Started\n"); - - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); + if (!mic.OpenDevice(device_index, mic_sample_rate, 1, + RecordCallback, nullptr /* user_data */)){ + fprintf(stderr, "portaudio error: %d\n", device_index); exit(EXIT_FAILURE); } @@ -232,11 +195,5 @@ for a list of pre-trained models to download. } t.join(); - err = Pa_CloseStream(stream); - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); - exit(EXIT_FAILURE); - } - return 0; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-microphone.cc b/sherpa-onnx/csrc/sherpa-onnx-microphone.cc index f9f8ab32..c5b13bf7 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-microphone.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-microphone.cc @@ -106,11 +106,7 @@ for a list of pre-trained models to download. sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); - int32_t device_index = Pa_GetDefaultInputDevice(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\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); } - 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); - } + mic.PrintDevices(device_index); - 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; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate); mic_sample_rate = atof(pSampleRateStr); } - float sample_rate = 16000; - PaStream *stream; - 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 - 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)); + if (!mic.OpenDevice(device_index, mic_sample_rate, 1, + RecordCallback, nullptr /* user_data */)){ + fprintf(stderr, "portaudio error: %d\n", device_index); exit(EXIT_FAILURE); } @@ -213,11 +176,5 @@ for a list of pre-trained models to download. 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; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-vad-microphone-offline-asr.cc b/sherpa-onnx/csrc/sherpa-onnx-vad-microphone-offline-asr.cc index d5cd920d..2ae17cbc 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-vad-microphone-offline-asr.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-vad-microphone-offline-asr.cc @@ -113,17 +113,7 @@ to download models for offline ASR. 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(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\n"); fprintf(stderr, @@ -137,33 +127,20 @@ to download models for offline ASR. fprintf(stderr, "Use specified device: %s\n", 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; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate); 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; std::unique_ptr resampler; 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); } - 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(vad_config); fprintf(stderr, "Started. Please speak\n"); @@ -236,11 +194,5 @@ to download models for offline ASR. 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; } diff --git a/sherpa-onnx/csrc/sherpa-onnx-vad-microphone.cc b/sherpa-onnx/csrc/sherpa-onnx-vad-microphone.cc index 103cf7c6..e6360063 100644 --- a/sherpa-onnx/csrc/sherpa-onnx-vad-microphone.cc +++ b/sherpa-onnx/csrc/sherpa-onnx-vad-microphone.cc @@ -74,11 +74,8 @@ wget https://github.com/snakers4/silero-vad/raw/master/src/silero_vad/data/siler sherpa_onnx::Microphone mic; - PaDeviceIndex num_devices = Pa_GetDeviceCount(); - fprintf(stderr, "Num devices: %d\n", num_devices); int32_t device_index = Pa_GetDefaultInputDevice(); - if (device_index == paNoDevice) { fprintf(stderr, "No default input device found\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); 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; const char *pSampleRateStr = std::getenv("SHERPA_ONNX_MIC_SAMPLE_RATE"); if (pSampleRateStr) { fprintf(stderr, "Use sample rate %f for mic\n", mic_sample_rate); 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 resampler; if (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); } - 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(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; 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 } - err = Pa_CloseStream(stream); - if (err != paNoError) { - fprintf(stderr, "portaudio error: %s\n", Pa_GetErrorText(err)); - exit(EXIT_FAILURE); - } - return 0; }