Spring Boot 集成免费的 EdgeTTS 实现文本转语音

news/2025/10/14 15:48:24/文章来源:https://www.cnblogs.com/didispace/p/19141276

在需要文本转语音(TTS)的应用场景中(如语音助手、语音通知、内容播报等),Java生态缺少类似Python生态的Edge TTS 客户端库。不过没关系,现在可以通过 UnifiedTTS 提供的 API 来调用免费的 EdgeTTS 能力。同时,UnifiedTTS 还支持 Azure TTS、MiniMax TTS、Elevenlabs TTS 等多种模型,通过对请求接口的抽象封装,用户可以方便在不同模型与音色之间灵活切换。

下面我们以调用免费的EdgeTTS为目标,构建一个包含文本转语音功能的Spring Boot应用。

实战

1. 构建 Spring Boot 应用

通过 start.spring.io 或其他构建基础的Spring Boot工程,根据你构建应用的需要增加一些依赖,比如最后用接口提供服务的话,可以加入web模块:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

2. 注册 UnifiedTTS,获取 API Key

  • 前往 UnifiedTTS 官网注册账号(直接GitHub登录即可)
  • 从左侧菜单进入“API密钥”页面,创建 API Key;

创建API Key

  • 存好API Key,后续需要使用

3. 集成 UnifiedTTS API

下面根据API 文档:https://unifiedtts.com/zh/api-docs/tts-sync 实现一个可运行的参考实现,包括配置文件、请求模型、服务类与控制器。

3.1 配置文件(application.properties

unified-tts.host=https://unifiedtts.com
unified-tts.api-key=your-api-key-here

这里unifiedtts.api-key参数记得替换成之前创建的ApiKey。

3.2 配置加载类

@Data
@ConfigurationProperties(prefix = "unified-tts")
public class UnifiedTtsProperties {private String host;private String apiKey;}

3.3 请求封装和响应封装

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UnifiedTtsRequest {private String model;private String voice;private String text;private Double speed;private Double pitch;private Double volume;private String format;}@Data
@AllArgsConstructor
@NoArgsConstructor
public class UnifiedTtsResponse {private boolean success;private String message;private long timestamp;private UnifiedTtsResponseData data;@Data@AllArgsConstructor@NoArgsConstructorpublic static class UnifiedTtsResponseData {@JsonProperty("request_id")private String requestId;@JsonProperty("audio_url")private String audioUrl;@JsonProperty("file_size")private long fileSize;}
}

UnifiedTTS 抽象了不同模型的请求,这样用户可以用同一套请求参数标准来实现对不同TTS模型的调用,这个非常方便。所以,为了简化TTS的客户端调用,非常推荐使用 UnifiedTTS。

3.3 服务实现(调用 UnifiedTTS)

使用 Spring Boot自带的RestClient HTTP客户端来实现UnifiedTTS的功能实现类,提供两个实现:

  1. 接收音频字节并返回。
@Service
public class UnifiedTtsService {private final RestClient restClient;private final UnifiedTtsProperties properties;public UnifiedTtsService(RestClient restClient, UnifiedTtsProperties properties) {this.restClient = restClient;this.properties = properties;}/*** 调用 UnifiedTTS 同步 TTS 接口,返回音频字节数据。** <p>请求头:* <ul>*   <li>Content-Type: application/json</li>*   <li>X-API-Key: 来自配置的 API Key</li>*   <li>Accept: 接受二进制流或常见 mp3/mpeg 音频类型</li>* </ul>** @param request 模型、音色、文本、速度/音调/音量、输出格式等参数* @return 音频二进制字节(例如 mp3)* @throws IllegalStateException 当服务端返回非 2xx 或无内容时抛出*/public byte[] synthesize(UnifiedTtsRequest request) {ResponseEntity<byte[]> response = restClient.post().uri("/api/v1/common/tts-sync").contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_OCTET_STREAM, MediaType.valueOf("audio/mpeg"), MediaType.valueOf("audio/mp3")).header("X-API-Key", properties.getApiKey()).body(request).retrieve().toEntity(byte[].class);if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {return response.getBody();}throw new IllegalStateException("UnifiedTTS synthesize failed: " + response.getStatusCode());}/*** 调用合成并将音频写入指定文件。** <p>若输出路径的父目录不存在,会自动创建;失败时抛出运行时异常。** @param request TTS 请求参数* @param outputPath 目标文件路径(例如 output.mp3)* @return 实际写入的文件路径*/public Path synthesizeToFile(UnifiedTtsRequest request, Path outputPath) {byte[] data = synthesize(request);try {if (outputPath.getParent() != null) {Files.createDirectories(outputPath.getParent());}Files.write(outputPath, data);return outputPath;} catch (IOException e) {throw new RuntimeException("Failed to write TTS output to file: " + outputPath, e);}}
}

