最近在研究语音识别,使用百度的sdk。发现只有识别的部分,而我需要保存音频文件,并且实现当有声音传入时自动生成音频文件。

先上代码:

public class EngineeCore {

String filePath = "E:\\voice\\voice_cache.wav";

AudioFormat audioFormat;

TargetDataLine targetDataLine;

boolean flag = true;

private void stopRecognize() {

flag = false;

targetDataLine.stop();

targetDataLine.close();

}private AudioFormat getAudioFormat() {

float sampleRate = 16000;

// 8000,11025,16000,22050,44100

int sampleSizeInBits = 16;

// 8,16

int channels = 1;

// 1,2

boolean signed = true;

// true,false

boolean bigEndian = false;

// true,false

return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);

}// end getAudioFormat

private void startRecognize() {

try {

// 获得指定的音频格式

audioFormat = getAudioFormat();

DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, audioFormat);

targetDataLine = (TargetDataLine) AudioSystem.getLine(dataLineInfo);

// Create a thread to capture the microphone

// data into an audio file and start the

// thread running. It will run until the

// Stop button is clicked. This method

// will return after starting the thread.

flag = true;

new CaptureThread().start();

} catch (Exception e) {

e.printStackTrace();

} // end catch

}// end captureAudio method

class CaptureThread extends Thread {

public void run() {

AudioFileFormat.Type fileType = null;

File audioFile = new File(filePath);

fileType = AudioFileFormat.Type.WAVE;

//声音录入的权值

int weight = 2;

//判断是否停止的计数

int downSum = 0;

ByteArrayInputStream bais = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

AudioInputStream ais = null;

try {

targetDataLine.open(audioFormat);

targetDataLine.start();

byte[] fragment = new byte[1024];

ais = new AudioInputStream(targetDataLine);

while (flag) {

targetDataLine.read(fragment, 0, fragment.length);

//当数组末位大于weight时开始存储字节(有声音传入),一旦开始不再需要判断末位

if (Math.abs(fragment[fragment.length-1]) > weight || baos.size() > 0) {

baos.write(fragment);

System.out.println("守卫:"+fragment[0]+",末尾:"+fragment[fragment.length-1]+",lenght"+fragment.length);

//判断语音是否停止

if(Math.abs(fragment[fragment.length-1])<=weight){

downSum++;

}else{

System.out.println("重置奇数");

downSum=0;

}               //计数超过20说明此段时间没有声音传入(值也可更改)

if(downSum>20){

System.out.println("停止录入");

break;

}

}

}

//取得录音输入流

audioFormat = getAudioFormat();

byte audioData[] = baos.toByteArray();

bais = new ByteArrayInputStream(audioData);

ais = new AudioInputStream(bais, audioFormat, audioData.length / audioFormat.getFrameSize());

//定义最终保存的文件名

System.out.println("开始生成语音文件");

AudioSystem.write(ais, AudioFileFormat.Type.WAVE, audioFile);

downSum = 0;

stopRecognize();

} catch (Exception e) {

e.printStackTrace();

} finally {

//关闭流

try {

ais.close();

bais.close();

baos.reset();

} catch (IOException e) {

e.printStackTrace();

}

}

}// end run

}// end inner class CaptureThread

接下来测试

public static void main(String args[]) {

EngineeCore engineeCore = new EngineeCore();

engineeCore.startRecognize();

}

当有较高的声音传入麦克风时,targetDataLine读取的字节数组首位或末位绝对值会变大(位置取决于音频格式中的一些参数,如bigEndian)。传入音量低,绝对值会变小

录音开始。从targetDataLine中读取的音频数据被保存在ByteArrayOutputStream中。一段时间音量一直低于权值时,认为无声音传入,结束录音。从ByteArrayOutputStream取出字节数组,

转为音频保存在本地文件中。

注意:

从targetDataLine读取的字节数组不能直接用于百度等语音识别,需要先转为音频文件,然后读取音频文件生成的字节数组,才可用于语音识别。

以上就是Java 实现麦克风自动录音的详细内容,更多关于Java 麦克风自动录音的资料请关注脚本之家其它相关文章!

