千家信息网

Java如何调用系统扬声器

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Java如何调用系统扬声器"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Java如何调用系统扬声器"文章能帮助大家解决问题。实现方式接下来就
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 上海卓越科技互联网 互联网科技工作委员会毛军 深圳科技互联网 中国互联网科技发展 壕鑫互联网络科技 上海亿帐通互联网科技 哈尔滨秒房互联网科技有限公司 须眉科技是互联网公司吗 互联网教育科技公司vipkid 字节跳动和互联网科技 团飞科技与伯堂互联网服务平台 佳云科技和互联网广告 受益于互联网科技的高速发展 国大互联网教育科技有限公司工作 长沙互联网科技 群盈汇互联网科技有限公司 雨阳互联网卡科技有限公司 新氧科技和美国互联网有关系吗 艺电能源互联网科技有限公司招聘 小牛互联网科技有限公司地址 广州为想互联网科技有限公司 互联网科技视频 衡水科技产业互联网平台 开启互联网科技时代小说 华中科技大学互联网的牛人 智帮互联网科技公司最近动向 互联网领先科技宣传片 互联网科技新闻 银川新华互联网科技学校是国营吗 前海云享互联网科技
0