【文本 >>> 语音】⭐️SpringBoot 结合 jacob 简单实现一个文本朗读功能

news2024/11/13 9:01:40

目录

🍸前言

🍻一、环境准备

🍺二、依赖引入    

💞️三、简单启动

🍹四、接口改造

        4.1  封装为一个工具类

        4.2 暴露一个接口

        4.3 测试

🌱五、扩展


🍸前言

        小伙伴们大家好,上次分享了一位读者使用国际化上下文 i18n 技术时遇到的兼容问题,也是成功帮他解决了问题,自己同时也学到这种使用方式;这次先放一放常用技术的学习,来看一个小工具,文本转语音,用 java 实现

🍻一、环境准备

        一台语音功能没问题的设备(因为要借用机器的语音设备)

        本地创建一个可以运行的 SpringBoot 项目,另外准备一个接口模拟工具即可

🍺二、依赖引入    

  jacob 是一个 Java COM (Component Object Model) 接口库,利用了 COM 接口来调用 Windows 的语音合成(TTS)服务,可以访问 Windows 的 Speech API 或者类似的语音合成工具,用于将文本转换为语音。

        在项目的 pom.xml 文件中添加以下依赖,刷新 maven 触发自动下载

<dependency>
    <groupId>com.hynnet</groupId>
    <artifactId>jacob</artifactId>
    <version>1.18</version>
</dependency>

注:首次启动的时候可能会遇到如下报错

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jacob-1.18-x64 in java.library.path

         只需要手动下载解压后将文件放入到 JDK 的 bin 目录下即可

Release Release 1.18 · freemansoft/jacob-project · GitHub

         查看自己 JDK 安装位置的命令如下:

💞️三、简单启动

        使用语音功能的主要代码如下:

        有四个参数,第一个参数是控制生成的 .mps 多媒体文件的输出位置;

        第二个是所需语音阅读的文本内容

        第三个第四个是控制语音元素的

