Zephyr下使用TFLite进行语音识别
Posted 17岁boy想当攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zephyr下使用TFLite进行语音识别相关的知识,希望对你有一定的参考价值。
语音识别与之前的图像识别大同小异,基本步骤代码可以参考这篇:基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类_17岁boy的博客-CSDN博客
关于模型文件你可以在这里找到:Micro-ML/model/speech at main · beiszhihao/Micro-ML · GitHub
将.oneAPI改成.TfLite,添加到Cmake里生成inc文件,最后包含就可以了,具体参考图像分类的文章。
语音识别与图像识别的差异就在于使用的卷积层与池化层
语音识别方面不需要使用卷积层,是直接通过深度池化来做特征提取,因为图像重复部分会很多,但是语音不同,如果对语音做了卷积会导致丢失部分特征,因为卷积会提取合适部分的特征,针对图像会非常好,因为图像重复像素点或相似像素点会许多,做了卷积能提升运算效率。
if(micro_mutable_op_resolver.AddDepthwiseConv2D() != kTfLiteOk)
printk("Error Dep\\n");
return -1;
if(micro_mutable_op_resolver.AddFullyConnected() != kTfLiteOk)
printk("Error Full\\n");
return -1;
if(micro_mutable_op_resolver.AddSoftmax() != kTfLiteOk)
printk("Error Soft\\n");
return -1;
if(micro_mutable_op_resolver.AddReshape() != kTfLiteOk)
printk("Error Resh\\n");
return -1;
剩下的代码与之前的图像处理大同小异,这里给出完整代码:
#include <tensorflow/lite/c/common.h>
#include <tensorflow/lite/micro/all_ops_resolver.h>
#include <tensorflow/lite/micro/micro_error_reporter.h>
#include <tensorflow/lite/micro/micro_interpreter.h>
#include <tensorflow/lite/schema/schema_generated.h>
#include <zephyr.h>
#include <sys/printk.h>
#include <logging/log.h>
#include <device.h>
#include <soc.h>
#include <stdlib.h>
namespace
tflite::MicroInterpreter* interpreter = nullptr;
TfLiteTensor* model_input = nullptr;
constexpr int kTensorArenaSize = 30 * 1024;
uint8_t tensor_arena[kTensorArenaSize];
unsigned char a_model[] =
#include "model.inc"
;
unsigned char ar[] =
#include "ar.inc"
;
char label[][256] = "yes","no";
int main()
tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = µ_error_reporter;
const tflite::Model* model = tflite::GetModel(a_model);
if(model->version() != TFLITE_SCHEMA_VERSION)
printk("Error Model\\n");
return -1;
static tflite::MicroMutableOpResolver<4> micro_mutable_op_resolver(error_reporter);
if(micro_mutable_op_resolver.AddDepthwiseConv2D() != kTfLiteOk)
printk("Error Dep\\n");
return -1;
if(micro_mutable_op_resolver.AddFullyConnected() != kTfLiteOk)
printk("Error Full\\n");
return -1;
if(micro_mutable_op_resolver.AddSoftmax() != kTfLiteOk)
printk("Error Soft\\n");
return -1;
if(micro_mutable_op_resolver.AddReshape() != kTfLiteOk)
printk("Error Resh\\n");
return -1;
static tflite::MicroInterpreter static_interpreter(model,micro_mutable_op_resolver, tensor_arena, kTensorArenaSize, error_reporter);
interpreter = &static_interpreter;
TfLiteStatus allocate_status = interpreter->AllocateTensors();
if (allocate_status != kTfLiteOk)
printk("Error Alloc\\n");
return -1;
model_input = interpreter->input(0);
/* input */
int8_t* data = model_input->data.int8;
for(unsigned int i =0;i<sizeof(ar);++i)
data[i] = ar[i];
int64_t utime = k_uptime_get();
TfLiteStatus invoke_status = interpreter->Invoke();
if(invoke_status != kTfLiteOk)
printk("Error Invoke\\n");
return -1;
int64_t endTime = k_uptime_delta(&utime);
TfLiteTensor* output = interpreter->output(0);
int score = output->data.uint8[0];
int index = 0;
for(int i =0;i<2;++i)
if(score < output->data.uint8[i])
score = output->data.uint8[i];
index = i;
printk("Voice content:%s@%lldms\\n",label[index],endTime);
return 0;
如下是我在Stm32F746G_Disco上运行的结果:
以上是关于Zephyr下使用TFLite进行语音识别的主要内容,如果未能解决你的问题,请参考以下文章
尝试在使用 SpeechKit 进行语音识别之前播放系统声音
使用 Hopfield 神经网络读取 WAV 文件的数据部分以进行语音识别