[runtime] add readme for raspberry pi
This commit is contained in:
parent
0b8866f706
commit
7b4c632dd4
@ -24,25 +24,26 @@
|
|||||||
#include "kws/keyword_spotting.h"
|
#include "kws/keyword_spotting.h"
|
||||||
#include "utils/log.h"
|
#include "utils/log.h"
|
||||||
|
|
||||||
int exiting = 0;
|
int g_exiting = 0;
|
||||||
std::shared_ptr<wenet::FeaturePipeline> feature_pipeline;
|
std::shared_ptr<wenet::FeaturePipeline> g_feature_pipeline;
|
||||||
|
|
||||||
void sig_routine(int dunno) {
|
void SigRoutine(int dunno) {
|
||||||
if (dunno == SIGINT) {
|
if (dunno == SIGINT) {
|
||||||
exiting = 1;
|
g_exiting = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int recordCallback(const void* input, void* output,
|
static int RecordCallback(const void* input, void* output,
|
||||||
unsigned long framesCount, // NOLINT
|
unsigned long frames_count, // NOLINT
|
||||||
const PaStreamCallbackTimeInfo* timeInfo,
|
const PaStreamCallbackTimeInfo* time_info,
|
||||||
PaStreamCallbackFlags statusFlags, void* userData) {
|
PaStreamCallbackFlags status_flags, void* user_data) {
|
||||||
const auto* pcm_data = static_cast<const int16_t*>(input);
|
const auto* pcm_data = static_cast<const int16_t*>(input);
|
||||||
std::vector<int16_t> v(pcm_data, pcm_data + framesCount);
|
std::vector<int16_t> v(pcm_data, pcm_data + frames_count);
|
||||||
feature_pipeline->AcceptWaveform(v);
|
g_feature_pipeline->AcceptWaveform(v);
|
||||||
|
|
||||||
if (exiting) {
|
if (g_exiting) {
|
||||||
LOG(INFO) << "Exiting loop.";
|
LOG(INFO) << "Exiting loop.";
|
||||||
|
g_feature_pipeline->set_input_finished();
|
||||||
return paComplete;
|
return paComplete;
|
||||||
} else {
|
} else {
|
||||||
return paContinue;
|
return paContinue;
|
||||||
@ -58,10 +59,10 @@ int main(int argc, char* argv[]) {
|
|||||||
const std::string model_path = argv[3];
|
const std::string model_path = argv[3];
|
||||||
|
|
||||||
wenet::FeaturePipelineConfig feature_config(num_bins, 16000);
|
wenet::FeaturePipelineConfig feature_config(num_bins, 16000);
|
||||||
feature_pipeline = std::make_shared<wenet::FeaturePipeline>(feature_config);
|
g_feature_pipeline = std::make_shared<wenet::FeaturePipeline>(feature_config);
|
||||||
wekws::KeywordSpotting spotter(model_path);
|
wekws::KeywordSpotting spotter(model_path);
|
||||||
|
|
||||||
signal(SIGINT, sig_routine);
|
signal(SIGINT, SigRoutine);
|
||||||
PaError err = Pa_Initialize();
|
PaError err = Pa_Initialize();
|
||||||
PaStreamParameters params;
|
PaStreamParameters params;
|
||||||
std::cout << err << " " << Pa_GetDeviceCount() << std::endl;
|
std::cout << err << " " << Pa_GetDeviceCount() << std::endl;
|
||||||
@ -79,7 +80,7 @@ int main(int argc, char* argv[]) {
|
|||||||
int interval = 500;
|
int interval = 500;
|
||||||
int frames_per_buffer = 16000 / 1000 * interval;
|
int frames_per_buffer = 16000 / 1000 * interval;
|
||||||
Pa_OpenStream(&stream, ¶ms, NULL, 16000, frames_per_buffer, paClipOff,
|
Pa_OpenStream(&stream, ¶ms, NULL, 16000, frames_per_buffer, paClipOff,
|
||||||
recordCallback, NULL);
|
RecordCallback, NULL);
|
||||||
Pa_StartStream(stream);
|
Pa_StartStream(stream);
|
||||||
LOG(INFO) << "=== Now recording!! Please speak into the microphone. ===";
|
LOG(INFO) << "=== Now recording!! Please speak into the microphone. ===";
|
||||||
|
|
||||||
@ -87,7 +88,7 @@ int main(int argc, char* argv[]) {
|
|||||||
while (Pa_IsStreamActive(stream)) {
|
while (Pa_IsStreamActive(stream)) {
|
||||||
Pa_Sleep(interval);
|
Pa_Sleep(interval);
|
||||||
std::vector<std::vector<float>> feats;
|
std::vector<std::vector<float>> feats;
|
||||||
feature_pipeline->Read(batch_size, &feats);
|
g_feature_pipeline->Read(batch_size, &feats);
|
||||||
std::vector<std::vector<float>> prob;
|
std::vector<std::vector<float>> prob;
|
||||||
spotter.Forward(feats, &prob);
|
spotter.Forward(feats, &prob);
|
||||||
for (int t = 0; t < prob.size(); t++) {
|
for (int t = 0; t < prob.size(); t++) {
|
||||||
|
|||||||
44
runtime/raspberrypi/README.md
Normal file
44
runtime/raspberrypi/README.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# WeNet & Raspberry PI
|
||||||
|
|
||||||
|
There are two ways to build the runtime binaries for Raspberry PI.
|
||||||
|
|
||||||
|
1. Refer `runtime/onnxruntime/README.md` to build it in Raspberry PI.
|
||||||
|
2. Cross compile and `scp` the binaries and libraries to Raspberry PI.
|
||||||
|
|
||||||
|
## Cross Compile
|
||||||
|
|
||||||
|
* Step 1. Install cross compile tools in the PC.
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
|
||||||
|
```
|
||||||
|
|
||||||
|
Or download, and install the binaries from: https://releases.linaro.org/components/toolchain/binaries/latest-7
|
||||||
|
|
||||||
|
|
||||||
|
* Step 2. Export your experiment model to ONNX by https://github.com/wenet-e2e/wekws/blob/main/wekws/bin/export_onnx.py
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
exp=exp # Change it to your experiment dir
|
||||||
|
python -m wekws.bin.export_onnx \
|
||||||
|
--config $exp/train.yaml \
|
||||||
|
--checkpoint $exp/final.pt \
|
||||||
|
--output_dir final.onnx
|
||||||
|
```
|
||||||
|
|
||||||
|
* Step 3. Build. The build requires cmake 3.14 or above. and Send the binary and libraries to Raspberry PI.
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=toolchains/aarch64-linux-gnu.toolchain.cmake
|
||||||
|
cmake --build build
|
||||||
|
scp -r build/bin pi@xxx.xxx.xxx:/path/to/wekws
|
||||||
|
scp fc_base/onnxruntime-src/lib/libonnxruntime.so* pi@xxx.xxx.xxx:/path/to/wekws
|
||||||
|
```
|
||||||
|
|
||||||
|
* Step 4. Run. The log will be shown in Raspberry PI's console.
|
||||||
|
|
||||||
|
``` sh
|
||||||
|
cd /path/to/wekws
|
||||||
|
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
|
||||||
|
./build/bin/stream_kws_main 40 80 final.onnx
|
||||||
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user