简介
2021年7月13日,我和我的三个研究生一起拜访了玉米树,和王总等一起针对睡眠音频分割及识别问题进行了深入的讨论,达成了如下共识。
输入
由于保存整个晚上的睡眠音频所需要的存储空间过大,目前拟采用每隔30分钟(可自定义)录制一段睡眠音频,然后对这段音频进行分割及识别,并保存鼾声、梦话等片段。
选择30分钟作为时间片段,主要基于存储空间的考虑,下面对存储空间进行分析。
30分钟单通道、16位采样位数、采样频率44.1kHz音频的不压缩数据存储量计算方法如下:
每秒44100个采样点,44100 * 2=88200字节,30分钟:30 * 60 * 88200=158760000字节
158760000/1024/1024 约等于150MB。
输出
(1)一些睡眠事件的开始和结束时间,比如鼾声、梦话、翻身、咳嗽、打喷嚏、磨牙及其它;
- 开始和结束时间有两种方式来表示,第一种方式是以事件为基础(时间不定长),第二种方式是以固定时间段为基础(时间定长,用户设定),到底采用哪种方式需要进一步讨论;
- 如果采用以事件为基础,则涉及到音频片段合并策略;
(2)这些睡眠事件对应的标签分布。
方案
采用的方案包括音频分割及识别两个方面。
分割策略
策略一:对音频按等时长进行分割,如每隔4s(可自定义),然后对分割后的音频进行识别,如果是静默音,则不保存;
优点:计算资源要求较低;
缺点:容易漏测或者多测,预测精度较低。比如在第3s开始打鼾,预测时第一个窗口被认定为鼾声,这会导致0~4s都认为是鼾声。
策略二:采用滑动窗口进行分割,如窗口大小为4s(可自定义),步长为1s(也可自定义,一般要小于窗口长度),对每个窗口执行预测,若为目标检测事件,则记录开始时间与结束时间。
优点:这种策略分割的音频就会有重叠部分,可以更好的检测音频事件的开始位置;
缺点:音频重复参与运算,计算资源要求较高。
准备对两个策略进行对比实验后,再决定最终方案选择哪个策略。
识别方法
拟采用PANN框架(YouTube)进行识别,面临的问题有:
(1)睡眠声音识别后大致划分为鼾声、梦话、翻身、咳嗽、打喷嚏、磨牙、其它几个大类;
(2)在PANN框架中有527个音频类别,但没有翻身、梦话、磨牙等我们需要的类别。
(3)梦话的形式较多,可能包括尖叫、呻吟、普通说话声、嗡嗡声等复杂声音,不太确定能归为527个类别中哪些类。
(4)如何平滑连续音频的问题,我们认为连续音频之间具有某种关联性,如何刻画这种关联性呢?(可以作为研究生发表论文的方向)
拟采用如下方法来解决:
(1)音频获取:从网络上获取翻身、梦话、磨牙等音频,如freesound.org;如果网络上没有,则需要我们自己来录制这些音频;
(2)解决标签不匹配问题:基于获取到的翻身、梦话、磨牙等音频,利用PANN框架进行识别,看看该框架会给出什么标签,则将该标签作为翻身、梦话、磨牙对应的标签。
(3)连续音频的处理:一个10s的连续音频,首先得到每个1s音频的标签分布,然后对这10s进行一个标签分布的平均,最后根据这个平均值来进行综合判断(这个处理需要再讨论)。
平台兼容性
建议开发出适用于Android及IOS的版本。
Android版本目前进展及面临的问题
1、目前的进展:
可以使用PANN框架对分割后的音频片段进行识别,识别的类型为该框架提供的527个类别,还没有根据目前的需求识别出规定的类别;
2、下一步的工作:
(1)采集翻身、梦话、磨牙等类型的音频,进行识别,获得对应的标签类别;
(2)编写开发文档及Java代码,代码符合玉米树规范,采用面向对象,利于后期维护。
3、面临的问题:
使用android studio运行程序遇到卡壳问题,建议重新创建一个线程来运行。
IOS版本目前进展及面临的问题
1、目前进展:还没有开始。
2、可能会面临的问题:使用xcode运行IOS程序时,会遇到一些底层代码调用报错问题,重写会比较麻烦。
其它
PANNs模型需要wav文件必须是单通道,采样率为32kHz;而YAMNet模型需要wav文件也必须是单通道,采样率为16kHz。
时间及人员安排
实验部分
音频采集及测试:2周。(梁翔宇、樊俊)
分割策略实验:2周。(容斌元、李鹏程)
开发部分
提供一个接口,输入是音频文件,返回分割后的音频及标签分布。
(1)Android端代码开发及文档编写:4周。(梁翔宇、樊俊)
(2)IOS端代码开发及文档编写:4周。(容斌元、李鹏程)
参考文献
[1] PANN框架
[2] 玉米树程序编写规范