声音检测

随着人工智能的发展,机器视觉,机器可视化也变的越来越完善,但是声音这块分析资料却比较少,有时候需要去检测一段视频或者音频中是否有声音。在某些场景中需要判断有声音则抓拍录制,当然这里只是先初步检测声音响度,如果还需要更高深的检测比如有人说话,也有其他嘈杂声音,我们如何去区分是人在说话,还是车开过,还是噪音,这个以后再讲。

可用于流媒体视频中实时检测,也可以用于离线文件检测,根据自己的需求,调节soundThreshold阈值,一般情况-65 db 为安静状态。

演示:

话不多说,直接上代码:

package com.zj.example;import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;import com.zj.filter.DetectSoundFilter;/*** 识别音频中是否有声音* @author ZJ**/
public class TestDetectQuiet {public static void main(String[] args) throws UnsupportedAudioFileException, IOException {loadFile("./data/安静.wav");
//      loadFile("./data/有声.wav");}/*** 读取文件*/public static void loadFile(String path) throws UnsupportedAudioFileException, IOException {File f = new File(path);AudioInputStream audioStream = AudioSystem.getAudioInputStream(f);readData(audioStream);}/*** 读取数据* @throws IOException */public static void readData(AudioInputStream audioStream) throws IOException {byte[] frame = new byte[2048];DetectSoundFilter soundFilter = new DetectSoundFilter();while (true) {int read = audioStream.read(frame);if (read < 0) {break;}double[] byteToDouble = byteToDouble(frame);boolean silence = soundFilter.isSilence(byteToDouble);if(silence) {System.out.println("这是安静的");} else {System.out.println("这是有声音的");}}}/*** pcm转成浮点* @param data* @return*/public static double[] byteToDouble(byte[] data) {ByteBuffer buf = ByteBuffer.wrap(data);buf.order(ByteOrder.BIG_ENDIAN);int i = 0;double[] dData = new double[data.length / 2];while (buf.remaining() > 1) {short s = buf.getShort();dData[i] = (double) s / 32767.0; // real++i;}return dData;}}

检测声音核心部分:

package com.zj.filter;/*** 识别声音过滤器* 用于判断有没有声音,甚至可以判断声音的响度* * @author ZJ**/
public class DetectSoundFilter {/*** 声音响度阈值*/public double soundThreshold = -60; // db/*** 是否安静* @param buffer* @param soundThreshold* @return*/public boolean isSilence(final double[] buffer) {double currentSPL = soundPressureLevel(buffer);System.out.println(currentSPL);return currentSPL < soundThreshold;}/*** 声压计算* @param buffer* @return*/private double soundPressureLevel(final double[] buffer) {double value = Math.pow(localEnergy(buffer), 0.5);value = value / buffer.length;return linearToDecibel(value);}/*** 线性转换为dB值* @param value* @return*/private double linearToDecibel(final double value) {return 20.0 * Math.log10(value);}/*** 音频帧去负数* @param buffer* @return*/private double localEnergy(final double[] buffer) {double power = 0.0D;for (double element : buffer) {power += element * element;}return power;}
}

demo里只是来检测某一帧,实际应用中可能需求不一样,可以自行修改,比如一段时间内都是安静的话,否则不认为是安静。

gitee地址

至此简单的声音响度识别功能实现了。

java数字音频最强教程

如果觉得可以,请随手点赞,Thanks♪(・ω・)ノ

java数字音频最强教程之如何检测一段音频中是否有声音相关推荐

  1. java数字音频最强教程之音频的王者之路(音频发烧友篇)

    讲一下音频,其实是一门"玄学",有的人喜欢听震撼低音,有的喜欢通透人声,想要做出一款牛逼的"发烧"音乐播放器不仅需要程序员,还要程序员懂音频.从我慢慢接触音响后 ...

  2. java数字音频最强教程之去除人声

    怎么去除人声,先来谈谈原理,在这个直播火热的时代,扬声器依旧常用的立体声双声道,再外加一个麦克风录音,一个麦克风录入的声音会均匀的分散在两个声道中,举个例子,现在有一串立体声双声道的pcm数据,那么假 ...

