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

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数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑白棋游戏水平(2)--pytorch剪裁

系统需求 Linux系统,并已安装git、gcc、g、cmake⼯具 下载源码 从github克隆Pytorch仓库 git clone --recursive https://github.com/pytorch/pytorch如果已经克隆过,则使⽤以下命令更新 git submodule sync git submodule update --init --recurs…

二维码图像去噪文献调研(1)--Real Image Denoising with Feature Attention

简介 (1) 论文(包括期刊和发表时间): Real Image Denoising with Feature Attention(ICCV 2019) (2) 论文链接: https://arxiv.org/pdf/1904.07396.pdf &…

idea gui插件_给 IDEA 换了酷炫的主题,研发小姐姐看到:feel so high。。。

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]IntelliJ IDEA介绍IDEA,全称 IntelliJ IDEA ,是 Java 语言的集成开发环境, IDEA 在业界被公认为是最好的 java 开发工具之一,尤其在智能 代码助手、代码自动提示、重构、 J2E…

华为荣耀电脑第三方linux,【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏如何?某东入手评测...

这款【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏轻薄笔记本电脑(酷睿i5 8G 512G MX250 IPS)冰河银,看网上评测推荐的,后面网上种草了这款笔记本,用过一段日子了,分享使用感受如下:一、【第三方Linux版】荣耀Ma…

二维码提升对比度文献调研(1)--Fast Image Processing with Fully-Convolutional Networks

简介 (1) 论文 (期刊和发表时间) Fast Image Processing with Fully-Convolutional Networks (ICCV 会议 2017) (2) 论文链接 https://openaccess.thecvf.com/content_iccv_2017/html/Chen_Fast_Image_Processing_ICCV_2017_paper.html (3) 源代码链接 …

linux下 c语言 用write open二进制写文件,Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作-Go语言中文社区...

一、前言在做一个镜头的初始化操作,需要加载一个648*522像素大小的文件,厂商提供的是一个excel表,如果要加载数据,可用加载txt文本的方式,我选用二进制方式加载文件;大家都知道电脑真正执行的不是高级语言&…

二维码提升对比度文献调研(2)--Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement

简介 论文 (期刊和发表时间) Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement (CVPR 会议 2020)论文链接 https://openaccess.thecvf.com/content_CVPR_2020/html/Guo_Zero-Reference_Deep_Curve_Estimation_for_Low-Light_Imag…

python打开是什么样子的图片_黑洞6问:黑洞内部是什么样子?黑洞图片发布,理论和实测的碰撞...

在科学领域,没有什么比你在第一次观察或实验结果中验证一个长期的理论预测时更令人兴奋的了。2012年,大型强子对撞机揭示了希格斯玻色子——标准模型中最后未发现的基本粒子的存在。 几年前,LIGO合作直接探测到了引力波,证实了对爱…

二维码提升对比度文献调研(3)--A Low-Complexity Algorithm for Contrast Enhancement of Digital Images

简介 (1)论文(包括期刊和发表时间):A Low-Complexity Algorithm for Contrast Enhancement of Digital Images (2)论文链接: http://www.mecs-press.net/ijigsp/ijigsp-v10-n2/IJIG…

安卓checkbox无响应_【安卓手机】无法连接电脑的解决方法

转自:广西南宁平衡信息技术有限公司,作者:平衡LivY一般在对手机的数据采集过程中,尤其是安卓手机,最令人头疼的就是手机接入电脑后无法识别。相信以下窗口是大家在做手机取证的时候最不想看到的。那么这里大伙就会有疑…

linux s删除第一行,Linux文本处理三驾马车之一sed

sed对"行"操作动作含义a :新增, a 接字串,而这些字串会在新的一行出现(目前的下一行)~sed 1a\llll llllllll \n lllllll t.txtnl /etc/passwd | sed 2a drink teased -i $a# This is a test regular_express.txt ####文…

二维码提升对比度文献调研(4)--Attention Guided Low-light Image Enhancement

简介 (1)论文2: Attention Guided Low-light Image Enhancement with a Large Scale Low-light Simulation Dataset (2)论文链接: https://arxiv.org/pdf/1908.00682v3.pdf (3)源代…

函数传参string_C/C++的三种函数传值方式及其区别

C/C函数传参方式我想很多朋友应该都知道,但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚。本文就给大家揭露一下各传参方式的区别。传参方式有这三种:值传递、引用传递、指针传递大家可以去看三种传递方式的写法的区别,关于写…

二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement

简介 (1)论文名称: DeepLPF: Deep Local Parametric Filters for Image Enhancement CVPR 2020 (2)论文链接: https://arxiv.org/abs/2003.13985 (3)源代码: https://gi…

c语言单选题大全,C语言单选题(五)

1.C语言结构体类型变量在程序执行期间(C)。A.部分成员驻留在内存中B.只有一个成员驻留在内存中C.所有成员一直驻留在内存中D.没有成员驻留在内存中2.当定义一个结构体变量时,系统分配给它的内存是(D)。A.结构中最后一个成员所需内存量B.结构中第一个成员所需内存量C…

java 匿名函数_Java 理论与实践,闭包之争

Java 语言是否应增加闭包以及如何添加?在跨越边界 系列最近的一篇文章中,我的朋友兼同事 Bruce Tate 以 Ruby 为例描述了闭包的强大功能。最近在安特卫普召开的 JavaPolis 会议上,听众人数最多的演讲是 Neal Gafter 的 “向 Java 语言增加闭包…

二维码识别中面临的主要问题

问题描述 下面有两个二维码的图片: 这两个二维码其实是一样的,也就是二维码码制在设计的时候,其实不需要那么大的黑点,只需要中心一小部分即可。 问题一:在优化二维码的过程中,能否考虑优化边缘部分&…

lia人是什么意思_69年属鸡人终身灾难是什么意思

69年属鸡人终身灾难是什么意思69年出生的生肖鸡,他们为人正直,有一颗转速飞快的脑袋,做事勤快,对生活非常乐观,但是因为过于自信总是做一些自己能力还不够的事,有句老话说的好“大难不死,必有后…

睡眠声音识别中的准确率问题(一)--问题描述及评价指标

1 问题描述 如何定义一个评价指标来评估睡眠声音识别中的准确率? 1.1 按照评分如何设计评价指标 睡眠声音识别预测的结果是一个概率分布,如下表所示: c1c_1c1​c2c_2c2​c3c_3c3​snortspeechcough0.50.20.70.550.450.77 在这种场景下&…

c51 嵌入汇编语言,在C51中嵌入汇编

在C51编程中,有时控制一些器件时,需要较强实时性,这时有必要在其中嵌入ASM语句,关于嵌入的方法众多,网上也可以找到相关说明,不过说得并不详细,这里结合本人调试18B20测温程序来说说如何在C中嵌…