写点什么

Voices 能够让 Java 应用程序快速实现文本到语音转换

作者: Johan Janssen

  • 2025-11-10
    北京
  • 本文字数:3209 字

    阅读完需:约 11 分钟

大小:981.01K时长:05:34
Voices能够让Java应用程序快速实现文本到语音转换

Voices 是一个开源的文本转语音项目,专为运行在 Java 17 或更新版本的应用程序设计的。这个库不需要外部 API 或手动安装的软件,可以根据字典或OpenVoice为不同语言生成音频文件。

 

Henry Coles是 Voices 和 Pitest 的创建者以及Arcmutate的变更测试负责人,他在 2025 年 9 月的Bluesky上介绍了 Voices,其最新版本在 2025 年 10 月下旬发布,版本号为 0.0.8。

 

Voices 使用ONNX Runtime,这是一个跨平台的 AI 引擎,可以加速训练和推理,支持来自各种深度学习框架的模型,如 TensorFlow 和 PyTorch。该运行时在可能的情况下会利用硬件加速器,并支持各种硬件和操作系统配置。

 

这里演示的例子需要多个库,以下的 POM 文件配置可以与 Maven 一起使用:

<!-- The main dependency --><dependency>    <groupId>org.pitest.voices</groupId>    <artifactId>chorus</artifactId>    <version>0.0.8</version></dependency><!-- A prepackaged model --><dependency>    <groupId>org.pitest.voices</groupId>    <artifactId>alba</artifactId>    <version>0.0.8</version></dependency><!-- A dictionary of pronunciations --><dependency>    <groupId>org.pitest.voices</groupId>    <artifactId>en_uk</artifactId>    <version>0.0.8</version></dependency><!-- The runtime for ONNX models --><dependency>    <groupId>com.microsoft.onnxruntime</groupId>    <artifactId>onnxruntime</artifactId>    <version>1.22.0</version></dependency>
复制代码

其他的构建工具,如 Gradle,也可以用来运行这里展示的样例。


可以通过替换上述依赖项来使用 en_us 字典,以取代 en_uk 字典。onnxruntime 可以被 onnxruntime_gpu 替换以进行 GPU 加速。Chorus类可以用来管理语音模型和管理资源。建议在应用程序中使用单个Chorus实例,因为加载模型的成本较高。以下示例演示了将英文文本转换为 InfoQ_English 音频文件的过程:

ChorusConfig config = chorusConfig(EnUkDictionary.en_uk());try (Chorus chorus = new Chorus(config)) {

Voice alba = chorus.voice(Alba.albaMedium());

Audio audio = alba.say("This is the InfoQ article about the Voices library"); Path path = Paths.get("InfoQ_English"); audio.save(path);}
复制代码

前面的示例使用了在构建时通过 Maven 依赖项检索到的模型。其他模型也可以在运行时通过以下 Maven 依赖项检索进来:

<dependency>    <groupId>org.pitest.voices</groupId>    <artifactId>model-downloader</artifactId>    <version>0.0.8</version></dependency>
复制代码

现在,可以通过以下类的工厂方法使用模型:

org.pitest.voices.download.Modelsorg.pitest.voices.download.UsModelsorg.pitest.voices.download.NonEnglishModels
复制代码

以下示例使用NonEnglishModels类中的荷兰 nlNLRonnie 模型将荷兰文的文本转换为荷兰语音频文件:

 

Model nlModel = NonEnglishModels.nlNLRonnie();

ChorusConfig config = chorusConfig(EnUkDictionary.en_uk());

try (Chorus chorus = new Chorus(config)) {

Voice alba = chorus.voice(nlModel);

Audio audio = alba.say("Dit is een Nederlandse tekst Scheveningen"); Path path = Paths.get("Dutch"); audio.save(path);}
复制代码

另外,还可以使用OpenVoice来改善生成的语音,而不需要字典。然而,它需要更多的计算能力,并且模型大小为 50MB,明显大于 3MB 的字典文件。以下依赖项启用了 Maven 对 OpenVoice 的支持:

