WAV文件格式介绍

WAV文件遵守资源交换文件格式之规则,在文件的前44(或46)字节放置标头(header),使播放器或编辑器能够简单掌握文件的基本信息,其内容以区块(chunk)为最小单位,每一区块长度为4字节,而区块之上则由子区块包裹,每一子区块长度不拘,但须在前头先宣告标签及长度(字节)。标头的前3个区块记录文件格式及长度;接着第一个子区块包含8个区块,记录声道数量、采样率等信息;接着第二个子区块才是真正的音频资料,长度则视音频长度而定。内容如下表所示。须注意的是,每个区块的端序不尽相同,而音频内容本身则是采用小端序。

Android端使用java对wav进行数据读取,具体实现参考AudioReader的readHead()方法代码细节。

Android端实现读取音频文件源码介绍

主要使用Java io库中的 InputStream 接口,实现读取文件的字节流信息。主要实现类为AudioReader类,工具类为Utils,项目代码结构如下所示:

PO包的文件说明如下:

  • AudioFragment为一个接口,存放0.975s音频文件的相关信息;
  • IAudioFragment 为AudioFragment实现的接口;
  • Score包含一个字符串(label)和一个浮点数(score),存放???;
  • AudioReader为读取wav文件信息、预测音频标签的实现类;
  • LabelsName存储着521个标签的字符串;
  • MyComparator主要实现对Score对象数组的排序;
  • Utils中包括几个常用的音频数据处理方法(工具类)。

IAudioFragment接口

该接口主要对功能进行初步定义。主要包含前N名的Score数组,以及实现是否在打鼾、咳嗽和打喷嚏。

public interface IAudioFragment { float start = 0; float end = 0; public Score[] scores = null; public abstract boolean isSnore(); public abstract boolean isCough(); public abstract boolean isSneeze(); public Score[] getScores(); public void setScores(Score[] scores);
}

AudioFragment实现类

对接口IAudioFragment进行实现,实现原理为:只保存前5的评分时,若Snore标签在前5中,则isSnore()返回true,否则返回false,其他方法同理。其中浮点数start和end表示该AudioFragment对象的起始与结束时间。例如:当你传入一段10s的音频进行预测时,会返回一个AudioFragment对象数组,其数组中第一个元素的起始时间为start = 0,结束时间为end = 0.975;第二个元素的起始时间为start =0.975,结束时间为end = 1.950(单位s)。
以下为部分核心代码:

float start = 0;
float end = 0;
Score[] scores = null;
Score scoreSnoring = null; // 打鼾 38
Score scoreCough = null; // 咳嗽 42
Score scoreSneeze = null; // 打喷嚏 44
······
@Override public boolean isSnore() { return isContain("Snore",scores);
}
@Override public boolean isCough() { return isContain("Cough",scores);
}

Score类

该对象只包含两个属性,将标签与评分绑定在一个对象中。

String label;
float score;

LabelsName类

主要存储521个标签的字符串数组,供其他类调用。

IAudioProcess接口

主要对音频的加载与处理功能的定义。

// 通过传入Android上下文环境,音频文件路径,获取该音频文件的输入流
public InputStream initInputStream(Context context, String fileName);
// 初始化Yamnet模型
public Yamnet initYamnetModel(Context context);
// 预测函数,该函数应该在传入音频文件后再调用,应该返回多个AudioFragment对象,AudioFragment对象中默认存储评分前5的标签
public AudioFragment[] predict();
// 同predict(),可以指存储评分中前topN个标签
public AudioFragment[] predict(int topN);
// 在初始化后使用,对目标fileName音频文件进预测,返回多个AudioFragment对象,AudioFragment对象中存储评分前topN的标签
public AudioFragment[] predictByAudioFile(String fileName,int topN);
// 预测0.975s音频数据的具体实现方法,Yamnet模型要求输入input为[-1,1]的长度为 15600的数组,经过预测得到评分结果,再与 start、end与topN一起用于构造一个 AudioFragment对象。
public AudioFragment predictOneSecond(Yamnet model, float[] input, float start, float end, int topN); // 0.975s

AudioReader类

主要对IAudioReader进行实现。其构造函数必须传入解析的文件名,以及上下文环境。以下为构造函数:

/**
* @param context Android Context
* @param fileName The target wav format file that needs to be predicted
* */
public AudioReader(Context context, String fileName){ this.context = context; this.fileName = fileName; initInputStream(context,fileName); getInstance(context);
}

在安卓活动中构建AudioReader对象并执行预测的示例如下:
(1)在初始化时直接指定文件并预测

AudioReader audioReader = new AudioReader(this,"demo.wav");
AudioFragment[] audioFragments = audioReader.predict(); // 默认只保存 前5评分

(2)在初始化时直接指定文件并预测前10个标签

AudioReader audioReader = new AudioReader(this,"demo.wav");
AudioFragment[] audioFragments = audioReader.predict(10);

(3)在初始化后改变预测文件

AudioReader audioReader = new AudioReader(this,"demo.wav");
// 预测other.wav中评分前10的标签
AudioFragment[] audioFragments = audioReader.predict("other.wav",10);

MyComprator类

主要对Score对象数组的排序,主要使用方法如下:

// resultScores 为Score对象数组,升序。在原有的resultScores上改变
Arrays.sort(resultScores, new MyComprator());

