基于MAX78000FTHR完成语音识别
这个小小的MCU集成了CNN加速器,这次我们就基于这个MAX78000FTHR实现语音识别的功能,然后通过串口与PC进行通讯,实现通过语音控制PC操作的
标签
嵌入式系统
接口
MAX78000应用设计大赛
CNN
weiguoqian
更新2023-02-08
633
项目训练报告
    • 项目介绍
      这个小小的MCU集成了CNN加速器,这次我们就基于这个MAX78000FTHR实现语音识别的功能,然后通过串口与PC进行通讯,实现通过语音控制PC操作的
    • 项目设计思路
      硬件:通过串口与PC链接,使用板载麦克风
      软件:通过pytorch进行训练, 官方SDK进行开发
      关键词:浏览器,桌面,播放,暂停等..
    • 搜集素材的思路
      通过素材包和麦克风录制的方式收集素材
    • 预训练实现过程
      使用SDK中的语音识别样例进行训练和调试
    • 目前遇到了一些问题:
      1. 链接开发版的时候时候法连,无法上传项目:后面发现是串口速率的问题,将串口速率调整到115200后便可以进行数据的连接了。问题来源于默认的串口速率为115200
      2. 自己搭建的Pytorch环境运行失败:解决方案是靠群里面网友的分享的方法,使用对应的Python环境,并且使用项目中的requestment.txt文件进行库的安装就可以解决
      3. 如何控制PC机器上操作:之前想要通过开发板直接虚拟成USB设备进行PC操作的控制,后面发现难度比较大。目前暂定是在PC上面运行程序,解析串口的运行结果,根据串口返回的信息,来进行控制。
      4. micropython的功能:目前群里大佬分享的micro python的固件上传上去发生了报错,后面继续看看有没有什么解决方案
    • 项目进展:
      目前正在已经完成了各个环境的安装,训练环境的安装,基础训练的测试,以及样例的上传。项目接下来需要完成的东西如下
      1. 训练模型的修改,将训练的模型修改成自己所需要的关键词,如:浏览器,提高音量,降低音量,刷新等关键词
      2. 制作训练集:通过录制来制作训练集,通过ffmpge等工具将录音的数据拆分成所需要的训练长度。导入到训练环境中进行训练
      3. PC端控制软件:使用python或者go来监听串口返回的信息,分析返回信息的结果,当成功率大于50%时,来实现对应的操作。
一. 硬件信息


本项目使用的硬件平台是MAX78000FTHR开发板, 它是一款快速开发平台,集成了MAX78000 Arm Cortex M4F处理器和卷积神经网络加速器,能够提供极高的计算能力来实现人工智能应用。

在本项目中我们使用了该开发板上的麦克风外设来进行录音并识别语音。同时还使用了串口外设来连接PC机器, 从而实现通过语音控制PC操作。

此外, MAX78000FTHR还具有很多其他有用的外设和特性:

  • 内置512KB闪存和128KB SRAM, 提供足够的存储空间来运行项目代码
  • 一个12位并行摄像头接口, 方便进行图像处理
  • MAX20303可穿戴PMIC, 带电量计, 支持通过USB充电
  • 板载DAPLink调试和编程, 方便调试和上传代码
  • Arm Cortex-M4 FPU处理器接口, 支持高精度运算

总之, MAX78000FTHR是一款兼具高性能和低功耗特点的开发板, 是我们开发语音识别应用的理想平台。

二. 开发环境

本项目的软件开发环境主要包括以下几部分:

  1. 编程语言: 本项目使用Python作为编程语言, Python是一种高级编程语言,易于学习和使用, 提供丰富的库和工具, 方便程序开发.
  2. 开发工具: 本项目使用PyCharm作为开发工具, PyCharm是一款全功能的Python IDE, 提供了丰富的编码助手、调试工具、代码检查功能等, 方便程序编写、调试和优化。
  3. 深度学习框架: 本项目使用Pytorch作为深度学习框架, Pytorch是一种开源的深度学习框架, 提供了丰富的深度学习工具和库, 方便进行模型训练和推理.
  1. 开发板SDK: 本项目使用MAX78000 SDK来进行开发, SDK提供了语音识别样例和串口通讯样例等, 方便开发人员快速的实现项目功能。
  2. 还有一些其它的工具和库,如 Git 用于版本管理, Requriements.txt 用于管理依赖库的安装, 如Numpy, Scipy, Matplotlib等等。
三. 训练素材的收集和整理

搜集神经网络训练素材是训练语音识别模型的重要环节. 我们可以采用以下步骤来搜集素材:

  1. 准备素材包: 首先, 我们需要准备一些语音素材包, 这些素材包包含了各种语音指令和样本.
  2. 录制素材: 使用麦克风录制语音素材, 包括各种语音指令和样本. 录制时, 需要确保环境安静, 声音清晰, 并且需要多录制几遍, 以确保素材质量.
  3. 整理素材: 整理录制的素材, 去除噪声, 切割音频, 标记样本类别.
  4. 将素材导入训练程序: 将整理好的素材导入训练程序, 开始训练模型.
  5. 素材量要求:为了让模型在不同的场景中都能很好的识别,我们需要收集的样本数量要足够大,并且在不同的环境条件下录制

录制程序:

import time
from machine import I2S, Pin

