项目背景
在现代智能交互设备的开发中,实现多用户个性化功能已成为一项关键技术。随着人工智能和人机交互技术的进步,语音识别和声纹识别在智能助理中的应用变得越来越重要。通过识别特定用户的声纹,系统可以为不同用户提供定制化的体验,增强用户粘性和满意度。
这在公用设备的场景下开发智能助理的个性化服务功能,能有效降低成本,提升用户体验。因此,开发一种能够实时识别多用户并根据声纹特征提供个性化服务的系统成为了行业发展的新趋势。
在该项目中,我们采用MCXN947技术作为声纹识别的关键组件。我们的目标是设计一个集成了IPS屏幕、麦克风和小扬声器的硬件平台,通过这些部件的高效协作,实现对用户的声纹识别和可视化,并依据识别结果提供个性化的响应服务。
通过这一系统,用户无需手动设置,智能设备便能自动识别并适应每位用户的偏好和需求,极大地方便了用户交互,提升了智能设备在多用户场景下的应用价值。
所用主要核心器件介绍
1.MCXN947是恩智浦推出的高性能多核微控制器单元,基于两个150MHz的Arm Cortex-M33内核,配备DSP协处理器和NPU N1-16神经处理单元,拥有2MB片上闪存和最高512KB的RAM,支持多种模拟和数字外设以及通信接口如以太网、USB Type-C、SPI、I2C、UART、WIFI和CAN-FD,适用于边缘人工智能和低功耗高性能场景,并通过FRDM-MCXN947开发板提供易于原型设计的支持。
2.(考虑使用)ESP32-S3-LCD-EV-Board是一款基于ESP32-S3芯片设计的屏幕交互开发板,由主板和可更换的子板组成,支持接入不同类型的LCD屏幕,具备16MB flash和16MB PSRAM的ESP32-S3-WROOM-1模组,支持RGB、8080、SPI及I2C接口屏幕,搭载双麦克风阵列和音频Codec ADC功放,支持语音识别和近/远场语音唤醒,具备触摸屏交互和语音交互功能,适用于开发多种智能设备,如智能中控屏、家电控制面板、电动车仪表盘等,提供两款不同分辨率LCD屏幕的版本,满足不同触摸屏应用产品的开发需求。
3. (为了调试暂时使用)Sispeed麦克风阵列是一款高性能的音频采集系统,采用多个麦克风单元配合先进的数字信号处理技术,能够实现360度全方位声音捕捉,具备高灵敏度、低失真、强抗干扰能力,适用于各种噪声环境下的语音识别和声源定位应用,支持多通道同步采样,提供清晰的语音输入,通过噪声抑制、回声消除和增益控制算法优化声音质量,可广泛应用于智能音响、会议系统、智能家居等领域,提升语音交互体验。
方案框图与设计思路
本项目的设计框图如下所示,主要包含以下三个模块
- 语音采集模块
- 通过集成的Sispeed麦克风拾取环境中的音频信号。
- 信号处理模块
- ADC采集信号,对采集的音频信号进行预处理,包括降噪和滤波。
- 数字信号被转化为频谱图,时序谱图,梅尔图,传输到核心处理器(MCXN947)进行进一步分析。
- 声纹识别模块
- 基于MCXN947处理器的算法能力,提取声纹特征。
- 通过识别模型,简单地进行用户身份的识别。
- 用户界面与反馈模块
- IPS屏幕显示交互信息及操作结果。
设计思路
- 模块化设计:通过定义明确的模块,确保每个部分可以单独开发、测试和优化。提高系统的灵活性和可维护性。
- 处理器选型:利用MCXN947的高效计算能力,负责核心的信号处理和声纹识别功能。该处理器将在实时处理和能效方面取得平衡。
- 集成与接口:MCXN947开发板集成多种接口,如I2C,SPI。保证在数据交互上,拥有稳定和快速的接口。
- 快速开发:NXP提供IDE与官方模型训练软件,开发流程简明易懂适合新手。
- 用户体验:通过直观的屏幕展示和声音反馈提高用户体验。
PCB
原理图
单纯地集成了一块IPS屏幕跟一个麦克风,麦克风使用i2s总线连接,屏幕用的是SPI总线
PCB
思路说明
SANraziel/Gender-Recognize-NXP-FRDM-MCX947
首先利用了python脚本,将已给的音频转换为波形图及其变体。如频谱图,MFCC特征图,梅尔图。
波形图:
波形图是一种用于展示音频信号随时间变化的图像,它显示了音频信号的幅度随时间的变化。
波形图通常是一个二维图像,其中横轴表示时间,纵轴表示幅度。
通过观察波形图,我们可以分析音频信号的以下特征:
- 幅度:波形图显示了音频信号的幅度变化,可以反映声音的响度。
- 时间变化:波形图显示了音频信号的幅度随时间的变化,可以反映声音的持续时间、音调的变化等。
- 波形:波形图的形状可以反映声音的音色,例如乐器的音色、语音的音色等。
图例为一段女性说话音的波形图
图例为一段男性说话音的波形图
波形图肉眼能够看出明显的指标差别是,女性的声音幅度一般比男性要大
波形图也是模型识别率最差的种类
频谱图:
频谱图是一种用于展示音频信号频率成分的图像,它显示了不同频率成分的幅度(或能量)随时间的变化。
频谱图通常是一个二维图像,其中横轴表示频率,纵轴表示幅度或能量,颜色或灰度表示信号在特定时间和频率上的强度。
通过观察频谱图,我们可以分析音频信号的以下特征:
- 频率成分:频谱图显示了音频信号中包含哪些频率成分。
- 幅度分布:频谱图显示了不同频率成分的幅度或能量分布。
- 时间变化:通过观察频谱图在不同时间点上的变化,可以分析音频信号的频率变化,例如音调的变化。
男性声音频谱图
女性声音频谱图
频谱图是肉眼可以看出区别很大的图像,梅尔图跟MFCC图人类比较难以观察,但还是看得出来一部分特征有明显区别的
梅尔图:
梅尔图的主要步骤包括:
- 分帧:将音频信号分割成短时间的帧,例如 20-50 毫秒。
- 快速傅里叶变换 (FFT):对每个帧进行快速傅里叶变换,将其转换为频率域表示。
- 梅尔滤波器组:将频率域信号通过梅尔滤波器组,将频率轴转换为梅尔刻度,更符合人耳的听觉感知。
- 离散余弦变换 (DCT):对梅尔滤波器组输出的结果进行离散余弦变换,得到梅尔图。
特点:
- 频率轴:梅尔图的频率轴使用梅尔刻度,更符合人耳的听觉感知。
- 时间轴:梅尔图的时间轴表示音频信号的时间。
- 幅度:梅尔图的幅度表示不同频率成分在时间上的强度变化。
局限性:
- 丢失部分信息:梅尔图会丢失部分时域信息,例如相位信息。
- 对噪声敏感:梅尔图对噪声比较敏感,会影响其分析结果。
图例如男性声音的梅尔图
MFCC特征图:
MFCC特征图是梅尔频率倒谱系数 (MFCC) 的可视化表示,它展示了语音信号在不同时间帧上的声学特征变化。MFCC 是一种用于分析和识别语音信号的常用特征,它通过将音频信号转换为一系列系数来描述语音信号的声学特性。
MFCC特征图通常是一个二维图像,其中横轴表示时间,纵轴表示 MFCC 系数的编号。每个时间帧上的 MFCC 系数被绘制为一个条形图,条形的长度代表该系数的值。通过观察 MFCC特征图,我们可以分析语音信号的声学特征,例如:
- 基频:MFCC 特征图的最低几个系数通常与语音信号的基频有关。
- 共振峰:MFCC 特征图中的峰值与语音信号的共振峰相对应。
- 能量:MFCC 特征图的总体高度可以反映语音信号的能量。
- 时间变化:通过观察 MFCC 特征图在不同时间帧上的变化,可以分析语音信号的音素、音调、语速等特征。
图例如女性声音的MFCC特征图
然后利用以上的图片通过图像识别模型训练,就可以进行区分
关键代码
该模型的制造,用NXP eIQ 机器学习Toolkit就可以轻松做到,具体过程不再详叙
具体可以参见官网
该模型的训练非常轻松而且提供基础模型,可视化界面非常直观,很适合小白
工程文件可以在NXP提供的例程文件上面修改
此处用到的例程是Label CIFAR10 image on FRDM-MCXN947
在NXP的IDE选择例程导入,搜索该项目,复制可以直接导入。
放一下声图转换的实例代码,此处为MFCC特征图提取转换的实例代码
# 定义一个函数,用于提取WAV文件的MFCC特征并保存为图像
def extract_mfcc_to_image(wav_file, image_file):
# 加载WAV文件
y, sr = librosa.load(wav_file, sr=None)
# 提取MFCC特征
mfcc = librosa.feature.mfcc(y=y, sr=sr)
# 绘制MFCC特征
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfcc, x_axis='time', sr=sr)
# 保存图像
plt.savefig(image_file)
plt.close()
然后,图像信息是使用UART串口传输到板子上的,需要一段串口UART传输的代码,此处是串口传输的示例,在这里,传输过去的是一段文字,如果传输图像信息,此时调用电脑上位机的文件夹内的文件一直传输直到结束
void UART_Init(void) {
uart_config_t config;
UART_GetDefaultConfig(&config);
config.baudRate_Bps = UART_BAUDRATE;
config.enableTx = true;
config.enableRx = true;
UART_Init(UART_INSTANCE, &config, CLOCK_GetFreq(UART0_CLK_SRC));
}
void UART_SendData(const uint8_t *data, size_t length) {
UART_WriteBlocking(UART_INSTANCE, data, length);
}
int main(void) {
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
UART_Init();
const char message[] = "Hello!";
UART_SendData((uint8_t *)message, sizeof(message) - 1);
while (1) {
}
}
功能演示
板子没到,因此只做到软件部分为止的调试过程
在附件中,打包了使用梅尔图作为测试标准的模型
心得体会
参加Fastbond活动的体验对我来说是非常独特和深刻的。以下是我个人参加这次活动的心得体会:
首先,我必须依靠自己的力量去面对所有的挑战。这个过程让我意识到自己的潜力和能力,增强了我独立解决问题的信心。其次,Fastbond活动锻炼了我的时间管理和自律能力。最后,这次活动让我更加珍惜团队合作的价值。在没有团队支持的情况下,我意识到团队的力量是多么重要。在未来的合作中,我会更加珍视团队中的每一个成员,努力发挥团队协作的最大效能。相信这些经验和教训将对我未来的成长产生深远的影响。