Java如何调用系统扬声器
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要介绍"Java如何调用系统扬声器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java如何调用系统扬声器"文章能帮助大家解决问题。实现方式接下来就
千家信息网最后更新 2025年01月21日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安全错误
数据库的锁怎样保障安全
18种网络安全协议
软件开发电脑价格
齐鑫共创网络技术有限公司
威海网络安全110报警
网络安全的核心思想
现代数据库技术实验指导书
app软件开发定制
软件开发费怎么做会计分录
东芝电梯软件开发
网络安全指数如何检测
海康v4200数据库考勤记录
人员导流数据库是干嘛的
宜良第三方软件开发价格实惠
数据库为什么两阶段锁
学生服务器
网络安全支队六大队
不得不知的互联网金融黑科技
网安大队 民营企业网络安全
滴滴上饶 软件开发
服务器截流记录
自学软件开发可以就业吗
服务器系统修复补丁
医院购服务器申请报告
形色软件开发者
能源网络安全培训
山东池和网络技术有限公司
海草科技互联网科技有限公司
win7音乐服务器
蔬菜批发招商管理系统软件开发
个人软件开发工具