3.4 单元测试

@SpringBootTest
class UnifiedTtsServiceTest {@Autowiredprivate UnifiedTtsService unifiedTtsService;@Testvoid testRealSynthesizeAndDownloadToFile() throws Exception {UnifiedTtsRequest req = new UnifiedTtsRequest("edge-tts","en-US-JennyNeural","Hello, this is a test of text to speech synthesis.",1.0,1.0,1.0,"mp3");// 调用真实接口,断言返回结构UnifiedTtsResponse resp = unifiedTtsService.synthesize(req);assertNotNull(resp);assertTrue(resp.isSuccess(), "Response should be success");assertNotNull(resp.getData(), "Response data should not be null");assertNotNull(resp.getData().getAudioUrl(), "audio_url should be present");// 在当前工程目录下生成测试结果目录并写入文件Path projectDir = Paths.get(System.getProperty("user.dir"));Path resultDir = projectDir.resolve("test-result");Files.createDirectories(resultDir);Path out = resultDir.resolve(System.currentTimeMillis() + ".mp3");Path written = unifiedTtsService.synthesizeToFile(req, out);System.out.println("UnifiedTTS test output: " + written.toAbsolutePath());assertTrue(Files.exists(written), "Output file should exist");assertTrue(Files.size(written) > 0, "Output file size should be > 0");}
}

4. 运行与验证

执行单元测试之后,可以在工程目录test-result下找到生成的音频文件:

5. 常用参数与音色选择

目前支持的常用参数如下图所示:

对于model和voice参数可以因为内容较多,可以前往API文档查看。

小结

本文展示了如何在 Spring Boot 中集成 UnifiedTTS 的 EdgeTTS 能力,实现文本转语音并输出为 mp3。UnifiedTTS 通过统一的 API 屏蔽了不同 TTS 模型的差异,使你无需维护多个 SDK,即可在成本与效果之间自由切换。根据业务需求,你可以进一步完善异常处理、缓存与并发控制,实现更可靠的生产级 TTS 服务。

本文样例工程:https://github.com/dyc87112/unified-tts-example

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

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

相关文章

分布式计数器平台完整解决方案

分布式计数器平台完整解决方案2025-10-14 15:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

基于Golang+Gin+Gorm+Vue3母婴商城项目实战

/s/1SwwmWTljJHr_C8cu2Xz2Tw 提取码: 35bf 在当今飞速发展的电商领域,母婴垂直赛道以其用户粘性高、客单价高、复购率高等特点,始终占据着重要地位。开发一个能够应对高并发、数据关系复杂且用户体验要求极高的母婴商…

2025 年无缝钢管厂家推荐排行榜, SA333Gr.6 /SA106B/SA106C/A106B/SA210C/ 25MnG/SA53B/A53B /L245NS/P22 无缝钢管厂家推荐

无缝钢管作为工业制造、能源输送等领域的核心材料,其品质直接决定项目安全与运营效率。当前市场品牌繁杂,部分产品存在壁厚不均、材质不达标等问题,据相关调研,近三成企业因选错产品面临工程隐患。尤其在 GB/T9948…

英语_阅读_telescope_待读

You would see mountains and valleys if you looked at the Moon through a telescope. 如果你通过望远镜观察月球,你会看到山脉和山谷。 If you looked at the planet Jupiter, you would see its moons. 如果你观察…

fiddler早期免费版下载,fiddler抓包工具及使用

介绍Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要比其他的网络调试器要更加简…

零点城市社交电商卡密串码插件:全场景虚拟商品运营解决方案

一、概述总结 “零点城市社交电商卡密串码插件” 是由成都微连科技开发、基于微擎系统交付的微信小程序专用工具,专注于为社交电商场景下的虚拟商品运营提供全流程支持。作为官方正品应用,该插件不仅通过源码加密保障…

完整教程:Nginx 核心功能配置:访问控制、用户认证、HTTPS 与 URL 重写等

完整教程:Nginx 核心功能配置:访问控制、用户认证、HTTPS 与 URL 重写等pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

宝塔计划任务root能正常运行,www用户不能按时运行

在大多数 Linux 系统中,cron服务是默认安装的,但如果你不确定是否安装了 cron,可以通过以下方法检查: ​​1. 检查 cron是否安装​​ ​​方法 1:检查 cron服务状态​​ systemctl status cron # Ubuntu/Debian s…

mysql 授权访问配置

mysql 授权访问配置1.进入mysql mysql -u root -p 输入密码进入 2.授权cmz账户仅允许本机服务器环境访问 输入CREATE USER cmz@localhost IDENTIFIED BY Gjkj@cmz@@; (说明,授权cmz账户localhost本地访问 密码Gjk…

介绍 Qodo(原 Codium):新名字,不变的质量承诺 - 公众号

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!🚀 魔都架构师 | 全网30W技术追随者 🔧 大厂分布式系统/数据中台实战专家 🏆 主导交易系统百万级流量调优 & 车联网平台架构 🧠 AIGC应用…

mas激活工具安装教程!专业版激活工具!!Microsoft Activation Scripts v3.6 MAS中文汉化版(激活工具)

软件介绍 Microsoft Activation Scripts v3.6(MAS)是一款功能强大的 Microsoft 产品激活工具。MAS 是一个批处理版 KMS 激活脚本,代码开源,体积小巧,不会产生误报问题。它由 WindowsAddict 开发,它支持HWID/Ohoo…

英语_阅读_Lunar exploration_待读

Recently, remarkable progress has been made in Chinas manned lunar exploration mission. 最近,中国载人登月探索任务取得了显著进展。 The names of the manned lunar landing suit and lunar rover have been r…

HPC——MPI

HPC——MPIMPI(Message Passing Interface,消息传递接口)是并行计算领域广泛应用的一个标准化消息传递系统,它允许程序员在分布式内存系统(如计算机集群)上编写并行程序。简单来说,MPI提供了一套标准化的函数库…

中文语音识别不建议使用VOSK

40几MB的vosk-model-small-cn-0.3,识别率极低,识别速度极慢。 1.3GB的vosk-model-cn-0.22没试,想必速度不会更快。 网站上Models里只有vosk-model-small-cn-0.22,没有0.3 vosk-transcriber --list-models vosk-tra…

213123123123123

321312312312312312312312312

VSCode插件开发的注意点 - Erica

VSCode插件开发的注意点开发调试的时候是在这个地方添加向新打开的调试窗口的参数,但是经过实践发现并不能打开当前正在开发的文件夹。 通过使用"${workspaceFolder}/src",能成功的在新的调试窗口(或者叫…

时序数据库 IoTDB 集成 DataGrip,支撑跨模态多库融合管理

多源异构数据融合,轻松搭建跨库管理解决方案!物联网工业数据管理场景中,尽管时序数据占主要部分,但企业往往需要实现跨维度关联分析,多源异构数据的关联融合管理对数据库提出了更高要求。 国产原生时序数据库 IoT…

Sql Server安装报错“服务没有及时响应启动或控制请求”

最近由于电脑环境有问题重装了下电脑系统,重装系统后在安装sql server的时候,前面都没有问题 除了有个防火墙警告,看到“上面提示操作完成。已通过4。失败0。警告1。已跳过0”,警告警告呗,反正又不是失败,总体还…

题解:CF1830E Bully Sort

题目: 每 bully swap \(i,j\) 会使得 \(\sum_i \left | i-p_i \right |\) 减少 \((2j-2i)\),使得逆序对数减少 \((2j-2i-1)\), 又因为一个数始终单向移动,所以 bully swap 次数为 \((\sum_i \left | i-p_i \right …

斑马日记2025.10.10

今天加入了概数部分的学习,然后参加了蓝桥杯的新生赛,有一些感悟和收获,现在分享一下。 蓝桥杯新生赛中,遇到的问题: 1,对于循环部分的运用不够精辟,有些题目特别是简单题,对时间复杂度的要求很苛刻,所以有些…