ESP32 S3 语音识别 语音唤醒程序流程

ESP32 S3 语音识别 语音唤醒程序流程

参考例程

D:\Espressif\esp-adf\examples\speech_recognition\wwe\

首先进行esp_periph_set_init 初始化

之后注册回调函数periph_callback,在这里当有按键消息的时候执行audio_recorder_trigger_start和audio_recorder_trigger_stop,也就是开始识别和结束识别。

之后执行audio_board_key_init,初始化ADC按键,这个在之前的流程里面讲过,不在多说。

之后执行audio_board_init,初始化音频部分,包括codec和PA,这个要根据板卡进行初始化。

之后执行setup_player,

对播放器进行初始化。播放tone提示音

这里主要是初始化esp_audio_create,把如下element:tone stream、MP3decoder、i2s stream,加到player中。

之后执行start_recorder,

对识别器进行初始化,并启动。

这里新建一个pipline,把i2s stream(读取音频codec的原始数据)、filter、raw stream 这几个element加入并link进pipeline。之后audio_pipeline_run启动pipeline。这样就准备好了音频数据流。

在函数中有初始化了recorder_sr_cfg,这里识别的语音、唤醒使能、mic前端afe等都进行了定义。

之后filter_cfg里面对采样率、buffer等进行了定义。

amrnb_cfg对AMRNB_ENCODER 等参数进行了定义。

之后rsp_filter_init(&filter_cfg),amrnb_encoder_init(&amrnb_cfg)初始化,之后把返回的element句柄注册到recorder_encoder_cfg的resample和encoder中去。

之后初始化audio_rec_cfg_t cfg = AUDIO_RECORDER_DEFAULT_CFG();这里定义了audio recorder 的task优先级、堆栈、唤醒timer等参数。

之后调用cfg.sr_handle = recorder_sr_create(&recorder_sr_cfg, &cfg.sr_iface);,进行recorder sr的创建,这里cfg通过sr_handle,把之前的recorder_sr_cfg(filter_cfg、amrnb_cfg)都联系了起来。

之后在

recorder = audio_recorder_create(&cfg);这样recorder识别器初始化完成。

主程序执行rec_q = xQueueCreate(3, sizeof(int)); 创建Queue

之后主程序 audio_thread_create(NULL, "read_task", voice_read_task, NULL, 4 * 1024, 5, true, 0);

创建thread voice_read_task

识别的主处理voice_read_task

就比较好读懂了:

c 复制代码
static void voice_read_task(void *args)
{
    const int buf_len = 2 * 1024;
    uint8_t *voiceData = audio_calloc(1, buf_len);
    int msg = 0;
    TickType_t delay = portMAX_DELAY;

    while (true) {
        if (xQueueReceive(rec_q, &msg, delay) == pdTRUE) {
            switch (msg) {
                case REC_START: {
                    ESP_LOGW(TAG, "voice read begin");
                    delay = 0;
                    voice_reading = true;
                    break;
                }
                case REC_STOP: {
                    ESP_LOGW(TAG, "voice read stopped");
                    delay = portMAX_DELAY;
                    voice_reading = false;
                    break;
                }
                case REC_CANCEL: {
                    ESP_LOGW(TAG, "voice read cancel");
                    delay = portMAX_DELAY;
                    voice_reading = false;
                    break;
                }
                default:
                    break;
            }
        }
        int ret = 0;
        if (voice_reading) {
            ret = audio_recorder_data_read(recorder, voiceData, buf_len, portMAX_DELAY);
            if (ret <= 0) {
                ESP_LOGW(TAG, "audio recorder read finished %d", ret);
                delay = portMAX_DELAY;
                voice_reading = false;
            }
        }
#if VOICE2FILE == (true)
        voice_2_file(voiceData, ret);
#endif /* VOICE2FILE == (true) */
    }

程序流程梳理完毕。有啥技术问题v吾:robot3g,也可以进Q群 174742054讨论。

相关推荐
zhangfeng113318 小时前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息
DogDaoDao18 小时前
神经网络稀疏化设计构架方法和原理深度解析
人工智能·pytorch·深度学习·神经网络·大模型·剪枝·网络稀疏
西猫雷婶19 小时前
pytorch基本运算-Python控制流梯度运算
人工智能·pytorch·python·深度学习·神经网络·机器学习
说私域19 小时前
新零售第一阶段传统零售商的困境突破与二次增长路径:基于定制开发开源AI智能名片S2B2C商城小程序的实践探索
人工智能·开源·零售
寒月霜华20 小时前
机器学习-模型验证
人工智能·深度学习·机器学习
救救孩子把21 小时前
3-机器学习与大模型开发数学教程-第0章 预备知识-0-3 函数初步(多项式、指数、对数、三角函数、反函数)
人工智能·数学·机器学习
CareyWYR21 小时前
每周AI论文速递(250908-250912)
人工智能
张晓~1833994812121 小时前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
deephub21 小时前
量子机器学习入门:三种数据编码方法对比与应用
人工智能·机器学习·量子计算·数据编码·量子机器学习
AI 嗯啦21 小时前
计算机视觉----opencv实战----指纹识别的案例
人工智能·opencv·计算机视觉