千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > SU03T语音模块工作原理

SU03T语音模块工作原理

来源:千锋教育
发布人:xqq
时间: 2023-11-22 17:34:22 1700645662

一、硬件设计

SU03T语音模块是一个集成了语音控制的声音识别模块。它采用专用的音频处理芯片VAG6810和一颗STM32F103芯片配合使用。

这个模块主要由麦克风、按键外设、几个芯片以及连接线组成。其中麦克风负责收集用户的语音指令,外设负责读取按键开关状态,音频处理芯片负责对声音进行处理,STM32F103芯片负责控制模块的运行和对外部天线的控制。

下面是连接线的具体接口:


GND     -   地线
VCC     -   电源正极
TXD     -   数据输出
RXD     -   数据接收
ADC     -   麦克风输入管脚
KEY     -   按键输入管脚
SP+-   -   喇叭输出管脚
ANT     -   外接天线控制管脚

二、语音指令匹配

SU03T模块支持18种语音指令的控制。当用户说出语音指令时,模块会将指令与预定义的指令进行匹配。如果匹配成功,模块就会执行相应的操作,例如开启或关闭设备。

语音指令匹配过程如下:

用户说出语音指令,麦克风收集声音信号。 模块将麦克风收集到的声音信号转化为数字信号,即语音指令。 模块用快速傅里叶变换(FFT)对语音指令进行处理得到一个频谱图。 将频谱图与预定义的模板进行比较,找到最佳匹配。 根据最佳匹配确定语音指令的类型,执行相应的操作。

下面是匹配指令的部分代码:


#define CMD_NUM     18
#define CMD_BUF_LEN 100

//定义18种语音指令
static char* cmdBuf[CMD_NUM] = {
    "KZMSLW", "GBMSLW", "KJMJT", "GSMJT", "KJPZMT", "GSPZMT",
    "BZFX", "GGFX", "ZCFS", "CQWJ", "TCWJ", "CYKZ", "GFJX", "SZCZ",
    "TCTK", "CTTK", "SJTK", "AKTK"
};

//匹配语音指令
void matchCmd(char* cmd)
{
    char buf[CMD_BUF_LEN];
    memcpy(buf, cmd, strlen(cmd));
    buf[strlen(cmd)] = '\0';
    for(int i = 0; i < CMD_NUM; i++)
    {
        if(strcmp(buf, cmdBuf[i]) == 0)
        {
            //执行相应操作
            executeCmd(i);
            break;
        }
    }
}

三、语音识别率控制

由于语音指令的识别受到外部环境的干扰,因此在设计SU03T模块时需要考虑控制语音识别率的问题。

为了提高语音识别率,可以采取以下措施:

在开发过程中,需要对模块进行多场景的测试,收集不同环境下的语音信号。 通过调整麦克风的位置和方向来获取更清晰的语音指令。 对预定的语音模板进行优化和更新,提高匹配的准确度。

四、语音合成

SU03T模块还具有语音合成功能。当用户需要模块回应时,模块可以自动生成语音并输出到外部喇叭。

语音合成过程如下:

选择合成所需语音的文字内容。 将选定的文字转化为对应的音素序列。 利用差分重构技术生成语音波形。 将合成的语音波形输入到输出缓冲区并输出到外部喇叭。

下面是合成语音的部分代码:


//输入的文本信息,最多60个字
#define INPUT_TEXT_LEN 60
static char inputText[INPUT_TEXT_LEN] = "欢迎您使用SU03T语音模块!";

//TTS合成
void TTS(void)
{
    uint16_t i;
    char *inputVocoderString = inputText;
    
    //将文字转换成语音波形数据
    VOCODER_ProcessString(&inputVocoderString, outputBuffer);
    
    //写入音频数据到DA输出
    for(i = 0; i < ((VOCODER_BUFFER_SIZE)/2); i++)
    {
        DAC->DHR12R1 = (unsigned int)outputBuffer[i];
        while(!DAC_GetFlagStatus(DAC_FLAG_DMAUDR1)){};
        DAC_ClearFlag(DAC_FLAG_DMAUDR1);
    }
}

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT