[原创] ST-AMG-Sensortile开发大赛——麦克风手势控制

奥利晶   2017-3-1 11:35 楼主
代码库链接:https://github.com/0rig1n/ST-AMG-Sensortile-Development.git
http://player.youku.com/player.php/sid/XMjUzNDg0Njg5Ng==/v.swf
Sensortile小巧玲珑,功能强大。笔者一直有一个梦想,让我们的生活变得智能而人性化。而sensortile有着实现这一梦想的潜力。在我的规划中,sensortile将作为手上的一个挂件,发挥各式各样的作用。这里我开发了一个非常“有情怀”的功能:麦克风的手势控制。
假想在生活中,你收到了一个电话。你可能需要拿起你的电话,或是掏出你的手机。即便目前最方便的方式,也要按一下耳机上的按钮。然而,我这里的构想可以让这一过程变得更为简单:只需要将手抬到嘴边即可通话;抖一抖手即可挂断电话。舍弃了一切多余的动作,让你的生活更加方便。
在这里十分感谢flyloong网友,笔者在写代码的时候出现了很多奇怪的bug,参考flyloong的代码库后,才理解了bug的成因并修复。因此十分感谢。
这里我分享部分代码,希望对各位有所帮助。

首先,要实现这样的一个功能,需要获取手势数据,并做出相应的调整。
Sensortile默认的手势有Pick_UP(拿起)、Glance(抬大约30°)、Wake_Up(摇一摇),考虑实际,这里选用Pick_UP作为开启手势、摇一摇作为停止手势。收到相应的数据后,更新信号位is_on:
  1.       
  2. if( f.getName().equals("Gesture")){
  3.                 FeatureMemsGesture Gesture = mNode.getFeature(FeatureMemsGesture.class);
  4.                 if(Gesture.getGesture(sample)== FeatureMemsGesture.Gesture.PICK_UP){mAudioTrack.play();is_on=true;}
  5.                 if(Gesture.getGesture(sample)== FeatureMemsGesture.Gesture.GLANCE){/*mAudioTrack.play();is_on=true;*/}
  6.                 if(Gesture.getGesture(sample)== FeatureMemsGesture.Gesture.WAKE_UP){
  7.                     synchronized(this) {
  8.                     mAudioTrack.pause();
  9.                     mAudioTrack.flush();is_on=false;
  10.                 }}
  11.             }

随后系统根据信号位做出调整,如果信号位为开启,则打开麦克风;如果为关闭则关闭麦克风
  1. if(is_on){
  2.             if(!mNode.isEnableNotification(mNode.getFeature(FeatureAudioADPCM.class))) {
  3.                 mNode.enableNotification(mNode.getFeature(FeatureAudioADPCM.class));
  4.             }
  5.             if(!mNode.isEnableNotification(mNode.getFeature(FeatureAudioADPCMSync.class))) {
  6.                 mNode.enableNotification(mNode.getFeature(FeatureAudioADPCMSync.class));
  7.             }}
  8.             else{
  9.                 if(mNode.isEnableNotification(mNode.getFeature(FeatureAudioADPCM.class))) {
  10.                     mNode.disableNotification(mNode.getFeature(FeatureAudioADPCM.class));
  11.                 }
  12.                 if(mNode.isEnableNotification(mNode.getFeature(FeatureAudioADPCMSync.class))) {
  13.                     mNode.disableNotification(mNode.getFeature(FeatureAudioADPCMSync.class));
  14.                 }
  15.             }

回复评论 (10)

楼主手势识别算法是自己写的么?还是沿用ST官方的?

声音处理的部分是如何实现的?期待进一步的展示和分享!
点赞  2017-3-1 14:37
这个有点意思!还是要会上位机呀!……
点赞  2017-3-1 15:19
本来是有个视频连接的,可是不知道怎么被吞了,链接地址:http://v.youku.com/v_show/id_XMjUzNDg0Njg5Ng==.html#paction
点赞  2017-3-1 18:45
引用: alberthink 发表于 2017-3-1 14:37
楼主手势识别算法是自己写的么?还是沿用ST官方的?

声音处理的部分是如何实现的?期待进一步的 ...

ST官方的感觉很好使,所以直接沿用了
声音处理的部分库函数提供了,直接调用即可
点赞  2017-3-1 18:46
这个创意很好,手机端你准备怎么做?
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-3-1 20:55
我手机有个“摇一摇”对其桌面图标功能
点赞  2017-3-1 21:37

8楼 nmg 

引用: 奥利晶 发表于 2017-3-1 18:45
本来是有个视频连接的,可是不知道怎么被吞了,链接地址:http://v.youku.com/v_show/id_XMjUzNDg0Njg5Ng==. ...

嵌入了,嵌入视频的时候,使用视频的flash地址 QQ截图20170302100457.jpg
点赞  2017-3-2 10:05
引用: littleshrimp 发表于 2017-3-1 20:55
这个创意很好,手机端你准备怎么做?

我没太明白问题的意思,视频里这样已经可以了吧。那么你是指的哪里怎么做?
点赞  2017-3-2 12:34
引用: 奥利晶 发表于 2017-3-2 12:34
我没太明白问题的意思,视频里这样已经可以了吧。那么你是指的哪里怎么做?

你不是要实现接电话、挂电话和放到嘴边通话功能么
看你的视频已经可以通过APP演示了
实际使用中如果你的手机电话铃响了怎么通过SensorTile控制手机接听呢?
可以接听以后,你的SensorTile发送的音频数据怎么能在对方的听筒里播放出来?
还有对方话筒里的声音怎么通过SensorTile播放,我想问的是这些问题
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-3-2 14:59
能否在手机上设计一个麦克风阵列,做到唤醒功能?
点赞  2017-8-14 14:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复