Java如何调用系统扬声器
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要介绍"Java如何调用系统扬声器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java如何调用系统扬声器"文章能帮助大家解决问题。实现方式接下来就
千家信息网最后更新 2025年11月08日Java如何调用系统扬声器实现方式
另述
这篇文章主要介绍"Java如何调用系统扬声器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java如何调用系统扬声器"文章能帮助大家解决问题。
实现方式
接下来就对这个小功能进行分析和实现。先写一个Demo。
1.首先,我们需要一个dll作为辅助。这里解释一下dll的含义(DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用百程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个度完整的可执行文件,它们被分割成一些相知对独立的动态链接库,即DLL文件,放置于道系统中。当我们执行某一个程序时,相应的版DLL文件就会被调用。一个应用程序可使用权多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件)。
需要把jacob-1.17-M2-x64.dll复制到C:WindowsSystem32目录下。我们也能看到目录下有很多的.dll文件。
这里的文件大家自己百度下,很好找的。
2.使用maven项目导入坐标。
net.sf.jacob-project jacob 1.14.3 3.测试类代码。
/** * 文字转语音测试 jdk bin文件中需要导入jacob-1.17-M2-x64.dll * 注意导包哈 * @date: 2020年2月25日 上午10:05:21 */public class Jacobtest { public static void main(String[] args) { textToSpeech("工作人员请注意,桌号8001顾客正在寻求帮助!!"); } /** * 语音转文字并播放 * * @param text */ public static void textToSpeech(String text) { ActiveXComponent ax = null; try { ax = new ActiveXComponent("Sapi.SpVoice"); // 运行时输出语音内容 Dispatch spVoice = ax.getObject(); // 音量 0-100 ax.setProperty("Volume", new Variant(100)); // 语音朗读速度 -10 到 +10 ax.setProperty("Rate", new Variant(0)); // 执行朗读 Dispatch.call(spVoice, "Speak", new Variant(text)); /* // 下面是构建文件流把生成语音文件 ax = new ActiveXComponent("Sapi.SpFileStream"); Dispatch spFileStream = ax.getObject(); ax = new ActiveXComponent("Sapi.SpAudioFormat"); Dispatch spAudioFormat = ax.getObject(); // 设置音频流格式 Dispatch.put(spAudioFormat, "Type", new Variant(22)); // 设置文件输出流格式 Dispatch.putRef(spFileStream, "Format", spAudioFormat); // 调用输出 文件流打开方法,创建一个.wav文件 Dispatch.call(spFileStream, "Open", new Variant("./text.wav"), new Variant(3), new Variant(true)); // 设置声音对象的音频输出流为输出文件对象 Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); // 设置音量 0到100 Dispatch.put(spVoice, "Volume", new Variant(100)); // 设置朗读速度 Dispatch.put(spVoice, "Rate", new Variant(-2)); // 开始朗读 Dispatch.call(spVoice, "Speak", new Variant(text)); // 关闭输出文件 Dispatch.call(spFileStream, "Close"); Dispatch.putRef(spVoice, "AudioOutputStream", null); spAudioFormat.safeRelease(); spFileStream.safeRelease();*/ spVoice.safeRelease(); ax.safeRelease(); } catch (Exception e) { e.printStackTrace(); } }}4.从测试类可以看出,这个方法既可以发声还能输出后缀为.wav的文件,这是一个标准的多媒体文件。上述代码注释很清晰,就不解释了,自己看哈。
5.测试成功,现在集成到自己的项目中。
另述
这里说到了调用扬声器发声,不放还可以想一下如何调用麦克风收音。
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关于"Java如何调用系统扬声器"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
文件
语音
输出
程序
扬声器
系统
应用
测试
声音
应用程序
方法
格式
知识
音频
不同
代码
内容
动态
对象
文字
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手机一直显示无法连接服务器
电脑网络安全科技馆设计
嘉定区管理软件开发
深圳商城软件开发哪家效益快
关于网络安全的评审
金融科技和工业互联网哪个好
许昌软件开发联系方式
电视台数据库播放
恒希互娱网络技术服务有限公司
高防服务器 香港服务器
旅游网络技术有限公司
家用服务器手机要网络嘛
数据库日期型
医美机构岗位网络安全责任制度
软件开发c语言为主
软件开发需规模板
网络安全法知识宣传普及
服务器的管理口和网口
网络安全运维支持中心
建材企业软件开发
网易虎牙服务器ip
网络安全跟踪
网络经营者应当制定网络安全
做兼职什么app软件开发
护苗网络安全课堂6
北京东玲软件开发有限公司
指挥中心网络安全事故
宁波软件开发薪酬
黑板网络技术有限公司
网络安全的股票有