您的位置:

SU03T语音模块工作原理

一、硬件设计

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

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

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

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

二、语音指令匹配

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

语音指令匹配过程如下:

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

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

#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模块还具有语音合成功能。当用户需要模块回应时,模块可以自动生成语音并输出到外部喇叭。

语音合成过程如下:

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

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

//输入的文本信息,最多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);
    }
}