[runtime] add readme for raspberry pi

This commit is contained in:
pengzhendong 2022-11-01 16:46:01 +08:00
parent 0b8866f706
commit 7b4c632dd4
2 changed files with 60 additions and 15 deletions

View File

@ -24,25 +24,26 @@
#include "kws/keyword_spotting.h"
#include "utils/log.h"
int exiting = 0;
std::shared_ptr<wenet::FeaturePipeline> feature_pipeline;
int g_exiting = 0;
std::shared_ptr<wenet::FeaturePipeline> g_feature_pipeline;
void sig_routine(int dunno) {
void SigRoutine(int dunno) {
if (dunno == SIGINT) {
exiting = 1;
g_exiting = 1;
}
}
static int recordCallback(const void* input, void* output,
unsigned long framesCount, // NOLINT
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void* userData) {
static int RecordCallback(const void* input, void* output,
unsigned long frames_count, // NOLINT
const PaStreamCallbackTimeInfo* time_info,
PaStreamCallbackFlags status_flags, void* user_data) {
const auto* pcm_data = static_cast<const int16_t*>(input);
std::vector<int16_t> v(pcm_data, pcm_data + framesCount);
feature_pipeline->AcceptWaveform(v);
std::vector<int16_t> v(pcm_data, pcm_data + frames_count);
g_feature_pipeline->AcceptWaveform(v);
if (exiting) {
if (g_exiting) {
LOG(INFO) << "Exiting loop.";
g_feature_pipeline->set_input_finished();
return paComplete;
} else {
return paContinue;
@ -58,10 +59,10 @@ int main(int argc, char* argv[]) {
const std::string model_path = argv[3];
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);
signal(SIGINT, sig_routine);
signal(SIGINT, SigRoutine);
PaError err = Pa_Initialize();
PaStreamParameters params;
std::cout << err << " " << Pa_GetDeviceCount() << std::endl;
@ -79,7 +80,7 @@ int main(int argc, char* argv[]) {
int interval = 500;
int frames_per_buffer = 16000 / 1000 * interval;
Pa_OpenStream(&stream, &params, NULL, 16000, frames_per_buffer, paClipOff,
recordCallback, NULL);
RecordCallback, NULL);
Pa_StartStream(stream);
LOG(INFO) << "=== Now recording!! Please speak into the microphone. ===";
@ -87,7 +88,7 @@ int main(int argc, char* argv[]) {
while (Pa_IsStreamActive(stream)) {
Pa_Sleep(interval);
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;
spotter.Forward(feats, &prob);
for (int t = 0; t < prob.size(); t++) {

View 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
```