ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)

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/图模型)可省云端费用

六、原理图解:生成式多模态请求-响应

文生图

TTS

文字 prompt

模型类型

ImageModel

SpeechModel

图片 URL/base64

音频字节/流式分片


七、踩坑 FAQ

坑 1:图片 URL 过期

现象:返回的图片 URL 过段时间就打不开了。
原因:云端图片 URL 有有效期。
解决:拿到 URL 后及时下载落盘到对象存储。

坑 2:TTS 音频格式/编码不匹配

现象:前端播放音频失败或音质异常。
原因:音频格式(mp3/wav/opus)或编码与前端不匹配。
解决:核对 TTS 输出格式,统一转成前端支持的格式(如 mp3)。

坑 3:流式分片拼接顺序错

现象:流式音频分片拼起来后播放乱序。
原因:分片顺序没保证,或拼接逻辑错。
解决:按分片序号拼接,注意结束标记。

坑 4:生成成本高

现象:文生图/TTS 调用多,成本飙升。
原因:生成式多模态单价高,无缓存无配额。
解决:加缓存(相同 prompt 复用)+ 配额限流 + 必要时换本地模型。

坑 5:图片/音频没有落盘,丢了

现象:重启或过期后生成物丢失。
原因:只返回了 URL/临时数据,没持久化。
解决:生成后立即落盘对象存储/数据库,记录元数据。


八、小结与合集导航

本篇补全生成式多模态:

  • 文生图ImageModel/ImagePrompt
  • TTSSpeechModel/SpeechPrompt
  • 2.0 流式音频分片
  • 落盘 + 缓存 + 限流的成本控制

下一篇:《流式输出对接前端》——类 ChatGPT 打字机效果,Flux + SSE 打通前后端。


九、互动钩子

投票:文生图和 TTS,你更需要哪个?

  • 文生图
  • TTS 语音合成
  • 两个都要
  • 都用不上

评论区聊聊你的生成式多模态场景;源码见置顶评论。

返回列表