引言
在项目中,我们需要实现文本转语音(TTS)功能,为了满足对响应速度的要求,我们选用了科大讯飞提供的API服务,并将生成的音频文件存储到Cloudflare R2对象存储中。
为什么选择科大讯飞TTS API
科大讯飞作为国内领先的语音技术提供商,其TTS服务具有以下优势:
- 提供10500次免费请求,完全满足项目实训需求
- 支持多种声音选择(虽然免费版声音比较"AI感")
- 提供稳定可靠的Websocket接口
- 文档详细,接入方便
实现步骤
申请API并配置认证信息
首先需要在科大讯飞开放平台完成实名认证并开通服务,获取以下关键信息:
- App ID
- API Key
- API Secret
将这些信息配置在
application.yml
中:实现TTS服务核心代码
TtsController类
TtsService类
核心服务类
TtsService
主要完成以下功能:- 构建鉴权URL:通过API Key和Secret生成带有鉴权信息的请求URL
- 建立Websocket连接:使用OkHttpClient建立与讯飞服务的连接
- 发送请求数据:构造包含文本和配置参数的JSON请求
- 处理响应:接收音频数据并保存
部分代码参考了官方提供的java版本demo,但根据项目做出了修改
- 首先先将配置参数注入:
通过Spring的
@Value
注解从配置文件注入科大讯飞API所需的认证参数和默认配置。- 核心处理方法
这是TTS转换的入口方法,主要完成:文件名生成、鉴权URL构建和WebSocket连接准备。
- WebSocket连接处理(核心交互逻辑)
这部分实现了与讯飞API的核心交互:
onOpen
:连接建立后发送TTS请求参数
onMessage
:接收并处理音频数据片段
- 音频接收完成后上传到R2存储
- 鉴权URL生成方法
这部分是官方demo提供的
- ByteArrayMultipartFile 实现
测试
使用apifox测试接口,返回符合预期

总结
通过科大讯飞TTS API和Cloudflare R2对象存储,我们实现了完整的文本转语音服务流程。
讯飞免费版的声音确实比较"AI感",缺乏真人感,而有真人感的贵到离谱,小小项目实训不值得啊不值得啊,准备去寻找其他模型了…如果不行,再到时候免费考虑试用付费声音吧…
