再也不用付費!Spring Boot + EdgeTTS 實現媲美真人的語音合成
在語音驅動應用日益普及的今天——無論是智能語音助手、自動播報系統,還是內容朗讀服務——文本轉語音(TTS, Text-to-Speech) 都成為了關鍵技術環節。 但對于 Java 開發者而言,生態中缺乏如 Python 那樣完善的 Edge TTS 客戶端支持,這常常讓人頭疼。
好消息是,現在我們可以借助 UnifiedTTS 提供的開放 API,免費調用 EdgeTTS 服務。 更棒的是,它不僅兼容 EdgeTTS,還可平滑切換至 Azure TTS、MiniMax TTS、ElevenLabs TTS 等多種語音模型,讓開發者能夠自由在多音色與多模型間切換,而無需改動核心業務邏輯。
本文將帶你從零搭建一個基于 Spring Boot 的語音合成服務,實現輸入文本 → 輸出真人語音 MP3 文件的完整流程。
創建 Spring Boot 項目
我們先通過 start.spring.io 快速構建項目骨架,添加 Web 模塊以提供 REST 接口服務。
Maven 依賴配置
<dependencies>
<!-- Spring Boot Web 模塊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>目錄結構示例(Linux 路徑格式):
/src
└── main
├── java
│ └── com
│ └── icoderoad
│ └── tts
│ ├── UnifiedTtsProperties.java
│ ├── UnifiedTtsService.java
│ └── controller
│ └── TtsController.java
└── resources
└── application.properties獲取 UnifiedTTS API Key
- 打開 UnifiedTTS 官網,使用 GitHub 一鍵登錄;
- 進入左側菜單的 “API 密鑰” 頁面;
- 點擊“創建 API Key”,復制保存。
這個 Key 將作為后續調用接口的憑證。
接入 UnifiedTTS 接口
我們將按照官方文檔(https://unifiedtts.com/zh/api-docs/tts-sync)實現一個完整的 TTS 方案,包括:
- 配置文件;
- 請求/響應數據模型;
- 服務層封裝;
- 測試與文件輸出。
配置文件
文件路徑:/src/main/resources/application.properties
unified-tts.host=https://unifiedtts.com
unified-tts.api-key=your-api-key-here配置類
文件路徑:/src/main/java/com/icoderoad/tts/UnifiedTtsProperties.java
package com.icoderoad.tts;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* UnifiedTTS 配置屬性綁定類
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "unified-tts")
public class UnifiedTtsProperties {
/** 接口主機地址 */
private String host;
/** API Key(從 UnifiedTTS 控制臺獲取) */
private String apiKey;
}請求與響應模型
文件路徑:/src/main/java/com/icoderoad/tts/model/UnifiedTtsRequest.java
package com.icoderoad.tts.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* UnifiedTTS 請求參數模型
*/
@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;
}服務實現類
文件路徑:/src/main/java/com/icoderoad/tts/service/UnifiedTtsService.java
package com.icoderoad.tts.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* UnifiedTTS 響應結果封裝
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UnifiedTtsResponse {
private boolean success;
private String message;
private long timestamp;
private UnifiedTtsResponseData data;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class UnifiedTtsResponseData {
@JsonProperty("request_id")
private String requestId;
@JsonProperty("audio_url")
private String audioUrl;
@JsonProperty("file_size")
private long fileSize;
}
}單元測試驗證
文件路徑:/src/test/java/com/icoderoad/tts/UnifiedTtsServiceTest.java
package com.icoderoad.tts.service;
import com.icoderoad.tts.UnifiedTtsProperties;
import com.icoderoad.tts.model.UnifiedTtsRequest;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
/**
* UnifiedTTS 語音合成服務
*/
@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 接口生成音頻字節流
*/
public byte[] synthesize(UnifiedTtsRequest request) {
ResponseEntity<byte[]> response = restClient.post()
.uri(properties.getHost() + "/api/v1/common/tts-sync")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_OCTET_STREAM, MediaType.valueOf("audio/mpeg"))
.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());
}
/**
* 將生成的音頻寫入文件
*/
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: " + outputPath, e);
}
}
}運行與效果驗證
執行測試后,項目目錄下會自動生成 /test-result/xxxx.mp3 文件。 播放后你將聽到自然流暢的語音效果,幾乎可與真人語音媲美。
常用參數與音色配置
- model:選擇語音模型,如
edge-tts - voice:音色(如
en-US-JennyNeural) - format:輸出格式(支持
mp3、wav等) - speed/pitch/volume:語速、音調、音量可調節
詳細音色清單與參數請參考官方文檔: ?? https://unifiedtts.com/zh/api-docs/tts-sync
結語
本文展示了如何在 Spring Boot 項目中快速集成 UnifiedTTS,并調用免費的 EdgeTTS 服務,實現高品質的文本轉語音功能。 通過 UnifiedTTS 的統一接口,你無需維護多個廠商 SDK,就能輕松切換語音模型與音色,實現更靈活的語音播報功能。
在生產環境中,你還可以進一步完善以下能力:
- 增加緩存與音頻重用;
- 增強錯誤重試與異常監控;
- 實現并發任務隊列與異步處理。
這樣,一個高性能、可擴展、成本為零的語音合成系統就大功告成了。






























