返回顶部
首页 > 资讯 > 后端开发 > Python >java 调用本地扬声器的步骤
  • 447
分享到

java 调用本地扬声器的步骤

2024-04-02 19:04:59 447人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录实现方式另述更新实现方式 接下来就对这个小功能进行分析和实现。先写一个Demo。 1.首先,我们需要一个dll作为辅助。这里解释一下dll的含义(DLL(Dynamic Lin

实现方式

接下来就对这个小功能进行分析和实现。先写一个Demo。

1.首先,我们需要一个dll作为辅助。这里解释一下dll的含义(DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用百程序拓展”,是软件文件类型。在windows中,许多应用程序并不是一个度完整的可执行文件,它们被分割成一些相知对独立的动态链接库,即DLL文件,放置于道系统中。当我们执行某一个程序时,相应的版DLL文件就会被调用。一个应用程序可使用权多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件)。

需要把jacob-1.17-M2-x64.dll复制到C:\Windows\System32\目录下。我们也能看到目录下有很多的.dll文件。

这里的文件大家自己百度下,很好找的。

2.使用Maven项目导入坐标。


<!-- https://mvnrepository.com/artifact/net.sf.jacob-project/jacob -->
<dependency>
	<groupId>net.sf.jacob-project</groupId>
	<artifactId>jacob</artifactId>
	<version>1.14.3</version>
</dependency>

3.测试类代码。



public class Jacobtest {


    public static void main(String[] args) {
        textToSpeech("工作人员请注意,桌号8001顾客正在寻求帮助!!");
    }

    
    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));

           
            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操作语音文件.wav先不要研究了 :laugh and cry:,这里涉及到了语音识别,但是有百度那么些api,有兴趣的试试吧!

好了,在这里就结束了

更新

博主把自己的毕设项目打包放到自己的服务器上,这个扬声器出现了新的问题。

本来所有的基础都是在本地运行的,通过调用本地dll文件实现扬声器发声,现在部署到Centos上将会失去这个dll的支持,目前所存在的问题是如何不使用dll文件实现这个功能,中间借助了.wav后缀的音视频文件。

如何在linux上生成.wav的文件。
如何获取这个文件并输出。(解释一下,用餐顾客点击手机网页的菜单,然后再餐厅的主机来播放这个声音)
如何在输出主机不进行任何操作就能播放这个声音或者能够恢复之前的工作状态。

现在的临时解决办法是本地跑一个呼叫服务的接口,当需要这个功能的时候远程服务器调用本地跑的接口,进而实现餐厅主机发声。

这个和上面描述的并无差别,不一样的是存在了两台主机的调用(当然两台主机都应该链接网络,能够互相通信)

先写到这了,当有解决办法的时候再更新吧!

以上就是java 调用本地扬声器的步骤的详细内容,更多关于java 调用本地扬声器的资料请关注编程网其它相关文章!

--结束END--

本文标题: java 调用本地扬声器的步骤

本文链接: https://lsjlt.com/news/125984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java 调用本地扬声器的步骤
    目录实现方式另述更新实现方式 接下来就对这个小功能进行分析和实现。先写一个Demo。 1.首先,我们需要一个dll作为辅助。这里解释一下dll的含义(DLL(Dynamic Lin...
    99+
    2024-04-02
  • 怎么在java中调用本地扬声器
    怎么在java中调用本地扬声器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.首先,我们需要一个dll作为辅助。这里解释一下dll的含义(DLL(Dynamic Link...
    99+
    2023-06-15
  • Java调用Zookeeper的实现步骤
    目录watch机制常用APIJAVA调用watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性。 Zookeeper所有的...
    99+
    2024-04-02
  • chatGPT本地部署、运行和接口调用的详细步骤
    目录从 github 下载环境配置conda 创建虚拟环境官方步骤配置环境安装 revChatGPT更改 config.json.example -> config.json将...
    99+
    2023-02-15
    chatGPT本地部署 chatGPT接口调用
  • 搭建本地云服务器的步骤
    1. 确定服务器需求 在搭建本地云服务器之前,首先需要确定你的服务器需求。考虑以下几个因素: - 预算:确定你的预算范围,以便选择适合的硬件和软件。 - 服务器规模:确定你需要的服务器规模,包括处理器、内存、存储空间等。 - 服务器用途:...
    99+
    2023-10-28
    步骤 服务器
  • Pyscript使用本地Pyodide配置步骤
    什么是pyscript pyscript由来自 Anaconda 的团队开发,包括 Peter Wang、Fabio Pliger 和 Philipp Rudiger,正如 Pete...
    99+
    2022-12-12
    Pyscript使用本地Pyodide配置 Pyscript本地Pyodide配置
  • iOS调用高德地图SDK的完整步骤
    目录准备工作:方法如下:其中申请key的方法如下:接下来就进入到项目内部的设置了:重要的点:总结准备工作: 安装CocoaPods使用下载第三方库相同的方法下载SDK 方法如下: (...
    99+
    2022-06-04
    ios 高德地图 sdk
  • java调用webservice的.asmx接口的使用步骤
    目录前言一、接口类型二、使用步骤1.访问方式2.导入的maven前言 接触到一个.asmx结尾的webservice接口,为了增加记忆决定记录下来。 一、接口类型 已.asmx结尾的...
    99+
    2024-04-02
  • oel7本地yum源的配置步骤
    这篇文章主要介绍“oel7本地yum源的配置步骤”,在日常操作中,相信很多人在oel7本地yum源的配置步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”oel7本地yum源的配置步骤”的疑惑有所帮助!接下来...
    99+
    2023-06-05
  • 云服务器挂载本地硬盘的步骤
    1. 确认云服务器支持本地硬盘挂载 在开始之前,你需要确保你的云服务器支持本地硬盘挂载。不同的云服务提供商可能有不同的规格和限制,所以在进行挂载之前,最好先查阅相关文档或咨询云服务提供商的技术支持。 2. 创建本地硬盘 在云服务提供商的管...
    99+
    2023-10-27
    步骤 本地硬盘 服务器
  • VUE项目调用高德地图的详细步骤
    目录前言申请高德key技术选型准备工作项目中应用刷新页面,地图加载偶尔失败在绑定插件的时候,控制台报错 a[d].split is not a function原生调用高德API混合...
    99+
    2024-04-02
  • python本地降级pip的方法步骤
    目录错误展示一、Pycharm降级二、下载本地pip包降级附:升级pip版本 总结错误展示 由于更新了最新的pip包导致安装出现ssl错误 WARNING: Retryin...
    99+
    2022-12-27
    Python降级 python本地降级pip python降级pip
  • Centos8搭建本地Web服务器的实现步骤
    1 概述 系统centos8,利用httpd搭建本地web服务器. 2 安装httpd sudo yum install -y httpd 3 启动服务 service httpd starvYwhkEt 4...
    99+
    2022-06-04
    Centos8搭建本地Web centos web服务器搭建
  • 使用Java调用Yolo模型的方法与步骤
    目录 一、Yolo模型简介 二、Java调用Yolo模型的方法 1. 安装OpenCV 2. 下载Yolo模型文件 3. 编写Java代码 三、Yolo模型的应用场景 1. 自动驾驶 2. 安防监控 3. 医疗诊断 4. 工业生产 四、总结...
    99+
    2023-08-31
    计算机视觉 深度学习 opencv
  • 实现AJAX异步调用和局部刷新的基本步骤
    目录引言1、创建XMLHttpRequest对象2、创建HTTP请求3、设置响应HTTP请求状态变化的函数4、设置获取服务器返回数据的语句5、发送HTTP请求6、局部更新7、完整的A...
    99+
    2024-04-02
  • Spring Cloud调用Ribbon的步骤
    目录一、简介1. 是什么2. 负载均衡2.1 集中式LB2.2 进程内LB二、实验1. RestTemplate1.1 加入到IOC容器1.2 RestTemplate 远程调用1....
    99+
    2024-04-02
  • Python调用jar包的步骤
    Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。在软件开发过程中,有时需要在 Python 项目中利用既有的 Java 代码,已达到节省时间和开发成本的目...
    99+
    2023-01-31
    步骤 Python jar
  • Win10调节音量大小在不降低扬声器音量的前提下
      有不少新用户上手Win10后,不知道如何调节音量大小。尤其是有的用户开启了系统声音,想在不降低扬声器音量的前提下降低系统声音的音量。该如何操作呢   操作方法   1.点击右下角音量图标,调节扬声器音量。   2....
    99+
    2023-06-13
    Win10 音量大小 音量 扬声器 大小 调节
  • 在maven中引入本地jar包的步骤
    目录1 起因 2 解决方案 2.1 在pom中引入 2.2 Spring Boot 打包处理 2.3 拓展: Spring Boot 打包加入其它资源 1 起因 在和一些第三方厂商...
    99+
    2024-04-02
  • maven配置本地仓库的方法步骤
    目录1、下载apache-maven-3.6.3-bin.zip2、配置环境变量3、测试4、配置本地仓库5、输入命令本文主要介绍了maven配置本地仓库,分享给大家,具体如下: 官网...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作