/**
     * 文本转音频
     *
     * @param path   音频生成路径(全路径,带文件名)(例:D:\\aa\\a.mp3)
     * @param text   文本内容
     * @param volume 音量大小 0 - 100
     * @param speed  语音朗读速度 -10 到 +10
     * @return 是否成功
     */
    public static boolean text(String path, String text, int volume, int speed) {
        try {

            // 调用dll朗读方法
            ActiveXComponent ax = new ActiveXComponent("Sapi.SpVoice");
            // 音量 0 - 100
            ax.setProperty("Volume", new Variant(volume));
            // 语音朗读速度 -10 到 +10
            ax.setProperty("Rate", new Variant(speed));
            // 输入的语言内容
            Dispatch dispatch = ax.getObject();
            // 本地执行朗读
            Dispatch.call(dispatch, "Speak", new Variant(text));

            //开始生成语音文件,构建文件流
            ax = new ActiveXComponent("Sapi.SpFileStream");
            Dispatch sfFileStream = ax.getObject();
            //设置文件生成格式
            ax = new ActiveXComponent("Sapi.SpAudioFormat");
            Dispatch fileFormat = ax.getObject();

            // 设置音频流格式
            Dispatch.put(fileFormat, "Type", new Variant(22));
            // 设置文件输出流格式
            Dispatch.putRef(sfFileStream, "Format", fileFormat);
            // 调用输出文件流打开方法,创建一个音频文件
            Dispatch.call(sfFileStream, "Open", new Variant(path), new Variant(3), new Variant(true));
            // 设置声音对应输出流为输出文件对象
            Dispatch.putRef(dispatch, "AudioOutputStream", sfFileStream);
            // 设置音量
            Dispatch.put(dispatch, "Volume", new Variant(volume));
            // 设置速度
            Dispatch.put(dispatch, "Rate", new Variant(speed));
            // 执行朗读
            Dispatch.call(dispatch, "Speak", new Variant(text));
            // 关闭输出文件
            Dispatch.call(sfFileStream, "Close");
            Dispatch.putRef(dispatch, "AudioOutputStream", null);

            // 关闭资源
            sfFileStream.safeRelease();
            fileFormat.safeRelease();
            // 关闭朗读的操作
            dispatch.safeRelease();
            ax.safeRelease();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

        测试下,因为只有本地能听到语音,所以这里就用打印验证方法执行没有出错,结果如下:

🍹四、接口改造

        本地测试,该依赖对接设备语音没有问题,在此基础上可以改造为一个接口,该接口的功能就是朗读接口传入的参数,改造后如下:

        4.1  封装为一个工具类

        这里把保存到本地的代码去掉了,因为只需要阅读即可,不用保留多媒体文件

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * @author HuangBen 
 */
public class SpeakUtil {

    /**
     * 文本转音频
     *
     * @param text   文本内容
     * @return 是否成功
     */
    public static boolean text(String text) {
        try {

            // 调用dll朗读方法
            ActiveXComponent ax = new ActiveXComponent("Sapi.SpVoice");
            // 音量 0 - 100
            ax.setProperty("Volume", new Variant(50));
            // 语音朗读速度 -10 到 +10
            ax.setProperty("Rate", new Variant(0));
            // 输入的语言内容
            Dispatch dispatch = ax.getObject();
            // 本地执行朗读
            Dispatch.call(dispatch, "Speak", new Variant(text));
            
            // 关闭朗读的操作
            dispatch.safeRelease();
            ax.safeRelease();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}
        4.2 暴露一个接口

        使用一个 get 请求简单模拟下即可,请求到达之后首先创建一个线程进行语音朗读,主线程进行打印,这是为了防止请求参数过长时,迟迟收不到响应

    @GetMapping("/testVoice")
    public void testVoice(String word) {
        new Thread(() -> {
            SpeakUtil.text(word);
        }).start();
        System.out.println(word);
    }
        4.3 测试

 

🌱五、扩展

        这只是在本地测试使用的方式,实际上隐藏的问题还有很多,比如语音只能在本地机器触发,另外就是如果请求接口参数过长,多个请求同时来的话,可能处理不及时导致部分请求报错或者说无法语音,当然也有一些别的更成熟的依赖可以使用,比如谷歌(需要账号认证),本地只是小耍一下

        文章到这里就结束了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初学Python如何快速入门(内附详细攻略),一文讲清

目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买书看书…

AI指挥细胞大变身,脑瘤生存率跃升75%?

“ 胶质母细胞瘤&#xff08;GBM&#xff09;&#xff0c;一种凶险的脑癌&#xff0c;曾让无数家庭陷入绝望。然而南加州大学凯克医学院的一项突破性研究&#xff0c;利用AI技术将脑癌细胞转化为免疫细胞&#xff0c;为GBM患者带来了前所未有的生存希望。 ” AI识别与重编程…

Windows系统注册表

一、修改文件图标 电脑程序怎么更换python文件的图标_mob64ca12d12b68的技术博客_51CTO博客 二、 1.打开注册的命令&#xff1a; 按winR快捷键&#xff0c;在弹出的窗口中输入&#xff1a;regedit 2.注册表样式 已学习至&#xff1a;0&#xff1a;47&#xff1a;32 课堂链…

OpenAI Sora:视频生成领域的创新力量

一、Sora 的诞生与技术原理 Sora 模型由 OpenAI 推出&#xff0c;其诞生背景与人工智能技术在多模态领域的不断探索和发展紧密相关。在视频数据日益丰富和重要的时代&#xff0c;对视频生成模型的需求愈发迫切&#xff0c;Sora 应运而生。 Sora 独特的技术原理使其在众多模型…

验证码短信怎么实现Java接口对接

在当今数字化时代&#xff0c;商家和企业对于用户身份验证的需求日益增强&#xff0c;这不仅是出于保护用户数据安稳的考虑&#xff0c;也是维护业务正常运营、防止欺诈行为的重要一环。在众多身份验证手段中&#xff0c;文字验证码短信因其便捷性和低成本特性&#xff0c;成为…

面向对象03:创建对象内存分析

本节内容视频链接&#xff1a;面向对象06&#xff1a;创建对象内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p65&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 创建对象时的内存分析涉及到理解对象如何在内存中分配和管理。‌这个过程在…

Python酷库之旅-第三方库Pandas(096)

目录 一、用法精讲 411、pandas.DataFrame.values属性 411-1、语法 411-2、参数 411-3、功能 411-4、返回值 411-5、说明 411-6、用法 411-6-1、数据准备 411-6-2、代码示例 411-6-3、结果输出 412、pandas.DataFrame.axes属性 412-1、语法 412-2、参数 412-3、…

2024年【山东省安全员B证】最新解析及山东省安全员B证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员B证最新解析为正在备考山东省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的山东省安全员B证找解析祝您顺利通过山东省安全员B证考试。 1、【多选题】《建设工程安全生产管理条…

dompdf导出pdf中文乱码显示问号?、换行问题、设置图片大小

环境&#xff1a;PHP 8.0 框架&#xff1a;ThinkPHP 8 软件包&#xff1a;phpoffice/phpword 、dompdf/dompdf 看了很多教程&#xff08;包括GitHub的issue、stackoverflow&#xff09;都没有解决、最终找到解决问题的根本&#xff01; 背景&#xff1a;用Word模板做转PDF…

ES6笔记总结(Xmind格式):第四天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; node的模块化&#xff1a; 1.CommonJS 规范&#xff1a;Node.js 遵循 CommonJS 模块规范&#xff0c;该规范定义了如何在服务器环境中实现模块化&#xff0c;包括如何定义模块、如何引入和使用模块。 2.模块的定义&…

百度文心一言API批量多线程【改写伪原创文章软件】-key免费无限写

百度文心大模型的两款主力模型ENIRE Speed、ENIRE Lite全面免费&#xff0c;即刻生效。 百度文心大模型的两款主力模型 这意味着&#xff0c;大模型已进入免费时代&#xff01; 据了解&#xff0c;这两款大模型发布于今年 3 月&#xff0c;支持 8K 和 128k 上下文长度。 ER…

[MRCTF2020]Hello_ misc

解压得一个png图片和一个flag.rar 图片拖入010editor 选择带zip头的这段蓝色全部复制&#xff0c;file-new-new Hex File&#xff0c;黏贴到新文件&#xff0c;另存为为1.zip 要密码,线索中断&#xff08;当然try to restore it.png&#xff0c;隐藏了zip压缩包&#xff0c;可…

git提交本地项目到远程仓库

1、查看项目目录&#xff0c;是否存在.git文件夹&#xff08;若存在则删除&#xff09; 2、登录git并新建一个空白项目 3、idea创建本地git仓库&#xff08;选择本地项目&#xff09; 4、添加要提交的项目&#xff08;项目右键&#xff09; 5、提交代码到本地仓库 6、配置远程…

代码随想录算法训练营第十一天| 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

目录 一、LeetCode 150. 逆波兰表达式求值思路&#xff1a;C代码 二、LeetCode 239. 滑动窗口最大值思路C代码 三、LeetCode 347.前 K 个高频元素思路C代码 总结 一、LeetCode 150. 逆波兰表达式求值 题目链接&#xff1a;LeetCode 150. 逆波兰表达式求值 文章讲解&#xff1a…

D - Pedometer AtCoder Beginner Contest 367

题意: 一个长度为n的数组a首尾相接&#xff0c;求满足a[i]~a[j]的和是m的倍数的[i,j]对数 思路&#xff1a; 由于首位相接&#xff0c;那么区间i-->j的所有数有两种情况&#xff1a;第一种是i<j的情况&#xff0c;第二种是i>j的情况 为了简化处理&#xff0c;我们可…

信息学奥赛初赛天天练-74-NOIP2016普及组-基础题5-树、父节点、根节点、叶子节点、非叶节点、组合、组合排除法

NOIP 2016 普及组 基础题5 21 从一个 44的棋盘&#xff08;不可旋转&#xff09;中选取不在同一行也不在同一列上的两个方格&#xff0c;共有( )种方法。 22 约定二叉树的根节点高度为 1。一棵结点数为 2016 的二叉树最少有( )个叶子结点&#xff1b;一棵结点数为 2016 的二叉…

STM32 HAL SDADC DMA

1、简介 由于项目需要使用STM32F373单片机的SDADC功能对电位计进行检测,网上资料比较少,踩了很多坑,下面进行总结。 2、STM32CubeMX配置 2.1 RCC配置 2.2 SYS 配置 2.3 SDADC 2 配置 2.3.1 Parameter Settings配置 SDADC共有三种输入模式,分别为差分模式、 单端偏移模…

Web-ssrfme

文章目录 环境分析攻击 环境 首先下载资源包&#xff0c;Ubuntu通过docker拉取环境。 docker-compose up -d分析 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);e…

开源在线文档管理工具MrDoc

MrDoc&#xff0c;也被称为觅思文档或觅道文档&#xff0c;是一款基于Python开发的在线文档系统。它支持Markdown和所见即所得的富文本编辑&#xff0c;适合个人和小型团队作为文档、笔记和知识管理工具。 开源地址&#xff1a;MrDoc: MrDoc觅思文档&#xff0c;适合于个人和中…