当前位置: 首页 > article >正文

文字转语音(三)FreeTTS实现

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

说明

FreeTTS 是一个基于 Java 的开源文本转语音(TTS)引擎,旨在将文字内容转换为自然语音输出。
FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景,但若需中文支持或高质量语音,建议选择其他方案(如商业 API 或 eSpeak)。

实现方式

Java 库,依赖 freetts.jar 和语音库文件。

优缺点

在这里插入图片描述
在这里插入图片描述

具体实现

gradle添加依赖(没成功)

我在build.gradle文件中添加以下依赖,然后重新构建,发现报错。于是乎就换了种方式添加依赖(手动引入jar包)。

dependencies {implementation 'com.sun.speech.freetts:freetts:1.2.2'
}

在这里插入图片描述

1、 下载FreeTTS 的 JAR 包

  • 访问 FreeTTS 官网 下载最新版本(例如 freetts-1.2.2.zip)。

下载地址:https://sourceforge.net/projects/freetts/files/latest/download

  • 解压后的文件目录如下:
    在这里插入图片描述
  • 将以下文件复制到项目的 libs 目录(需手动创建,与build.gradle放在同级目录):
    (1)freetts.jar(位于解压后的 lib 目录)
    (2)语音包(例如 cmu_time_awb.jar, cmu_us_kal.jar,位于 lib 目录)
    保险起见,我将jar包全部放到libs目录下了
    在这里插入图片描述

2、配置依赖

build.gradle 文件中添加对本地 JAR 的依赖,并重新构建

dependencies {// 引入 libs 目录下的所有 JAR 文件implementation fileTree(dir: 'libs', include: ['*.jar'])
}

3、代码实现

最终测试发现,只读英文,不读中文。

import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
import com.sun.speech.freetts.audio.AudioPlayer;
import com.sun.speech.freetts.audio.SingleFileAudioPlayer;
    /*** 文字转语音** @param text*/public static void freeTTSToSpeak(String text) {try {VoiceManager voiceManager = VoiceManager.getInstance();System.out.println("可用语音列表:");for (Voice voice : voiceManager.getVoices()) {System.out.println(" - " + voice.getName());}Voice voice = voiceManager.getVoice("kevin16");if (voice == null) {System.err.println("未找到指定语音,请检查语音包是否已添加。");return;}voice.allocate();voice.speak(text);voice.deallocate();} catch (Exception ex) {ex.printStackTrace();}}
