来源:Medium、大数据文摘
编译:陈之炎
作为一名新晋奶爸和程序员,我在新身份中最常思考的问题就是“照料婴儿的工作真的无法自动化吗?”
当然,这也许能够实现,就算有给孩子换尿布的机器人(假设有足够多的父母同意在自己蹒跚学步的孩子身上测试这样的设备),愿意自动化照料婴儿的父母还真为数不多。
作为父亲,我首先意识到的事情是:婴儿很多时候都会在哭,即使我在家,也不可能总是能听到孩子的哭声。
通常,商用婴儿监视器可以填补这一空白,它们充当对讲机,让你在另一个房间也能听到婴儿的哭声。
但我很快意识到:商用婴儿监视器没有我想象中的理想设备智能:
它们只能充当一个传声筒:把声音从源头带到扬声器,却无法发现孩子哭声的含义;
当家长要去到另一个房间里时,相应要把扬声器带到另一个房间,无法在任何其他现有的音频设备上播放声音;
扬声器通常是低功率扬声器,无法连接到外部扬声器-这意味着,如果我在另一个房间播放音乐,我可能会听不到孩子的哭声,即便监控器和我在同一个房间也无法听到;
大多数扬声器都是在低功率无线电波上工作的,这意味着如果婴儿在他/她的房间里,而你必须走到楼下,它们才能工作。
因此,我萌生了自制一个更好用的“智能婴儿监视器”的想法。
说干就干,我先给这个“智能婴儿监视器”定义了一些需要的功能。
它可以运行于价廉物美的树莓派(RaspberryPI)与USB麦克风。
当孩子开始/停止哭泣时,它应该检测到孩子的哭声,并通知我(理想情况下是在我的手机上),或者跟踪我仪表板上的数据点,或者运行相应的任务。它不应该是一个单纯的对讲器,简单地将声音从一个源传递到另一个兼容的设备。
它能够在扬声器,智能手机,电脑等设备上传输音频。
它不受源和扬声器之间距离的影响,无需在整个房子里将扬声器移来移去。
它还应该有一个摄像头,可以利用摄像头对孩子实时监控,当他一开始哭,我便可以抓拍到图片或婴儿床的短视频,以检查有什么不对劲。
来看看一个新晋奶爸如何使用工程师的大脑和开源工具来完成这项任务吧。
采集音频样本
首先,购买一块树莓派(RaspberryPi),在SD卡上烧录好Linux操作系统(建议使用RaspberryPI3或更高版本),运行Tensorflow模型。还可以购买一个与树莓派兼容的USB麦克风。
然后安装需要的相关项:
[sudo]apt-getinstallffmpeglamelibatlas-base-devalsa-utils[sudo]pip3installtensorflow
第一步,必须记录足够的音频样本,婴儿在什么时候哭,在什么时候不哭。稍后将利用这些样本来训练音频检测模型。
注意:在这个例子中,我将展示如何利用声音检测来识别婴儿的哭声,同样的精准程序可以用来检测任何其它类型的声音-只要它们足够长(例如:警报或邻居家的钻孔声)。
首先,查看音频输入设备:
arecord-l
在树莓派(RaspberryPI)上,得到以下输出(注意,有两个USB麦克风):
****ListofCAPTUREHardwareDevices****card1:Device[USBPnPSoundDevice],device0:USBAudio[USBAudio]Subdevices:0/1Subdevice#0:subdevice#0card2:Device_1[USBPnPSoundDevice],device0:USBAudio[USBAudio]Subdevices:0/1Subdevice#0:subdevice#0
我利用第二个麦克风来记录声音-即卡2,设备0。识别它的ALSA方法要么是hw:2,0(直接访问硬件设备),要么是plughw:2,0(如果需要的话,它会输入采样率和格式转换插件)。确保SD卡上有足够的空间,然后开始录制一些音频:
arecord-Dplughw:2,0-c1-fcd
lame-audio.mp3
和孩子在同一个房间里,记录几分钟或几个小时的音频-最好是长时间的沉默、婴儿哭声和其他与之无关的声音-,录音完成后按Ctrl-C。尽可能多的重复这个过程多次,在一天中的不同时刻或不同的日子里获取不同的音频样本。
标注音频示例
一旦有了足够的音频样本,就可以把它们复制到电脑上来训练模型了-可以使用SCP复制文件,也可以直接从SD卡上复制。
把它们都存储在相同目录下,例如:~/datasets/sound-detect/audio。另外,为每个示例音频文件创建一个新文件夹,它包含一个音频文件(名为audio.mp3)和一个标注文件(名为labels.json),利用它来标记音频文件中的负/正音频段,原始数据集的结构如下:
~/datasets/sound-detect/audio-sample_1-audio.mp3-labels.json-sample_2-audio.mp3-labels.json...
下面:标注录制的音频文件-如果它包含了孩子几个小时的哭声,可能会特别受虐。在你最喜欢的音频播放器或Audacity中打开每个数据集音频文件,并在每个示例目录中创建一个新的label.json文件。确定哭泣开始的确切时间和结束时间,并在labels.json中标注为time_string-label的关键值结构。例:
{00:00:negative,02:13:positive,04:57:negative,15:41:positive,18:24:negative}
在上面的例子中,00:00到02:12之间的所有音频段将被标记为负,02:13到04:56之间的所有音频段将被标记为正,以此类推。
生成数据集
对所有的音频示例标注完成之后,接下来是生成数据集,最后将它输入到Tensorflow模型中去。首先,创建了一个名为micmon的通用库和一组用于声音监视的实用工具。然后,开始安装:
gitclonegit
github.