【Spring AI 】图像与语音模型实战

文章目录

一、图像模型(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 配置
  1. 注册 OpenAI 账号并创建 API Key
  2. 充值(图像模型需要付费)
  3. 配置到环境变量或启动参数
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 提供了 SpeechModelStreamingSpeechModel 接口。

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 准备工作

  1. 开通阿里云百炼模型服务(新用户有免费额度)
  2. 获取 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 架构设计要点

  1. 统一接口抽象ImageModelSpeechModel 等接口屏蔽不同厂商差异
  2. 可插拔设计:通过配置即可切换 OpenAI、Azure、百度千帆、阿里百炼
  3. Spring Boot 自动配置:开箱即用,减少样板代码

4.2 配置要点

平台 关键配置 注意事项
OpenAI api-key 需要代理,需要充值
Azure OpenAI api-key + endpoint 企业级部署
百度千帆 base-url + completions-path V2接口兼容OpenAI
阿里百炼 api-key 新用户有免费额度

4.3 常见问题

  1. 代理配置:本地开发需在启动类配置代理
  2. 计费问题:图像、语音模型通常需要付费
  3. 参数限制:不同模型的参数取值范围不同(如 n 值)
  4. 响应格式:支持 URL 和 Base64 两种返回格式

4.4 最佳实践

  1. 将 API Key 配置到环境变量,避免硬编码
  2. 生产环境使用 Azure OpenAI 或阿里百炼等企业级服务
  3. 根据场景选择合适的模型(速度优先 vs 质量优先)
  4. 合理使用缓存减少重复调用成本

📌 扩展阅读

相关推荐
Yuanxl9032 小时前
神经网络-Sequential 应用与实战
人工智能·深度学习·神经网络
RH2312112 小时前
2026.4.16Linux 管道
java·linux·服务器
zmsofts2 小时前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
火山引擎开发者社区2 小时前
Seedance 2.0 1080P 生成能力正式上线
人工智能
冬奇Lab3 小时前
一天一个开源项目(第79篇):生化危机女主角亲自开源的 AI 记忆系统 MemPalace
人工智能·开源·资讯
冬奇Lab3 小时前
Android 开发要变天了:Google 专为 Agent 重建工具链,Token 减少 70%、速度提升 3 倍
android·人工智能·ai编程
慧一居士3 小时前
Open WebUI 和Ollama 区别对比和关系
人工智能
云安全助手3 小时前
2026年AI安全大模型实战指南:快快云安全AI能力全景解析
人工智能·网络安全·claude
fuquxiaoguang3 小时前
当AI开始改写自己的“进化引擎”:从DGM到HyperAgents
人工智能·hyperagents