java 通话录音_Java 实现麦克风自动录音相关推荐

  1. java 调用麦克风录音_Java 实现麦克风自动录音

    最近在研究语音识别,使用百度的sdk.发现只有识别的部分,而我需要保存音频文件,并且实现当有声音传入时自动生成音频文件. 先上代码: public class EngineeCore { String ...

  2. java 网页 录音_Java+FlashWavRecorder实现网页录音并上传

    [注意] [前言] 肯定有需求要网页录音,并且要上传.这奇葩需求. 然后找到了FlashWavRecorder, [原始版本号] 1.下载 在上面的地址下载zip解压之后,目录里面有个index.ht ...

  3. h5打开麦克风权限录音_h5打开麦克风权限录音_通过H5实现html页面的录音和播放 (Recorder用于html5录音)......

    varrec;/**调用open打开录音请求好录音权限**/ var recOpen=function(success){//一般在显示出录音按钮或相关的录音界面时进行此方法调用,后面用户点击开始录音 ...

  4. java实现麦克风自动录音

    最近在研究语音识别,使用百度的sdk.发现只有识别的部分,而我需要保存音频文件,并且实现当有声音传入时自动生成音频文件. 先上代码: public class EngineeCore {String ...

  5. h5打开麦克风权限录音_h5打开麦克风权限录音_原来电脑上自带录音功能,很多人还不知道,真的太实用了......

    众所周知,我们的手机上一般都会带有录音功能,那么如果你使用的是电脑,想要在电脑上录音该怎么办呢?下面就来教你两种方法. 一.系统自带录音 1.这里就以Win10系统为例,首先按下组合键[Win+S], ...

  6. 如何恢复录音删除的录音文件_电脑录音软件如何定时自动录音

    01最近小编有很多朋友都在咨询关于定时录音的问题,我想他们可能也是看中了本人的才华和美貌,所以才来咨询鄙人.所以,我一定不负众望,好好的教大家如何实现这个问题!02据我所知(鄙人才疏学浅),手机上估计 ...

  7. java 输入提示_Java实现输入自动提示与补全功能

    一. 场景与目标 在使用 IDE 开发软件时, IDE 会提供一种"智能提示", 根据所输入的字符列出可能的词组: 在日常Web开发中,根据用户输入进行自动提示和补全,也能很好地改 ...

  8. java jtextarea 滚动条_Java Swing JTextArea自动添加滚动条

    项目需要,现学一下. 默认没有WindowsBuilder Edit插件,需要从网上下一个:http://download.eclipse.org/windowbuilder/WB/integrati ...

  9. java补空格_JAVA STRING 对象自动补齐空格

    之所以补空格因为 该长度不一的时候 有时候会导致 ORACLE数据库的子SQL 变得很多多. 导致非常慢. ORACLE 11G 11.2.01 打补丁风险太大 只好补空格让其一直. 注意采用的字节长 ...

  10. c++ 实现录音并且指定到文件_通话自动录音,留下美好回忆,记录完整录音证据...

    手机通话,如果自动录音多好,许多人与我一样抱有这个想法. 记得华为Android版本5.0时代,手机没有自动录音功能,我一直到网上下载自动通话录音软件,有时甚至是下载ROOT版的带自动通话功能的EMU ...

最新文章

  1. python数据分析第三方库是_python数据分析复盘——数据分析相关库之Pandas
  2. linux web服务器系统优化,Ubuntu WEB服务器参数优化
  3. 使用 RMAN 同步数据库
  4. 《.NET Core 和前后端那些事儿》技术交流活动纪实
  5. 查看mysql主从复制是否成功的命令_mysql主从复制 - hong查理的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. c# 前导0_C#| 用前导零填充整数
  7. 浏览器解析JavaScript的原理
  8. 单页面响应式模板:黑石
  9. linux运维中的中间件,linux中间件Nginx的安装过程
  10. Windows 10某个网络端口被占用怎么办?
  11. pytest执行时,报report.html错误
  12. python图片压缩算法_Python实现奇异值分解(SVD)压缩图片
  13. python接口自动化学习笔记1
  14. 了解贝尔曼·福特算法
  15. 《实用C++》第10课:if 语句实现关系运算
  16. 如何利用云服务器搭建个人网站
  17. android 字体加下划线,如何在Android TextView中将字体样式设置为粗体,斜体和下划线?...
  18. 计算机英语读音在线,365英语之128.计算机
  19. 软件测试个人成长情况 能力 心理心态,提高软件测试团队能力和个人能力之浅见...
  20. json对象和字符串相互转换

热门文章

  1. VS2017调用Matlab2016b进行绘图
  2. 联想拯救者wif开不了_联想拯救者wifi开关
  3. MySql安装 Staring the server出错
  4. Java //PP2.11 编写一个程序,提示输入一个代表总钱数的双精度值,然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数(假设10美元纸币为所需要的最大面额)。例如,如果输入的值为47.63
  5. Spring Boot(二):外部配置文件(超级详细)
  6. (数位dp) 算法竞赛入门到进阶 书本题集
  7. macos安装盘第三方工具制作_如何制作macOS High Sierra USB启动安装盘
  8. 别再用mybatis了,mybatis-plus 这个神级工具一发入魂
  9. 2010年3月份中国物流与采购联合会发布中国制造业采购经理指数为55.1%
  10. Linux下配置DNS服务器