Utils类

主要完成重复性工作,例如Byte与int的转换、Byte与String的转换、Byte与int的转换,打印AudioFragment数组。

睡眠音频分割及识别问题(十一)--基于Android的YAMNet音频识别(总结)相关推荐

  1. android 人脸识别 方法研究,基于Android平台的人脸识别技术研究

    摘要: 在计算机视觉与模式识别领域中,人脸检测与识别技术是一个非常热门的研究课题,同时也具备非常广阔的商业价值.在诸多的目标检测算法中,基于AdaBoost算法的目标检测方法具有检测速度快,检测效果好 ...

  2. 基于Android系统的人脸识别签到软件

    项目名称:   基于Android系统的人脸识别签到软件 目  录 1 项目介绍..... 1 1.1 项目背景.... 1 1.2 产品特点.... 2 1.3 可行性分析.... 2 1.3.1 ...

  3. android智能识别技术,基于Android平台的OCR识别技术研究与实现

    摘要: 随着智能手机市场的迅猛发展和普及,Android成为所占市场份额最高的手机操作系统,与此同时,人们希望在手机终端享受更丰富舒适的应用功能.将OCR和Android智能终端相结合,依托光学字符识 ...

  4. python百度云ocr文字识别软件_基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  5. 【小样本实体识别】Few-NERD——基于N-way K-shot的实体识别数据集和方法介绍

    [小样本实体识别]Few-NERD--基于N-way K-shot的实体识别数据集和方法介绍 前记:   实体识别是信息抽取领域中比较重要的任务,其在学术界和工业界都是有很广泛的应用前景.但是当前实体 ...

  6. android人脸识别应用架构,基于Android平台人脸识别系统的设计与实现

    摘要: 伴随着社会信息化,自动化的发展,以及科技的进步,未来将是移动互联网的时 代,为适应移动互联网的发展智能化的小型移动终端将是未来的发展趋势.与此同时人们对信息的安全性要求不断的提高,高自动化和高 ...

  7. 基于Android端的照片比对系统,基于Android系统的人脸识别系统

    [文章摘要] 当前随着基于Android系统的移动终端设备的广泛应用,以及图像采集设备的普遍集成,使得Android系统的图像采集设备除了具有照相.摄像功能以外,正在扩展新的实用型功能.其中,利用An ...

  8. 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)

    1 结构体 此部分定义了两个结构体用于存储音频信息: AudioFragment:用于存储单个音频片段(0.975s, 16000Hz)的标签评分信息: AudioInfo:用于存储整个音频信息,包含 ...

  9. matlab车牌识别 复杂环境,基于MATLAB复杂背景车牌识别检测系统

    基于MATLAB复杂背景车牌识别检测系统 1.选题目的和意义 在复杂背景车牌识别检测系统中,由于拍摄时的光照条件.牌照的整洁程度的影响,和摄像机的焦距调整.镜头的光学畸变所产生的噪声都会不同程度地造成 ...

最新文章

  1. kafka-2.11-2.3.0版本配置文件参数详解_Kafka版本特性总结
  2. 如何获取文件的完整路径?
  3. 运行连接远程服务器失败,应用技巧:如何应付远程控制服务器失败
  4. 策略模式-Java实现
  5. 训练史上最佳GAN用了512块TPU,一作自述:这不是算法进步,是算力进步
  6. 计算机图形直线分析,基本图形分析法:等腰三角形(一)
  7. 通过镜像快速搭建本地yum源
  8. 使用migration创建表时,出错的解决方法
  9. Linux kernel tick发起调度软中断函数调用图
  10. android 车牌识别 开源,在android上的车牌识别
  11. au计算机内录音乐,电脑中如何使用 Audition 内录声音
  12. 微信小程序如何实现登陆功能
  13. 如何修改计算机网络密码,无线网密码怎么改,教您如何修改无线网络密码
  14. Python输出 计算器 !
  15. AutoCAD 2019 常用命令速查手册
  16. ssd测试软件和实际 速度,固态硬盘实际速度比拼_三星 300E5K-Y05_笔记本评测-中关村在线...
  17. 添加单词linux,为 Ubuntu 的 vim 添加英文字典
  18. 华盛顿大学计算机专业硕士申请,华盛顿大学计算机科学与系统理学硕士研究生申请要求及申请材料要求清单...
  19. 智能卡 ISO14443 协议 解读
  20. 自制APP连接OneNET---实现数据监控和下发控制(HTTP)

热门文章

  1. 男人女人小孩共32人c语言,C编程核心要点,你确信你会C语言?看完之后,男人沉默,女人流泪...
  2. 砥志研思SVM(三) 最优间隔分类器问题(下):软间隔SVM
  3. 软件工程练习:模块化,单元测试,回归测试,TDD
  4. pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库
  5. gin 怎么通过 post 发送结构体_Go Web 框架 Gin 实践12—优化配置结构及实现图片上传...
  6. c++ 二维数组 排序_漫画:“排序算法” 大总结
  7. python信息管理系统实战_最新python入门+进阶+实战课堂教学管理系统开发全套完整版...
  8. animate动画案例_animate动画案例——小小购物狂
  9. 宋浩 概率统计 笔记_推论统计分析学习笔记
  10. Java环境的正确配置你会了吗?