文字转语音(四)使用jacob库实现

项目中有相关的功能,就简单研究了一下。

实现原理

  1. ACOB 库:JAva COM Bridge,允许 Java 通过 COM 接口调用 Windows 组件(如 SAPI)
  2. Speech API (SAPI):Windows 内置的语音引擎,支持 TTS 功能。

实现流程

  • 初始化 COM 线程
  • 创建 SpeechLib.SpVoice 对象
  • 调用 Speak 方法朗读文本

实现步骤

1、下载Jacob库

访问 Jacob 官网 下载最新版本,需包含以下文件:

  • jacob-x.x-x.jar(Java 库)
  • jacob-x.x-x-x64.dll(64 位系统)或 jacob-x.x-x-x86.dll(32 位系统)
    在这里插入图片描述

2、配置Jacob

将Jacob 的 DLL 文件放到系统路径中,并在 Java 项目中引入 Jacob 的 JAR 包。

  1. 将 dll 文件复制到System32(64 位系统)或 SysWOW64(32 位系统)目录,或直接放在项目根目录。
    我把 jacob-1.20-x64.dll放在了System32文件夹中。
    在这里插入图片描述
    如果缺少文件,则会提示:
    在这里插入图片描述
  2. 将 jacob.jar文件放到项目的libs(新创建)目录下(与build.gradle的同级目录)
    在这里插入图片描述
dependencies {  implementation fileTree(dir: 'libs', include: ['*.jar']) 
}

3、代码实现

