文章目录
-
- [一、图像模型(Image Model)](#一、图像模型(Image Model))
-
- [1.1 什么是图像模型](#1.1 什么是图像模型)
- [1.2 OpenAI 图像生成入门](#1.2 OpenAI 图像生成入门)
-
- 环境搭建(父子工程)
- [API Key 配置](#API Key 配置)
- 图像生成代码示例
- 常见异常处理
- [1.3 Image Model API 详解](#1.3 Image Model API 详解)
- [1.4 Azure OpenAI](#1.4 Azure OpenAI)
- [1.5 百度千帆(QianFan)](#1.5 百度千帆(QianFan))
- [二、语音模型(Speech Model)](#二、语音模型(Speech Model))
- [三、Spring AI Alibaba](#三、Spring AI Alibaba)
- 四、核心要点总结
-
- [4.1 架构设计要点](#4.1 架构设计要点)
- [4.2 配置要点](#4.2 配置要点)
- [4.3 常见问题](#4.3 常见问题)
- [4.4 最佳实践](#4.4 最佳实践)
一、图像模型(Image Model)
1.1 什么是图像模型
图像模型是专注于处理与理解视觉数据的人工智能模型,主要分为两类:
| 类型 | 功能 | 典型应用 |
|---|---|---|
| 图像生成模型 | 根据文本/图像条件合成新图像 | DALL-E、通义万相 |
| 图像理解模型 | 对输入图像进行分析识别 | 分类、检测、分割 |
Spring AI 的设计优势 :提供了统一的 ImageModel 接口,允许开发者通过最小的代码在不同的图像模型之间切换。
1.2 OpenAI 图像生成入门
环境搭建(父子工程)
父工程 pom.xml 配置:
xml
<properties>
<spring-ai.version>1.0.1</spring-ai.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.3</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子项目依赖:
xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
</dependencies>
API Key 配置
- 注册 OpenAI 账号并创建 API Key
- 充值(图像模型需要付费)
- 配置到环境变量或启动参数
java
// 启动类中配置代理(本地开发需要)
System.setProperty("http.proxyHost", System.getenv("proxyHost"));
System.setProperty("https.proxyHost", System.getenv("proxyHost"));
System.setProperty("http.proxyPort", "7890");
System.setProperty("https.proxyPort", "7890");
图像生成代码示例
java
@RestController
@RequestMapping("/openai")
public class OpenAIController {
@Autowired
private OpenAIImageModel openaiImageModel;
@GetMapping("/image")
public void image(String message, HttpServletResponse response) {
ImageResponse imageResponse = openaiImageModel.call(
new ImagePrompt("孩子在海边玩耍",
OpenAIImageOptions.builder()
.quality("hd") // 质量:standard/hd
.N(1) // 生成数量(dall-e-3只能为1)
.height(1024)
.width(1024)
.build())
);
String imageUrl = imageResponse.getResult().getOutput().getUrl();
// 输出到浏览器...
}
}
常见异常处理
| 异常类型 | 错误信息 | 解决方案 |
|---|---|---|
| 参数不合法 | Invalid value: 'auto' |
quality 只支持 standard/hd |
| 计费限制 | Billing hard limit has been reached |
充值或检查余额 |
| 身份认证 | organization must be verified |
完成组织验证 |
1.3 Image Model API 详解
核心接口
java
@FunctionalInterface
public interface ImageModel extends Model<ImagePrompt, ImageResponse> {
ImageResponse call(ImagePrompt request);
}
ImagePrompt(图像请求)
封装文本提示词,支持带权重的多语言描述:
java
// 简单用法
ImagePrompt prompt = new ImagePrompt("一只戴着墨镜的猫在弹吉他");
// 带权重的用法(支持权重的模型)
ImageMessage msg = new ImageMessage("太空站内部景观,高科技感", 1.2f);
ImageOptions(图像选项)
可移植选项接口,各模型可扩展自己的选项:
| 参数 | 说明 | 默认值 |
|---|---|---|
| N | 生成图像数量 | 1 |
| model | 模型名称 | 模型相关 |
| width/height | 图像宽高 | 模型相关 |
OpenAIImageOptions(OpenAI专属选项)
| 属性 | 配置属性 | 描述 |
|---|---|---|
| quality | spring.ai.openai.image.options.quality |
standard/hd(仅dall-e-3) |
| style | spring.ai.openai.image.options.style |
vivid/natural(仅dall-e-3) |
| responseFormat | spring.ai.openai.image.options.response_format |
url/b64_json |
java
OpenAiImageOptions options = OpenAiImageOptions.builder()
.quality("standard")
.N(1)
.height(1024)
.width(1024)
.responseFormat("b64_json") // 返回Base64格式
.style("natural")
.build();
ImageResponse(图像响应)
java
public class ImageResponse implements ModelResponse<ImageGeneration> {
private final List<ImageGeneration> imageGenerations;
// 获取第一张图片
ImageGeneration result = response.getResult();
// 获取图片URL或Base64数据
String url = result.getOutput().getUrl();
String b64Json = result.getOutput().getB64Json();
}
1.4 Azure OpenAI
Azure OpenAI 与 OpenAI 的关系:OpenAI负责训练模型,微软负责将模型部署到Azure云平台。
配置示例:
yaml
spring:
ai:
azure:
openai:
api-key: ${AZURE_OPENAI_API_KEY}
endpoint: https://your-resource.openai.azure.com/
image:
options:
model: dall-e-3
1.5 百度千帆(QianFan)
千帆 V2 版本已完全兼容 OpenAI 标准接口。
聊天模型配置
yaml
spring:
ai:
openai:
api-key: ${QIANFAN_API_KEY}
base-url: https://qianfan.baidubce.com
chat:
options:
model: "ernie-tiny-8k"
temperature: 0.7
completions-path: /v2/chat/completions # 关键:V2接口路径
图像模型配置
yaml
spring:
ai:
openai:
api-key: ${QIANFAN_API_KEY}
base-url: https://qianfan.baidubce.com
image:
options:
model: "irag-1.0"
images-path: /v2/images/generations
二、语音模型(Speech Model)
2.1 概述
语音模型分为两类:
- 语音识别(ASR):将语音转换为文本
- 语音合成(TTS):将文本转换为自然语音
Spring AI 提供了 SpeechModel 和 StreamingSpeechModel 接口。
2.2 OpenAI TTS 快速入门
添加依赖
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
代码示例
java
@RestController
@RequestMapping("/openai")
public class SpeechController {
@Autowired
private OpenAiAudioSpeechModel speechModel;
@GetMapping("/tts")
public void tts(String text, HttpServletResponse response) {
SpeechPrompt speechPrompt = new SpeechPrompt(text,
OpenAiAudioSpeechOptions.builder()
.model("tts-1")
.voice(Voice.NOVA) // 女声
.responseFormat(AudioResponseFormat.MP3)
.speed(1.0f)
.build());
SpeechResponse speechResponse = speechModel.call(speechPrompt);
byte[] audioData = speechResponse.getResult().getOutput();
// 保存为文件
try (FileOutputStream fos = new FileOutputStream("output.mp3")) {
fos.write(audioData);
}
}
}
2.3 OpenAiAudioSpeechOptions 参数详解
| 参数 | 配置属性 | 描述 | 可选值 |
|---|---|---|---|
| model | spring.ai.openai.audio.speech.options.model |
语音模型 | tts-1, tts-1-hd |
| voice | spring.ai.openai.audio.speech.options.voice |
音色 | alloy, echo, fable, onyx, nova, shimmer |
| response_format | spring.ai.openai.audio.speech.options.response_format |
输出格式 | mp3, wav, aac, opus |
| speed | spring.ai.openai.audio.speech.options.speed |
语速 | 0.25~4.0(默认1.0) |
音色特点:
| 音色 | 特点 |
|---|---|
| Alloy | 清晰、中性、现代感 |
| Echo | 沉稳、温暖、值得信赖的男声 |
| Fable | 富有表现力、生动、讲故事的声音 |
| Onyx | 深沉、有力、权威的男声 |
| Nova | 清晰、明亮、充满活力且友善的女声 |
| Shimmer | 柔和、悦耳、平静的女声 |
2.4 API 核心类
java
// SpeechPrompt:请求封装
public class SpeechPrompt implements ModelRequest<SpeechMessage> {
private final SpeechMessage message;
private OpenAiAudioSpeechOptions speechOptions;
}
// SpeechMessage:待转换文本
public class SpeechMessage {
private String text;
}
// SpeechResponse:响应封装
public class SpeechResponse implements ModelResponse<Speech> {
private final Speech speech;
}
// Speech:音频数据
public class Speech implements ModelResult<byte[]> {
private final byte[] audio; // 音频二进制数据
}
三、Spring AI Alibaba
3.1 准备工作
- 开通阿里云百炼模型服务(新用户有免费额度)
- 获取 API Key
3.2 项目配置
添加依赖:
xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
配置文件:
yaml
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
3.3 图像生成(通义万相)
入门示例
java
@Autowired
private DashScopeImageModel imageModel;
@Test
void text2Img() {
ImageResponse response = imageModel.call(
new ImagePrompt("孩子在海边玩耍")
);
String imageUrl = response.getResult().getOutput().getUrl();
System.out.println(imageUrl);
}
DashScopeImageOptions 参数
| 参数 | 描述 | 取值 |
|---|---|---|
| model | 模型名称 | wanx-v1, wan2.2-t2i-flash, wan2.2-t2i-plus, qwen-image |
| n | 生成数量 | 万相:1-4;通义:只能为1 |
| width/height | 图像宽高 | 万相v2:512-1440任意组合 |
| size | 图像大小(已废弃) | 1024x1024, 720x1280等 |
| style | 风格(仅wanx-v1) | photography, portrait, 3d cartoon, anime, oil painting, watercolor, sketch, chinese painting, flat illustration |
| seed | 随机种子 | 0~4294967290 |
| watermark | 水印 | true/false |
高级用法示例
java
// 自定义分辨率
DashScopeImageOptions options = DashScopeImageOptions.builder()
.withModel("wan2.2-t2i-flash")
.withN(3)
.withWidth(512)
.withHeight(1440)
.withWatermark(true)
.build();
// 图生图(基于参考图)
DashScopeImageOptions options = DashScopeImageOptions.builder()
.withRefImg("https://example.com/image.png")
.withRefMode("refonly") // refonly: 风格参考;repaint: 内容参考
.withRefStrength(1.0f) // 相似度 0~1
.build();
// 指定风格
DashScopeImageOptions options = DashScopeImageOptions.builder()
.withStyle("<sketch>") // 素描风格
.build();
3.4 语音合成
入门示例
java
@Autowired
private DashScopeSpeechSynthesisModel speechModel;
@Test
void text2Audio() throws IOException {
DashScopeSpeechSynthesisOptions options =
DashScopeSpeechSynthesisOptions.builder()
.model("cosyvoice-v2")
.voice("longmiao_v2")
.speed(0.5f)
.pitch(1.2)
.volume(50)
.build();
SpeechSynthesisResponse response = speechModel.call(
new SpeechSynthesisPrompt("文本内容", options)
);
ByteBuffer audio = response.getResult().getOutput().getAudio();
// 保存音频文件...
}
参数说明
| 参数 | 描述 | 取值范围 |
|---|---|---|
| model | 模型 | cosyvoice-v1/v2/v3, sambert-zhichu-v1 |
| voice | 音色 | 参考官方音色列表 |
| speed | 语速 | 0.5~2.0 |
| pitch | 语调 | 0.5~2.0 |
| volume | 音量 | 0~100 |
| response_format | 输出格式 | mp3, wav, pcm |
3.5 语音识别
java
@Autowired
private DashScopeAudioTranscriptionModel transcriptionModel;
@Test
void stt() {
Resource resource = new DefaultResourceLoader()
.getResource("https://example.com/audio.wav");
AudioTranscriptionResponse response = transcriptionModel.call(
new AudioTranscriptionPrompt(resource,
DashScopeAudioTranscriptionOptions.builder()
.withModel("paraformer-v2")
.build())
);
System.out.println(response.getResult().getOutput());
}
3.6 视频生成
java
@Test
void textToVideo() {
VideoSynthesis vs = new VideoSynthesis();
VideoSynthesisParam param = VideoSynthesisParam.builder()
.model("wan2.2-t2v-plus")
.prompt("一只小猫在月光下奔跑")
.size("1920*1080")
.build();
VideoSynthesisResult result = vs.call(param);
String videoUrl = result.getOutput().getVideoUrl();
}
四、核心要点总结
4.1 架构设计要点
- 统一接口抽象 :
ImageModel、SpeechModel等接口屏蔽不同厂商差异 - 可插拔设计:通过配置即可切换 OpenAI、Azure、百度千帆、阿里百炼
- Spring Boot 自动配置:开箱即用,减少样板代码
4.2 配置要点
| 平台 | 关键配置 | 注意事项 |
|---|---|---|
| OpenAI | api-key |
需要代理,需要充值 |
| Azure OpenAI | api-key + endpoint |
企业级部署 |
| 百度千帆 | base-url + completions-path |
V2接口兼容OpenAI |
| 阿里百炼 | api-key |
新用户有免费额度 |
4.3 常见问题
- 代理配置:本地开发需在启动类配置代理
- 计费问题:图像、语音模型通常需要付费
- 参数限制:不同模型的参数取值范围不同(如 n 值)
- 响应格式:支持 URL 和 Base64 两种返回格式
4.4 最佳实践
- 将 API Key 配置到环境变量,避免硬编码
- 生产环境使用 Azure OpenAI 或阿里百炼等企业级服务
- 根据场景选择合适的模型(速度优先 vs 质量优先)
- 合理使用缓存减少重复调用成本
📌 扩展阅读: