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 = &micro_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 进行语音识别之前播放系统声音

语音识别中的ASR技术通识 2019-12-06

使用 Hopfield 神经网络读取 WAV 文件的数据部分以进行语音识别

使用APICloud & 科大讯飞SDK快速实现语音识别功能

wpf可以进行语音识别吗

golang 使用科大讯飞进行语音合成与识别