文字转语音
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/*** 使用jacob实现文本转语音** @param text*/public static void jacobToSpeech(String text) {// 初始化COM线程(重要!)ComThread.InitSTA();try {ActiveXComponent ax = new ActiveXComponent("Sapi.SpVoice");// 运行时输出语音内容Dispatch spVoice = ax.getObject();// 音量 0-100ax.setProperty("Volume", new Variant(100));// 语音朗读速度 -10 到 +10ax.setProperty("Rate", new Variant(-1));// 执行朗读Dispatch.call(spVoice, "Speak", new Variant(text));ax.safeRelease();} catch (Exception e) {e.printStackTrace();} finally {// 释放COM线程ComThread.Release();}}
文字转音频文件
 /*** 使用jacob实现文本转语音文件** @param text*/public static void jacobToSpeechFile(String text) {// 初始化COM线程(重要!)ComThread.InitSTA();try {ActiveXComponent ax = new ActiveXComponent("Sapi.SpVoice");// 运行时输出语音内容Dispatch spVoice = ax.getObject();// 音量 0-100ax.setProperty("Volume", new Variant(100));// 语音朗读速度 -10 到 +10ax.setProperty("Rate", new Variant(-1));// 执行朗读//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到100Dispatch.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();} finally {// 释放COM线程ComThread.Release();}}

测试

在这里插入图片描述
音频文件默认生成到程序根目录下
在这里插入图片描述

具体的测试结果可看下绑定的资源文件
在这里插入图片描述

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

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

相关文章

KEPServerEX 中信道深入介绍

以下是 KEPServerEX 中信道(Channel) 的详细介绍,涵盖其定义、功能、配置步骤及最佳实践,帮助您快速掌握信道在数据采集中的核心作用: 一、信道(Channel)的定义 信道 是 KEPServerEX 中 连接物…

Shell脚本笔记

Linux其他命令 Shell脚本笔记

K8S下载离线安装包所需文件

下载相关文件 官网下载地址集合https://kubernetes.io/zh-cn/releases/download/ 下载相关镜像 官网镜像描述 所有 Kubernetes 容器镜像都被部署到 registry.k8s.io 容器镜像仓库。 容器镜像支持架构registry.k8s.io/kube-apiserver:v1.32.0amd64, arm, arm64, ppc64le, …

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层,并生成相应的网表文件(Verilog文件和edif文件),该过程适用于需要将一个模块作为顶层设计进行综合,并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…

【C++前缀和 排序】891. 子序列宽度之和|2182

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 排序 LeetCode891. 子序列宽度之和 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的…

企业网站建站源码 网站源码程序下载

在数字化时代,企业网站已成为企业展示形象、推广产品、服务客户的重要窗口。而选择合适的建站源码,则是搭建一个功能强大、美观易用的企业网站的关键。 一、企业网站建站源码的优势 降低成本: 相较于定制开发,使用建站源码可以大…

五款老牌Java报表工具对比

在企业信息化建设中,报表工具是数据可视化与决策支持的核心组件。随着企业对数据分析需求的不断增长,选择一款高效、易用且功能强大的报表工具显得尤为重要。本文将对比五款老牌Java报表工具,并重点介绍由中创微软件自主研发的新一代报表软件…

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1) import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.HardwareRenderer import android.graphics.PixelFormat import android.graphic…

vue3实战-----封装和使用svg图标

vue3实战-----封装和使用svg图标 1.安装和配置svg插件2.解决引入虚拟模块失败的问题3.使用svg4.封装svg组件5.自定义插件注册svg全局组件 在开发项目的时候经常会用到svg矢量图,使用SVG以后,页面上加载的不再是图片资源,这对页面性能来说是个很大的提升,我们SVG文件比img要小的…

设计原则名称与缩写统计

在软件设计领域,有许多重要的设计原则,以下为你介绍常见的设计原则及其名称和缩写: SRP - 单一职责原则(Single Responsibility Principle) 定义:一个类应该有且仅有一个引起它变化的原因,也就…

自制游戏——斗罗大陆

很简陋&#xff0c;没有图&#xff0c;请见谅 // mine[0] 级数 // mine[1] 战力 //mine[2] 1 白虎 //mine[2] 2 昊天锤 //mine[2] 3 蓝银草 #include <bits/stdc.h> using namespace std; int mine[100],live3, dou 1, luo 1, da 1, bag[1000], huan 0, lia…

DeepSeek正重构人形机器人和具身大模型赛道!

中国人工智能公司DeepSeek&#xff08;深度求索&#xff09;以“低成本、高效率、强开放”的研发范式横空出世&#xff0c;火遍并震撼全球科技圈&#xff1b;DeepSeek展现出来的核心竞争力&#xff0c;除了低成本及推理能力&#xff0c;更重要的是开源模型能力追赶上了最新的闭…

oracle使用动态sql将多层级组织展平

ERP或者其他企业管理软件中都会有一张组织机构表&#xff0c;可以写固定sql的方式将其展平获取组织表中的字段信息&#xff0c;如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷&#xff0c;就是如果只写到处理4个层级&#xff0c;那么后期层级增多就无法…

嵌入式硬件篇---原码、补码、反码

文章目录 前言简介八进制原码、反码、补码1. 原码规则示例问题 2. 反码规则示例问题 3. 补码规则示例优点 4. 补码的运算5. 总结 十六进制原码、反码、补码1. 十六进制的基本概念2. 十六进制的原码规则示例 3. 十六进制的反码规则示例 4. 十六进制的补码规则示例 5. 十六进制补…

分布式光纤传感:为生活编织“感知密网”

分布式光纤测温技术虽以工业场景为核心&#xff0c;但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术&#xff08;DTS&#xff09;作为一种先进的线型温度监测手段&#xff0c;近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…

本地基于GGUF部署的DeepSeek实现轻量级调优之二:检索增强生成(RAG)

前文&#xff0c;我们在本地windows电脑基于GGUF文件&#xff0c;部署了DeepSeek R1 1.5B模型&#xff0c;如果想在离线模式下加载本地的DeepSeek模型自行对进行训练时&#xff0c;是不能直接使用GGUF文件进行训练的&#xff0c;但是可以对模型进行微调&#xff0c;以下说的是第…

Java爬虫:按关键字搜索1688商品的实战案例指南

在电商领域&#xff0c;快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品数据。虽然1688开放平台提供了官方API来获取商品信息&#xff0c;但有时使用爬虫技术来抓取数据也是一种有…

C++病毒(^_^|)(2)

第二期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…

Python练习11-20

题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 题目&#xff1a;判断101-200之间有多少…

C++ 设计模式-建造者模式

以下是一个完整的C建造者模式示例&#xff0c;包含产品类、建造者接口、具体建造者、指挥者以及测试代码&#xff1a; #include <iostream> #include <string> #include <memory>// 产品类&#xff1a;汽车 class Car { public:void setBody(const std::str…