项目中有相关的功能,就简单研究了一下。
实现原理
- ACOB 库:JAva COM Bridge,允许 Java 通过 COM 接口调用 Windows 组件(如 SAPI)
- 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 包。
- 将 dll 文件复制到System32(64 位系统)或 SysWOW64(32 位系统)目录,或直接放在项目根目录。
我把 jacob-1.20-x64.dll放在了System32文件夹中。
如果缺少文件,则会提示:
- 将 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();}}
测试
音频文件默认生成到程序根目录下
具体的测试结果可看下绑定的资源文件