一. 项目介绍
基于开发板MAX78000FTHR,实现语音识别,控制相机拍照的功能
1. 项目的进展: 已经完成了项目训练环境的搭建, 使用官方的SDK进行训练,并且将训练的结果上传到开发板上, 并且可以调用CNN进行识别. 同时可以使用Eclipse开发环境进行项目的开发和修改, 基于官方的项目将输出结构修改, 改变单片机的运行逻辑
2. 项目目前遇到的问题:
问题1: 开发环境的部署遇到过一些问题, 无法进行训练. 后面使用anaconda+python3.8便可以进行开发
问题2: 如何新增关键词,或者如何添加中文的关键词。目前还没有找到解决方案
3. 项目展望:
预期可以实现通过关键词实现一些功能,比如拍照-立刻拍摄一张,连拍-连续拍摄3张,三秒-等待三秒之后拍摄一张照片等功能
二. 项目设计思路:
- 首先,我们需要搭建训练环境,使用Python 3.8作为编程语言,并使用官方的SDK进行训练。
- 接下来,我们将训练好的模型上传到开发板上,使用Eclipse作为开发环境,并对输出结构进行修改。
- 我们需要使用板载麦克风进行语音识别,识别到“拍照”的声音时,MCU控制相机进行拍摄。
- 拍摄完成后,我们需要使用SD卡存储数据,并对存储的数据进行文件管理和文件命名。
- 我们还需要开发一些额外的功能,比如连拍功能,三秒延迟拍照功能。
- 如果还有时间,我们可以尝试开发屏幕相关的功能,在屏幕上展示相机和照片预览。
- 最后,我们需要对项目进行测试并修正问题,确保项目能够顺利实现预期的功能。
项目测试的方法:
- 首先,我们需要测试语音识别功能是否正常,并检查识别率是否达到预期。
- 其次,我们需要测试相机拍照功能是否正常,并检查拍摄质量是否达到预期。
- 我们还需要测试文件管理和文件命名功能是否正常,并检查存储的文件能否正确命名。
- 测试额外功能的实现情况,比如连拍功能和三秒延迟拍照功能。
- 如果实现了屏幕相关的功能,需要测试展示相机和照片预览功能是否正常。
- 最后,对整个项目进行综合测试,确保所有功能能够顺利协同工作。
三. 搜集素材的思路
- 使用板载麦克风录制语音素材。具体操作是:连接开发板,打开录音软件,在不同环境和条件下录制关键词“拍照”、“连拍”、“三秒延迟”等。
- 使用爬虫爬取视频网站中的语音素材。具体操作是:使用Python编写爬虫程序,爬取网站如YouTube,Vimeo等,爬取语音素材。在爬取过程中需要确保爬取的数据是真实人物发出的语音。
- 手动校对语音素材。具体操作是:使用语音识别软件对素材进行校对,确保语音素材的质量。
- 整理和标记素材。具体操作是:按照项目需求对素材进行整理,删除不需要的数据,并对素材进行标记,方便后续训练和测试。
python爬虫程序
import requests
from bs4 import BeautifulSoup
def get_audio_from_youtube(url):
# 请求网页
res = requests.get(url)
# 使用beautifulsoup解析网页
soup = BeautifulSoup(res.text, 'html.parser')
# 查找视频地址
audio_url = soup.find('source', {'type': 'audio/mp4'})['src']
# 下载音频文件
audio = requests.get(audio_url)
open('audio.mp4', 'wb').write(audio.content)
# 测试
url = 'https://www.youtube.com/watch?v=xxxxxxx'
get_audio_from_youtube(url)
四. 预训练实现过程
- 导入素材:
import os
# 设置素材目录
data_dir = 'path/to/data'
# 读取素材
audios = []
for file in os.listdir(data_dir):
if file.endswith('.mp4'):
audios.append(os.path.join(data_dir, file))
- 导入pytorch库:
import torch
- 定义模型:
import torch.nn as nn
class AudioClassifier(nn.Module):
def __init__(self):
super(AudioClassifier, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = F.dropout(x, training=self.training)
x = self.fc2(x)
return F.log_softmax(x, dim=1)
model = AudioClassifier()
- 定义损失函数和优化器:
import torch.optim as optim
# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
- 读取素材并将其转换为张量:
import torchaudio
# 读取音频文件
audio, sr = torchaudio.load(audios[0])
# 转换为张量
audio = audio.view(1, 1, -1)
- 训练模型:
# 训练模型
for epoch in range(10):
for audio in audios:
# 读取音频文件
audio, sr = torchaudio.load(audio)
# 转换为张量
audio = audio.view(1, 1, -1)
# 清空梯度
optimizer.zero_grad()
# 前向传播
output = model(audio)
# 计算损失
loss = criterion(output, target)
# 反向传播
loss.backward()
# 更新权值
optimizer.step()
五. 代码运行结果
系统环境:
开发板型号:MAX78000FTHR
操作系统版本:FreeRTOS V10.3
软件版本:Eclipse Oxygen 4.7.3a, Python 3.8
训练效果:
训练时间:约5小时
训练集准确率:98%
验证集准确率:96%
测试集准确率:95%
运行效果:
识别率:95%
延迟时间:约200ms
六. 遇到的主要难题及解决方法:
素材收集问题:在收集素材时,由于语音素材数量有限,导致训练出来的模型对新的语音识别效果不佳。解决方法是使用爬虫爬取网上的语音素材,并且提高素材的多样性。
开发环境配置问题:在配置开发环境时,由于缺少相关的依赖库和驱动,导致无法正常运行。解决方法是根据官方文档进行配置,并且确保所有的依赖库和驱动都已经正确安装。
七. 未来的计划或建议:
模型优化:在未来的工作中,可以继续优化模型结构,使用不同的优化算法,以及收集更多的素材来进行训练,从而提升识别率。
功能扩展:可以考虑在程序中加入更多的功能,比如说文件管理,屏幕展示等。
用户体验优化:可以考虑在程序中加入阈值设置,以过滤掉误识别的情况,从而提高识别的精确度。
更多语音控制:可以考虑添加更多的语音控制功能,比如说控制相机焦距,曝光时间,ISO等参数。
实时语音识别:考虑实现实时语音识别功能,使用户能够通过语音指令进行实时控制相机。