<dependency>    <groupId>org.pitest.voices</groupId>    <artifactId>openvoice-phonemizer</artifactId>    <version>0.0.8</version></dependency>
复制代码

声明依赖项后,可以使用OpenVoiceSupplier模型:

ChorusConfig config = chorusConfig(Dictionaries.empty()).withModel(new OpenVoiceSupplier());try (Chorus chorus = new Chorus(config)) {

Voice alba = chorus.voice(Alba.albaMedium());

Audio audio = alba.say("This is the InfoQ article about the Voices library"); Path path = Paths.get("InfoQ_English_OpenVoice"); audio.save(path);}
复制代码

OpenVoice 还支持英国或美国英语以及荷兰语等语言的语音,如下例所示:

Model nlModel = NonEnglishModels.nlNLRonnie();ChorusConfig config = chorusConfig(Dictionaries.empty())        .withModel(new OpenVoiceSupplier());

try (Chorus chorus = new Chorus(config)) {

Voice alba = chorus.voice(nlModel);

Audio audio = alba.say("Dit is een Nederlandse tekst Scheveningen"); Path path = Paths.get("Dutch_OpenVoice"); audio.save(path);}
复制代码

通过从类路径中删除 onnxruntime 并添加 onnxruntime_gpu 依赖项(例如,通过 Maven pom.xml),该库还允许在 GPU 上运行模型,以取代 CPU。接下来,应该使用 gpuChorusConfig 而不是“正常”的 chorusConfig

ChorusConfig config = gpuChorusConfig(EnUkDictionary.en_uk());
复制代码

 

默认情况下,会使用 GPU 0,没有其他选项;另外,可以使用在ChorusConfig类中定义的withCudaOptions()方法进行配置。

 

当库在文本中遇到 Markdown 符号时,即 #、---、em或en破折号,会添加暂停。

与其他配置一样,可以使用ChorusConfig类来更改暂停的默认设置。

 

其他一些文本转语音的解决方案(如Sherpa OnnxMaryTTS),从 Maven 等构建工具中获取较为困难,或者产生的声音质量较低。


InfoQ 联系了 Henry Coles,以了解更多关于 Voices 的信息。


InfoQ:您能想象在什么场景下声音最常见吗?您能分享一些这些库真正发挥作用的样例吗?

Henry Coles:最初,代码是编辑小说的工具的一部分。我只能猜测它可能在其他地方有用,但当你需要快速生成听起来相当自然的语音,并且不想依赖外部服务时,它就非常合适。

 

InfoQ:是什么激发了您创建 Voices 库?

Coles: 我需要从 Java 生成语音,而大多数现代文本转语音(Text to Speech,TTS)库都是用 Python 编写的。最初,我将piper作为 HTTP 服务运行,但这很不方便,所以开始寻找从 Java 运行 piper 模型的方法。

 

InfoQ:是什么让您决定创建一个新库,而不是与现有的解决方案合作?

Coles: 现有的 Java TTS 解决方案是很久以前建立的,按照现代标准听起来很机械。它们很难改进。相比之下,运行 piper ONNX 模型非常简单,但是它缺少一个部分:将文本转换为音素(phonemes)的 Java 代码。我找不到任何 Java phonemiser,所以我不得不自己实现一个。

 

InfoQ:在构建声音时,您面临了哪些挑战,您是如何克服它们的?有没有您非常纠结关键设计决策?

Coles:主要挑战是我对语言学一无所知。开发过程也与我通常的工作方式完全不同。这主要是一个移植项目,即将 TypeScript 逻辑翻译成 Java。测试本质上都是别人的逻辑,由于没有明确的“正确”答案,这进一步复杂化了。英语不能通过简单的规则进行音素化(需要通过字典处理特殊情况),所以对于某些输入,输出总是错误的,这是一个将该类场景识别出来的问题。我最终得到了一个非常手动化的开发循环,生成音频并通过耳朵进行评分,然后添加测试用例以捕获特定输入的回归。

 

