×

唤醒词检测开源分享

消耗积分:0 | 格式:zip | 大小:0.03 MB | 2022-12-09

王璐

分享资料个

描述

团队成员

孙国明 (gs45)

天月宇文(ty26)

欧阳刘昊(lo12)

徐瑞涛(rx9)

介绍

唤醒词是诸如“Hi Siri”和“OK Google”之类的词。我们用这些词来唤醒我们的智能助手,并要求他们提供有用的信息。为了保护用户隐私并保持较低的能耗,可以将唤醒词检测功能转移到低功耗芯片上。当它检测到唤醒词时,它将其余的工作留给其他部分。

在这个项目中,我们将“是”和“否”定义为唤醒功能,并尝试使用我们的开发板 Arduino Nano 33 BLE Sense 对“是”、“否”和其他词进行分类。我们使用其 LED 灯的颜色:红色、绿色和蓝色来代表不同的类别。我们使用 TinyML 通过板上经过训练的模型实现了唤醒词检测。当人们在 Arduino 板上说话时,它会自动检测到他们。

过程

首先,我们需要获取输入。我们使用 Arduino Nano 33 BLE sense 上的内置麦克风获取输入的原始音频,然后我们使用相关接口将其提取到我们的程序中。

我们预处理输入以提取适合模型的特征。得到音频训练示例后,我们首先需要对原始音频进行特征提取。它使用 FFT 将原始音频转换为频谱图。然后我们从频谱图中提取特征。之后,我们对处理过的输入进行推理。我们使用此输入来训练我们的模型。我们的模型将输出一组我们所说的已知单词的概率。如果概率超过阈值,我们可以说我们说的词就是超过概率的那个词。

我们使用的模型经过训练可以识别单词“是”、“否”、未知单词以及静音或背景噪音。它每次输入一秒钟的数据。它输出四个概率分数,一个对应于这四个类中的每一个。它可以预测数据的类别。该模型不接收原始音频样本数据。相反,它适用于频谱图。

一秒钟的数据是一个频谱图,表示为具有 43 列和 49 行的二维数组。对于每一行,我们通过快速傅里叶变换算法 (FFT) 运行一段 30 毫秒的音频输入,该算法分析并创建一个包含 256 个频率桶的数组。然后我们平均分成 6 组。为了构建整个 2D 阵列,我们将 49 个连续的 30 毫秒音频切片的结果组合在一起,每个切片与最后一个切片重叠 10 毫秒。

poYBAGOSeXuAdiMWAABnvuAm3_I074.png
音频到频谱图
 

由于频谱图是二维数组,我们将其作为二维张量输入到模型中。我们使用可与任何多维向量输入一起使用的卷积网络。事实证明,它们非常适合处理频谱图数据。

在计算机上运行程序后,我们使用 Arduino 将其部署到 Arduino Nano 33 BLE Sense 板上。并通过查看威廉希尔官方网站 板上的指示灯和 Arduino 的工具串行监视器来跟踪结果。

结果

我们在 Arduino Nano 33 BLE Sense 板子上运行程序,它可以区分是、否和其他未知词。

poYBAGOSeX2AEqGCAAA5Kl89f9s449.png
结果
 

结论

在这个项目中,我们使用 TinyML 将经过训练的音频分类模型部署到 Arduino Nano 33 BLE Sense。通过这种方式,我们成功地在低功耗芯片上实现了唤醒词检测功能,从而使隐私安全和节能的数字辅助成为可能。

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'唤醒词检测开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);