  3. 【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系

    大家好,欢迎来到停止重构的频道. 上期我们讨论了视频的相关概念,本期我们讨论音频的相关概念. 包括采样率.码率.单双声道.音频帧.编码格式等概念. 这里先抛出一个关于无损音频的问题. 为什么48KHz ...

  4. XLR接头(卡农头)数字音频线制作教程

    XLR接头(卡农头)数字音频线制作教程 XLR接头音频线介绍 XLR接头,也称卡农头,是由英文cannon音译过来,卡农头接的是平衡信号,此插头为一种音频插头. 通常用于手持式麦克风和舞台使用的环绕声 ...

  5. 太恐怖了 两天搞定一个项目 Java Web MVC 网络商城教程+源代码

    两天搞定一个项目 Java Web MVC 网络商城教程+源代码 最近自学做了一个网络商城将以下是代码和教程 环境搭建–数据库设计–页面设计-后台设计 本项目使用的jdk版本是 运行项目前需要先配置好 ...

  6. 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)...

    前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...

  7. java求职攻略_2020年求职攻略 《Java面试连成诀》教程免费分享

    原标题:2020年求职攻略 <Java面试连成诀>教程免费分享 IT行业薪资高.就业好.发展前景广阔,而面试是我们打开事业大门的第一关.技术的革新以及IT从业者增多加大了市场竞争,面试中问 ...

  8. 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程...

    在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1  哪些知识点 ...

  9. java web轻量级开发面试教程内容精粹:哪些简历得不到面试机会

    看到一本较好的实践性比较强的书,java web轻量级开发面试教程,里面的一些内容很有实践意义. 问题点 很难获得面试机会的原因 学历不符,比如要求是本科以上,但学历是大专 学历是硬指标,所以达不到学 ...

最新文章

  1. 清理C盘无用的垃圾的文件,给c盘瘦身
  2. 42翻转单词顺序列+注意该题找单词的方法
  3. 互联网1分钟 | 0117 IBM入驻上海张江人工智能岛;IoT业务将成为小米新支撑点
  4. Python爬虫开发:ip代理的使用
  5. 数据挖掘竞赛-员工离职预测训练赛
  6. async,await执行流看不懂?看完这篇以后再也不会了
  7. https加密过程(详细)
  8. mysql数据库管理指导_mysql学习笔记一(数据库管理控制)
  9. bci测试如何整改_基于fNIRS技术的脑机接口(BCI)
  10. jfinal mysql存储过程_jfinal调用mysql存储过程
  11. ubuntu安装软件
  12. 理解用户模式(User Mode)和内核模式(Kernel Mode)
  13. 问题二十七:ray traing中的positionable camera
  14. javascript中常用的对象创建方式有哪些?
  15. Fiji-imageJ 无法打开
  16. 八爪鱼采集器使用方法
  17. 计算机仿真实验之一 霍尔效应测磁场,2004_01大学物理实验教程_11539522.pdf
  18. Unity 3D学习之雷霆战机(一)
  19. c语言ftell的作用,C语言的文件随机访问fseek()和ftell()函数
  20. 【收集表】欢迎各位来填写查看调查表-安卓手机安装运行谷歌三件套、googleplay调查收集表,便于大家选择收集安装框架及软件...

热门文章

  1. LSB文本水印的嵌入与提取
  2. 机器学习复习:线性回归1
  3. 银河麒麟桌面操作系统V10日常使用说明
  4. 错过等一年丨2022全球边缘计算大会深圳站参会指南来啦!
  5. mastercam2020后处理_[后处理]Mastercam 四轴Fanuc系统MP9G后处理
  6. IE浏览器无法启动或者点击无响应的解决办法
  7. 【Tensorflow】mnist_with_summaries.py报错
  8. lisp画弯箭头_在CAD中直接画箭头的命令的一个方法
  9. 【ACWing】1176. 消息的传递
  10. css网页边框样式代码,css3边框样式(示例代码)