InfoQ:您希望改进库的哪一部分呢?

Coles:我想清理 API。当前的 API 是为了快速满足单一用例而创建的,如果进行一些前期思考,我可能会创建出更好的东西。

 

InfoQ:未来有计划添加功能吗?

Coles:如果有机会的话,我会考虑改进它处理暂停和设置语音节奏的方式。

 

InfoQ:您推荐使用库的应用程序应该采用哪种自动化测试方法?也许使用语音转文本解决方案,以便比较输入和输出?

Henry:我建议适度测试输出。一些检查音频是否产生以及一切是否正确连接的测试是很有意义的,但库的功能不是客户端应用程序控制的,所以它们应该主要关注检查输入到边界。

 

更多信息和示例可以在GitHub上找到。

 

查看英文原文:Voices Enables Fast Text-to-Speech for Java Applications

2025-11-10 17:034042

评论

发布
暂无评论

喜讯:行云绽放荣获国家高新技术企业证书

行云管家

高新企业 高新技术 高新

StarRocks 企业行|走进 58 同城,探索极速统一 3.0 时代的企业实践

StarRocks

数据库

用javascript分类刷leetcode22.字典树(图文视频讲解)

js2030code

JavaScript LeetCode

细说react源码中的合成事件

flyzz177

React

从源码角度看React-Hydrate原理

flyzz177

React

转角遇到爱,资源中心系统和图数据库

鲸品堂

技术 图数据库 企业号 2 月 PK 榜

【等保要求】等保要求堡垒机审计日志保留多久?

行云管家

等保 堡垒机 等级保护

为实现跨境文件高速传输,镭速传输都用了哪些技术

镭速

StarRocks获评「2022 中国开源社区健康案例」!

StarRocks

数据库 开源

镜舟城市行|镜舟联手永洪科技共话数智运营

镜舟科技

数据库

设计模式第五讲-装饰器模式和代理模式详解

C++后台开发

数据结构 设计模式 后端开发 Linux服务器开发 C++开发

深入react源码看setState究竟做了什么?

flyzz177

React

GaussDB(DWS)性能调优:indexscan导致的性能问题识别与优化

华为云开发者联盟

数据库 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

倒带ChunJun,同心前行|2022年度回顾&2023年共建规划

袋鼠云数栈

开源

Flink X Hologres构建企业级Streaming Warehouse

阿里云大数据AI技术

大数据 数仓 企业号 2 月 PK 榜 分层技术

看透react源码之感受react的进化

goClient1992

React

企业级数据平台为什么要“可观测”? | StartDT Hackathon

奇点云

数据平台 可观测 云数据 黑客马拉松 奇点云

IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf

JackJiang

云小课|使用SpringBoot快速构建FunctionGraph HTTP函数

华为云开发者联盟

开发 HTTP 华为云 企业号 2 月 PK 榜 华为云开发者联盟

2023最新Java面试手册(性能优化+微服务架构+并发编程+开源框架)

小小怪下士

Java 程序员 面试 金三银四

熊猫小说家功能升级:支持阅读原文+更多功能等你解锁

澜舟孟子开源社区

NLP 大模型 AIGC 澜舟科技

为什么西门子、美的等企业这样进行架构升级,看看改造效果就知道了

TDengine

数据库 tdengine 开源 时序数据库

阿里IM技术分享(十):深度揭密钉钉后端架构的单元化演进之路

JackJiang

三十分钟入门基础Go(Java小子版)

京东科技开发者

Java php Go nil 企业号 2 月 PK 榜

PMR 提取视频特征,理解上下文

Zilliz

React源码分析(一)Fiber

goClient1992

React

前端工程师leetcode算法面试必备-二叉树深度广度遍历

js2030code

JavaScript LeetCode

React-Hooks源码深度解读

goClient1992

React

前端工程师leetcode算法面试必备-二叉树的构造和遍历

js2030code

JavaScript LeetCode

Voices能够让Java应用程序快速实现文本到语音转换_后端_InfoQ精选文章