在HR做的第四个外包项目-----智能止鼾枕头。
主要说明:由气垫组层的枕头直连设备,设备通过蓝牙协议连接手机APP,手机APP通过http请求连接服务器。
在用户睡觉时,设备通过录音,将数据传递给手机,手机再传递给服务器,服务器进 行解析是否是鼾声,然后将回调给手机,手机再发送指令给设备,设备来控制气垫高度达到止鼾的目的。
难点说明:如何判断是鼾声。以及拿到鼾声的分贝和频率。这个是在APP历史记录里由体现的。
解答:
如何判断是鼾声,这个问题在大学博士论文里也属于较为复杂的研究,本项目取巧,并没有进行判断是否是鼾声,而是直接对声音进行里解析
public class SoundDemo {
public static String getNowTime() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
/**
* 目前该demo,仅仅限于每桢数据为16位的wav格式的声音文件
* @param args
* @throws UnsupportedAudioFileException
* @throws IOException
*/
public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
//获得声音的输入流
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("E:\\1435.wav"));
//打印声音文件的声道数,每桢的位数,以及音频频率
printFormat(ais.getFormat());
byte[] buf = new byte[2];
int len;
int length=0;
int s=0;
while ((len = ais.read(buf)) != -1) {
//由于是16位的文件,正好2个byte[],而音频每秒的数据是44100个16位,
//也就是44100*2个byte[],所以当读完44100个的
//时候,正好意味着音频过里一秒,下面这块是打印出每秒的时间.
length++;
if(length%44100==0){
s++;
System.out.println(s+"秒");
}
//这块非常重要,但是位不明白这是怎么回事.
/*
* 首先buf[1]<8是指本文件由于是以little-endian 顺序存储数据,所以高位在后,低位在前,
* 就如同 54这个数字,存的时候是 45 ,我们计算时就是4+5*10^1,也可以让5左移动.
* 但为什么又"或"上低位,这个位就不知道了
*/
short a = (short) (((buf[1] << 8) | buf[0]) / 10);
/*
* 由于数值非常多,而且中间由很多垃圾数据和谐波,所以,就直接取接近波峰和波谷的值
*/
if (a > 1300) {
System.out.println(a);
}
if (a < -1300) {
System.out.println(a);
}
}
}
public static void printFormat(AudioFormat format) {
System.out.println(format.getEncoding() + " => " + format.getSampleRate() + " hz, "
+ format.getSampleSizeInBits() + " bit, " + format.getChannels() + " channel, " + format.getFrameRate()
+ " frames/second, " + format.getFrameSize() + " bytes/frame");
}
}
Console如下:
PCM_SIGNED => 44100.0 hz, 16 bit, 1 channel, 44100.0 frames/second, 2 bytes/frame
1秒
2秒
3秒
1308
1336
1316
-1455
-1733
-1837
-1679
-1712
-1531
-1549
-1682
-1711
-1711
-1663
-1553
-1404
1361
1436
1390
1332
1315
1385
1470
1467
4秒
5秒
6秒
1305
1310
-1399
-1526
1463
1545
1671
1854
1824
1793
1740
1753
1744
1487
1311
1439
1547
1639
1825
1799
1650
1598
1563
1493
1408
1343
-1327
7秒
8秒
9秒
1308
1316
1306
1308
10秒
11秒
12秒
13秒
14秒
15秒
-1379
-1790
-1654
-1524
-1356
-1686
-1866
-2010
-2268
-1809
-1432
1409
1799
1795
1826
1902
2008
2008
1869
1766
1721
1614
1442
1436
1520
1536
...
...
结论:
由于音频中有两次异常打鼾,排除这些,大概可以看出该鼾声音频的频率大约是3秒多,由于所定的阀值是1300,所以也遗漏了两次鼾声,总的来说还不错.