产品经理
4/18 9:00
做个需求,监听一下用户今天说过哪些关键词(商品),等它打开App的时候精准推送给它,三天上线可以吧?
4/18 9:01
。。。。。。
开发
你
4/21 9:00
为什么我每次刚说完要买什么东西,再打开购物软件时,首页总是会无比惊悚的来一个精准推荐呢?它们肯定偷听了!
4/21 9:01
嘘,少胡说八道。
读书人的事,那能叫偷嘛。
产品经理
哼,早晚抓它们进去陪张三!
每当跟朋友聊天说到什么商品后,再次打开某条某宝就会看到一些精准的推荐,好像App“听”到了我们的谈话一样,相信很多小伙伴都感同身受。
到底App有没有悄悄地监听呢?
洗白开始
心理学中有一种叫做"孕妇效应”,就是当人怀孕了就更容易发现孕妇,你开了奔驰就更容易看到奔驰,你拎个LV就发现满大街都是LV。
其实App首页每天都有包包,你今天恰巧跟同事说到要买,回去再打开某宝发现居然真的给你推荐了包包?
好像也像那么回事。
继续诡辩
首先,想要录音App总得有录音权限吧,你来教我在哪里申请权限?
第二,录音得到的数据是离线处理还是传到后台处理呢,就算以低码率录音,每天也要产生至少1个G的录音数据。
第三,用户群体中不说普通话的用户比例有多少,目前语音识别率在我们日常对话的场景里还不够,更别说方言了。
第四,对于每天都在进化的国产系统,长时间使用录音接口,最新的MIUI是会弹窗提示的,弹窗点进去还可以一键关闭当前App的录音权限,不要小看了这些厂商的安全能力。
第五,大多数公司都有自建的基于用户习惯等维度的推荐系统,有着完备的用户画像,你非要这么玩,事情败露了你担得起吗!
真没问题?
在当今移动互联网环境下,想要证实或者证伪都很有难度,所以只能希望大家相信大厂,相信科技向善,相信王欣,相信......除非找到了代码实锤。
实现原理
不管大厂有没有做,我们仍然对此好奇从技术上能否实现这一操作,让我们来看一下可行的方案。
方法A
App借助比如发送语音、语音搜索、语音输入等功能获取到录音权限,之后就在后台间歇性启动录音,并识别其中的关键词,推荐系统获取到关键词之后就可以进行精准推荐了。
由于App申请权限只有第一次会弹框给用户确认, 所以获取权限之后可以随意启动录音。
当然,也可以App启动时申请录音权限,不同意就退出应用,呵呵,真想打死你。
方法B
大数据背景下的数据共享。
App不去主动监听用户的谈话内容,可以向已经窃听到相关数据的厂商付费购买,App之间共享数据在技术上是很成熟的,那么手机里只要有一款App获取到敏感数据,你的隐私将不复存在。
说的好听是"数据共享",实际上不就是出售用户数据嘛,做的那么过分,真当黑哥不接单的?
欢迎大家把怀疑的App发在评论区~
我先来,XX输入法
方法C
加速度传感器窃听。
“加速度传感器是目前智能手机中最常见的一种嵌入式传感器,它主要用于探测手机本身的移动,常见的应用场景包括移动检测,步数统计和游戏控制等。”
由于声音信号是一种由震动产生的可以通过气态,液态,固态的各类介质进行传播的声波,而手机扬声器发出的声音会作用在手机上引起震动,这种震动可以被手机上的加速度传感器灵敏的捕捉到,因此可以通过加速度传感器的数据提取出关键字信息。
这并非耸人听闻,由浙江大学、麦吉尔大学、多伦多大学团队共同发表了有关加速度传感器窃听的成果(https://dwz.cn/dgkygjzH),经过测试,关键词的识别准确率达到了90%。
更加可怕的是在现行法律下,采集智能设备传感器数据这一行为并不违法,这也就意味着这种窃听方式目前还处于法律的灰色地带。而且在智能手机上获取传感器数据对于用户来说是无感知的,无需用户确认便可以获取相关权限。
实践
接下来,我们将就方法A搭建项目并实现,项目源码会放在结尾处。
使用到的技术
本次实践使用PermissionAnywhere进行录音权限的申请(请参考《如何优雅地申请Android运行时权限》),百度语音识别sdk完成录音转文字,使用Blob云数据库实现数据上传云端。
权限
使用PermissionAnywhere申请录音权限
(https://github.com/mingyuers/PermissionAnywhere)
代码语言:javascript复制PermissionAnywhere.requestPermission(this, new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionCallback() {
@Override
public void onComplete(List<String> grantedPermissions, List<String> deniedPermissions, List<String> alwaysDeniedPermissions) {
if (grantedPermissions != null) {
//开始录音
start();
}
}
});
(左右滑动查看全部代码)
录音及识别
使用百度语音识别的sdk,将录音转化为文字。
代码语言:javascript复制private void start() {
asr = EventManagerFactory.create(context, "asr");
Map<String, Object> params = new LinkedHashMap<String, Object>();
String event = SpeechConstant.ASR_START;
params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);
params.put(SpeechConstant.PID, 1537); // 中文输入法模型,有逗号
String json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
asr.send(event, json, null, 0, 0);
}
(左右滑动查看全部代码)
上传
上传阶段我们使用了Bmob的sdk,直接将录音得到的数据上传到云数据库。
代码语言:javascript复制public void upload(String str) {
RecordBean recordBean = new RecordBean("q8", str);
recordBean.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
Log.d(TAG, "done: " s);
}
});
}
(左右滑动查看全部代码)
效果
我们可以看到,申请到手机录音权限后,将手机放在一旁,只要我们在说话,App就会录音并识别出来,也可以按需求提取其中的关键字,识别率还是不错的。
代码下载地址
以上完整代码已开源到:
github[https://github.com/mingyuers/FuckRecord]
先说好,仅供大家研究学习。<手动狗头>