Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)
Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)
系列:Spring AI 深入浅出(第 17 篇)
版本:Spring AI 2.0.1 / Spring Boot 4.1.x / JDK 21
标签:#SpringAI #文生图 #TTS #语音合成
前置阅读:第 16 篇《图像理解 Vision》
预计字数:6000 字|可复制源码 + 生成式多模态图 + 踩坑 FAQ
本文将解决:除了"看懂",多模态还能"造出来"——文生图 + 语音合成(TTS),一篇讲完生成式多模态。
你将学到:
- 文生图:
ImageModel/ImagePrompt - TTS:
SpeechModel/SpeechPrompt - 2.0 流式音频分片
- 生成物落盘与成本控制
一、版本标注
本文基于 Spring AI 2.0.1 / Boot 4.1 / JDK 21。文生图走ImageModel/ImagePrompt,TTS 走SpeechModel/SpeechPrompt(不同厂商 starter 提供对应实现);2.0 流式音频分片的具体 API 以 2.0.1 官方文档为准。
二、文生图:ImageModel / ImagePrompt
文生图是"输入文字 → 输出图片",走独立的ImageModel抽象(和聊天的ChatModel分开):
importorg.springframework.ai.image.ImageModel;importorg.springframework.ai.image.ImagePrompt;importorg.springframework.ai.image.ImageResponse;@ServicepublicclassImageService{privatefinalImageModelimageModel;publicImageService(ImageModelimageModel){this.imageModel=imageModel;}publicStringgenerateImage(Stringprompt){ImageResponseresponse=imageModel.call(newImagePrompt(prompt));// 取第一张图(返回 URL 或 base64,取决于实现)returnresponse.getResult().getOutput().getUrl();}}要点:
ImageModel.call(ImagePrompt)返回ImageResponse- 图片输出一般是URL(云端)或base64(本地模型)
- URL 会过期,生产上要及时落盘到对象存储
三、TTS:SpeechModel / SpeechPrompt
TTS 是"输入文字 → 输出音频":
importorg.springframework.ai.speech.SpeechModel;importorg.springframework.ai.speech.SpeechPrompt;importorg.springframework.ai.speech.SpeechResponse;@ServicepublicclassSpeechService{privatefinalSpeechModelspeechModel;publicSpeechService(SpeechModelspeechModel){this.speechModel=speechModel;}publicbyte[]textToSpeech(Stringtext){SpeechResponseresponse=speechModel.call(newSpeechPrompt(text));returnresponse.getResult().getOutput().getAudio();// 音频字节}}得到的音频字节可写文件、存对象存储,或直接返回前端播放。
四、2.0 流式音频分片
长文本的 TTS 如果等全部生成完才返回,用户要等很久。2.0 支持流式音频分片——边合成边返回音频块:
// 思路:流式 TTS,边生成边拿到音频分片// 精确 API 以 2.0.1 官方文档为准(Flux<byte[]> 或类似)适用:长文本朗读、实时语音播报等需要低延迟的场景。
五、生成物落盘与成本控制
生成式多模态(尤其文生图、长文本 TTS)成本不低,要控制:
| 手段 | 说明 |
|---|---|
| 缓存 | 相同 prompt 不重复生成,直接返回缓存 |
| 落盘 | URL 会过期,及时存对象存储/本地 |
| 限流 | 文生图/TTS 设配额,防止刷爆成本 |
| 选型 | 本地模型(如 Ollama 的 TTS/图模型)可省云端费用 |
六、原理图解:生成式多模态请求-响应
七、踩坑 FAQ
坑 1:图片 URL 过期
现象:返回的图片 URL 过段时间就打不开了。
原因:云端图片 URL 有有效期。
解决:拿到 URL 后及时下载落盘到对象存储。
坑 2:TTS 音频格式/编码不匹配
现象:前端播放音频失败或音质异常。
原因:音频格式(mp3/wav/opus)或编码与前端不匹配。
解决:核对 TTS 输出格式,统一转成前端支持的格式(如 mp3)。
坑 3:流式分片拼接顺序错
现象:流式音频分片拼起来后播放乱序。
原因:分片顺序没保证,或拼接逻辑错。
解决:按分片序号拼接,注意结束标记。
坑 4:生成成本高
现象:文生图/TTS 调用多,成本飙升。
原因:生成式多模态单价高,无缓存无配额。
解决:加缓存(相同 prompt 复用)+ 配额限流 + 必要时换本地模型。
坑 5:图片/音频没有落盘,丢了
现象:重启或过期后生成物丢失。
原因:只返回了 URL/临时数据,没持久化。
解决:生成后立即落盘对象存储/数据库,记录元数据。
八、小结与合集导航
本篇补全生成式多模态:
- 文生图
ImageModel/ImagePrompt - TTS
SpeechModel/SpeechPrompt - 2.0 流式音频分片
- 落盘 + 缓存 + 限流的成本控制
下一篇:《流式输出对接前端》——类 ChatGPT 打字机效果,Flux + SSE 打通前后端。
九、互动钩子
投票:文生图和 TTS,你更需要哪个?
- 文生图
- TTS 语音合成
- 两个都要
- 都用不上
评论区聊聊你的生成式多模态场景;源码见置顶评论。