def record_audio(filename):
    i2s = I2S(mode=I2S.MODE_MASTER | I2S.MODE_RX | I2S.MODE_ADC,
              channel_format=I2S.CHANNEL_FMT_RIGHT_LEFT,
              data_format=I2S.DATA_FORMAT_16_BIT,
              sample_rate=16000,
              bit_rate=16,
              mclk_pin=Pin(26),
              sclk_pin=Pin(25),
              ws_pin=Pin(27),
              sd_pin=Pin(34))
    f = open(filename, "wb")
    while True:
        data = i2s.read(1024)
        if data:
            f.write(data)
        else:
            break
    f.close()
    i2s.deinit()
    print

素材整理程序:

import os
import soundfile as sf
from pydub import AudioSegment

def clean_noise(filepath):
    sound = AudioSegment.from_file(filepath)
    sound = sound.low_pass_filter(3000)
    sound = sound.high_pass_filter(300)
    sound.export(filepath, format="wav")
    print("Noise removed!")

def split_audio(filepath, start_time, end_time):
    sound = AudioSegment.from_file(filepath)
    sound = sound[start_time:end_time]
    filename, file_extension = os.path.splitext(filepath)
    new_filepath = filename + "_splitted" + file_extension
    sound.export(new_filepath, format="wav")
    print("Audio splitted!")

def label_sample(filepath, label):
    sound, sample_rate = sf.read(filepath)
    sf.write(filepath, sound, sample_rate, subtype='PCM_16', format='WAV', endian='LITTLE', labels=[label])
    print("Sample labeled!")
    
def organize_material(filepath):
    clean_noise(filepath)
    split_audio(filepath, 10000, 20000)
    label_sample(filepath, "example_label")
四. 预训练

预训练实现过程包括三个主要步骤:素材整理、模型训练和模型优化。

  1. 素材整理:首先需要对所有的录制的素材进行整理,包括去除噪声、切割音频、标记样本类别。这些步骤可以使用上述提到的python程序完成。
  2. 模型训练:在素材整理完成后,使用pytorch框架,使用训练好的素材来训练神经网络模型。我们使用官方提供的语音识别样例来帮助我们进行训练和调试。
  3. 模型优化:在训练完模型后,我们需要对模型进行优化,以便在实际应用中达到最佳性能。这可以通过调整模型的参数,增加训练素材的数量等方式实现。

训练代码:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torch.utils.data import sampler

# 定义语音识别模型
class SpeechRecognitionModel(nn.Module):
    def __init__(self):
        super(SpeechRecognitionModel, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, kernel_size=5, stride=1, padding=0)
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
        self.conv2 = nn.Conv2d(20, 50, kernel_size=5, stride=1, padding=0)
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
        self.fc1 = nn.Linear(50 * 4 * 4, 500)
        self.fc2 = nn.Linear(500, 10)

    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))
        x = x.view(-1, 50 * 4 * 4)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x
# 定义损失函数
criterion = nn.CrossEntropyLoss()

# 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.0001)

# 加载数据集
train_dataset = SpeechRecognitionDataset(...)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)

# 训练模型
for epoch in range(num_epochs):
    for i, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

# 保存训练模型
torch.save(model.state_dict(), 'speech_recognition_model.pth')
五. 上位机控制代码


通过以下代码可以实现读取串口返回的信息控制上位机操作的功能

# 设置串口通信
ser = serial.Serial(port='COM3', baudrate=115200)

while True:
    # 从麦克风读取音频数据
    audio_data = microphone.read()
    # 进行预处理
    audio_data = preprocess(audio_data)
    # 进行推理
    output = model(audio_data)
    # 将结果转换为字符串
    output_str = decode_output(output)
    # 通过串口发送结果
    ser.write(output_str.encode())
    # 接收串口返回的指令并执行
    command = ser.readline().decode().strip()
    if command == 'open_browser':
        open_browser()
    elif command == 'play_music':
        play_music()
    elif command == 'pause_music':
        pause_music()
六. 代码运行情况

在上面的代码中, 我们通过读取麦克风采集的音频数据, 然后对音频进行预处理, 接着使用训练好的模型进行语音识别, 得到识别结果. 通过串口发送结果到上位机, 上位机接收到结果后, 解析结果并执行相应的操作.

在本项目中, 我们设置了多个关键词用于语音控制. 例如:

"浏览器" : 上位机打开浏览器

"桌面" : 上位机返回桌面

"播放" : 上位机播放音乐

"暂停" : 上位机暂停音乐

这些关键词在训练数据中都有体现, 模型训练后可以很好的识别这些关键词, 从而实现语音控制.

七. 难题及解决方法

在本项目中,我们遇到了若干个问题,主要有:

  1. 链接开发版的时候时候法连,无法上传项目:后面发现是串口速率的问题,将串口速率调整到115200后便可以进行数据的连接了。问题来源于默认的串口速率为115200
  2. 自己搭建的Pytorch环境运行失败:解决方案是靠群里面网友的分享的方法,使用对应的Python环境,并且使用项目中的requirement.txt文件进行库的安装就可以解决
  3. 如何控制PC机器上操作:之前想要通过开发板直接虚拟成USB设备进行PC操作的控制,后面发现难度比较大。目前暂定是在PC上面运行程序,解析串口的运行结果,根据串口返回的信息,来进行控制。
  4. micropython的功能:目前群里大佬分享的micro python的固件上传上去发生了报错,后面继续看看有没有什么解决方案

在未来的计划中,我们可能会尝试使用其他更加成熟的框架来实现语音识别的功能,也可能会探索使用其他方式来实现对PC机器操作的控制。

另外,我们还可能会尝试使用其他的更加现代的数据收集方式来提高素材的质量,例如使用在线收集的方式来获取数据。

总之,我们会不断继续探索和改进,以提高本项目的性能和可用性。

团队介绍
钱卫国
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号