一、硬件设计
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);
}
}