/*** 使用FreeTTS实现文本转音频* 只支持英文** @param text*/public static void freeTTSToSpeakFile(String text) {VoiceManager voiceManager = VoiceManager.getInstance();System.out.println("可用语音列表:");for (Voice voice : voiceManager.getVoices()) {System.out.println(" - " + voice.getName());}Voice voice = voiceManager.getVoice("kevin16");if (voice == null) {System.err.println("未找到指定语音,请检查语音包是否已添加。");return;}try {// 创建音频播放器,指定输出路径和格式(WAV 或 AU)//文件默认保存在项目根目录(或根据 IDE 配置的当前工作目录)。//AudioPlayer audioPlayer = new SingleFileAudioPlayer("output", javax.sound.sampled.AudioFileFormat.Type.WAVE);//文件生成路径可自定义,路径需存在且可写AudioPlayer audioPlayer = new SingleFileAudioPlayer("D:/tts_output/output", javax.sound.sampled.AudioFileFormat.Type.WAVE);// 分配语音资源并绑定音频播放器voice.setAudioPlayer(audioPlayer);voice.allocate();// 语音播放voice.speak(text);// 关闭资源并保存文件voice.deallocate();audioPlayer.close();// 确保文件写入完成System.out.println("音频文件已保存为: output.wav");} catch (Exception e) {e.printStackTrace();} }

测试文件

可查看绑定的资源文件
在这里插入图片描述

注意事项

  1. 生成音频文时默认保存在项目根目录
  2. 如果要自定义文件生成目录的时候,文件夹要存在。比如代码中的tts_output文件夹,要提前创建好。
  3. 支持的音频格式:WAV 格式、AU 格式,不直接支持生成MP3格式文件。但是可以转换,具体怎么转换我没研究(#.#)
  4. 无法合成中文语音,尝试保存中文文本会无声音输出
  5. 多次运行代码会覆盖同名文件,可通过时间戳生成唯一文件名。
String fileName = "output_" + System.currentTimeMillis();
AudioPlayer audioPlayer = new SingleFileAudioPlayer(fileName, AudioFileFormat.Type.WAVE);

相关文章:

文字转语音(三)FreeTTS实现

项目中有相关的功能,就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音(TTS)引擎,旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景,但若需…...

STM32 RTC 实时时钟说明

目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…...

Open-R1 项目代码文件的详细剖析

目录 1. configs.py 功能概述 关键代码与细节 2. evaluate.py 功能概述 关键代码与细节 3. generate.py 功能概述 关键代码与细节 4. grpo.py 功能概述 关键代码与细节 5. rewards.py 功能概述 关键代码与细节 6. sft.py 功能概述 关键代码与细节 安装 训练…...

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…...

【DuodooBMS】基于Odoo的开源制造执行系统——以开源之力,驱动智能制造

以用户为中心的开放式智造平台 DuodooMES的设计始终围绕“用户可编程、生态可生长”的核心思想,打破传统工业软件的封闭性,让制造企业真正成为系统的“主人”: 1. 用户可编程:生产流程由你定义 界面可配置:无需代码即…...

机器视觉深度学习,工业缺陷检测中数据标注需要注意那些问题

在工业缺陷检测中,数据标注是构建高质量模型的关键步骤,需注意以下问题: 标注准确性 精确标注缺陷位置:确保标注框或掩码准确覆盖缺陷区域,避免过大或过小。 区分缺陷类型:不同缺陷应有明确分类,避免混淆。标注一致性 统一标注标准:制定并遵循统一的标注规范,确保不同…...

数据结构:图论入门

图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...

【R语言】方差分析

一、基本术语 在R语言以及更广泛的统计学领域中,方差分析(ANOVA,即Analysis of Variance)是一种用于比较两个或更多组数据的均值是否存在显著差异的统计方法。可以使用aov()函数或其他相关函数(如anova())…...

区块链+隐私计算:长安链多方计算合约标准协议(CMMPC-1)发布

建设背景 长安链与隐私计算的深度融合是构建分布式数据与价值流通网络的关键基石,可以在有效连接多元参与主体的同时确保数据的分布式、可追溯、可计算,以及隐私性与安全性。在长安链与隐私计算的融合实践中,开源社区提炼并抽象出多方计算场…...

#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...

HAL库USART中断接收的相关问题

文章目录 一、使用中断的步骤二、相关函数分析1、HAL_UART_IRQHandler2、UART_Receive_IT3、HAL_UART_Receive_IT4、UART_Start_Receive_IT5、总结 三、HAL库使用心得 一、使用中断的步骤 1、配置GPIO 2、配置USART1 3、设置UART1中断优先级(不开启手动中断&#x…...

顺序表(C)

1.顺序表的概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,通常借助数组来实现。它的特点是逻辑上相邻的元素在物理存储位置上也相邻,支持随机访问,可通过下标直接访问任意位置的元素。不过,顺序表在插入和…...

Polkadot-API (PAPI) 简介与使用指南

在 Polkadot 生态系统中,去中心化应用(dApp)、网页和钱包的开发者通常使用 JavaScript 和 TypeScript 进行开发。与基于 Polkadot SDK 的区块链进行交互,传统上主要依赖于 Polkadot JS 库。然而,最近波卡生态中出现了一…...

LabVIEW用户界面设计原则

在LabVIEW开发中,用户界面(UI)设计不仅仅是为了美观,它直接关系到用户的操作效率和体验。一个直观、简洁、易于使用的界面能够大大提升软件的可用性,尤其是在复杂的实验或工业应用中。设计良好的UI能够减少操作错误&am…...

Java中的synchronized:使用与锁升级机制

在Java并发编程中,synchronized关键字是实现线程同步的重要工具。它能够确保多个线程在访问共享资源时的线程安全性。随着Java版本的更新,synchronized的底层实现也在不断优化,尤其是引入了锁升级机制,显著提高了性能。本文将详细…...

简述MySQL主从复制原理及其工作过程,配置一主两从并验证

MySQL主从复制原理:MySQL主从复制是一种常用的数据同步技术,它通过将一个MySQL数据库服务器(主服务器)的数据实时复制到一个或多个从服务器,从而实现数据的备份、读写分离以及高可用性等目标. 基于binlog的主从同步 #主服务器配…...

MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

简介 MySQL InnoDB集群(Cluster)提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。 InnoDB Cluster组件: …...

【时时三省】(C语言基础)简单的算法举例

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 判定2000—2500年中的每一年是否为闰年,并将结果输出。 本先分析闰年的条件: (1)能被4整除,但不能被100整除的年份都是闰年&…...

走进 Tcl 语言:历史、特性与应用

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

Day42(补)【AI思考】-编译过程中语法分析及递归子程序分析法的系统性解析

文章目录 编译过程中语法分析及递归子程序分析法的系统性解析**一、总览:编译流程中的语法分析****1. 编译过程核心步骤** **二、语法分析的核心任务****1. 核心目标****2. 现实类比** **三、递归子程序分析法的本质****1. 方法分类****2. 递归子程序分析法的运作原…...

Effective Objective-C 2.0 读书笔记——内存管理(上)

Effective Objective-C 2.0 读书笔记——内存管理(上) 文章目录 Effective Objective-C 2.0 读书笔记——内存管理(上)引用计数属性存取方法中的内存管理autorelease保留环 ARCARC必须遵循的方法命名原则ARC 的自动优化&#xff1…...

软件测试覆盖率详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、覆盖率概念 覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测…...

控制玉米株高基因 PHR1 的基因克隆

https://zwxb.chinacrops.org/CN/10.3724/SP.J.1006.2024.33011...

windows10本地的JMeter+Influxdb+Grafana压测性能测试,【亲测,避坑】

一、环境,以下软件需要解压、安装到电脑上。 windows10 apache-jmeter-5.6.3 jdk-17.0.13 influxdb2-2.7.11 grafana-enterprise-11.5.1二、配置Influxdb,安装完默认连接http://localhost:8086/。打开连接,配置如下。 开启Influxdb&#xf…...

那些数据库函数那些事儿

stdio 1.基本概念 文件: 一组相关数据的集合 文件名: 01.sh //文件名 2.linux下的文件类型 b block 块设备文件 eg: 硬盘 c character 字符设备文件 eg: 鼠标,键盘 d directory 目录文件 eg: 文件夹 - regular 常…...

Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法

Excel中不用复杂公式根据指定X列的数值N复制整行数据N行简单方法 1、在“数据表”sheet1中对指定X列(假设X列的数字从X2开始到Xn结束)求和,和为Y。 2、在“数据表”sheet1数据列之外新建一列Z,Z1输入表头“匹配数据列”&#xff…...

如何在 Java 后端接口中提取请求头中的 Cookie 和 Token

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱个人微信&a…...

【Python网络爬虫】爬取网站图片实战

【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…...

SAP ABAP VA05增强

SE18 输入增强的BADI名称:BADI_SDOC_WRAPPER 进入后,点击Interface。 进入后,点击显示对象清单。 双击增强类,下面有之前做好的增强类,没有的可以自己创建一个。 IF_BADI_SDOC_WRAPPER~ADAPT_RESULT_COMP 代码 METHOD if_badi_sdoc_wrapper~adapt_result_comp."…...

八大排序——简单选择排序

目录 1.1基本操作: 1.2动态图: 1.3代码: 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作: 选择排序(select sorting)也…...