【AI应用开发捷径之路】第三课:文生图、文生视频、文生声音、多模态,如何选择合适的大模型?如何在SpringAI中应用这四种技术
作者:微信文章前言
文生图、文生视频、文生声音、多模态这些AI生成技术虽然都涉及“输入文字生成内容”,但在技术原理、输出形态和应用场景上有本质区别。下面通过一个对比表格让你快速了解它们的核心差异:
简单来说:
文生图、文生视频、文生声音 是生成式技术,目标是创造新的单一形式内容(图、视频、声音)。
多模态 是理解与推理技术,目标是连接、理解和处理不同形式的信息。
🌟 核心区别深入解读
文生图:技术最成熟,应用最广泛。关键在于对空间、构图和风格的理解与控制。
文生视频:技术前沿,挑战最大。不仅要保证单帧质量,更要确保帧与帧之间的时序连贯性和逻辑合理,难度呈指数级上升。
文生声音:
语音合成:高度拟人化,注重音色、情感和节奏。
音乐生成:涉及旋律、和声、配器等复杂音乐理论。
多模态:这是“大脑”和“桥梁”。它本身不直接生成精美的图片或视频,而是让AI能看懂图、听懂话,并基于此进行推理、对话或调用专门的生成工具。例如,你可以给多模态AI上传一张照片,让它描述内容,再根据描述生成一个新的故事或图片。
🎯 如何选择使用场景?
你需要一张宣传海报、插画或产品概念图 → 选择文生图。
你需要一段几秒到几十秒的创意短视频、动画片段 → 关注文生视频。
你需要为视频配音、创作一段背景音乐或生成特殊音效 → 使用文生声音。
你需要一个能看懂你上传的文档、图表,并能与你深入讨论的智能助手 → 依赖多模态AI。
💡 融合应用是趋势
在实际应用中,这些技术常被结合使用,形成一个创作闭环。例如:
用多模态AI分析一份产品报告,提炼核心卖点。
用文生图根据卖点生成一系列产品概念图。
用文生视频将概念图转化为动态广告短片。
用文生声音为短片生成解说配音和背景音乐。
如何在SpringAI中应用这四种技术
1. 引入BOM进行版本管理
首先,在你的pom.xml的 <dependencyManagement> 部分引入Spring AI的BOM。
强烈推荐使用当时最新的稳定版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>1.0.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入BOM后,在添加其他Spring AI组件依赖时就可以省略<version>标签了,所有版本都由BOM统一管理。
2. 添加模型Starter依赖
接下来,在<dependencies>部分添加你所需模型的Starter:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
3.配置文件
依赖添加完成后,你需要在
application.yml 或 application.properties 中进行配置。
spring:
ai:
dashscope:
api-key: sk-XXXXXX
chat:
options:
model: qwen-plus
api-key可以通过官网注册获取:https://bailian.console.aliyun.com/
4.测试
①阻断性返回测试
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = FaceApplication.class)
public class TestQwen {
@Test
public void testQwen(@Autowired DashScopeChatModel dashScopeChatModel) {
ChatResponse call = dashScopeChatModel.call(new Prompt("您好,你是谁"));
String text = call.getResult().getOutput().getText();
System.out.println(text);
}
}
②流式返回测试
package com.example;
import cn.myeasyai.FaceApplication;
import org.junit.jupiter.api.Test;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import reactor.core.publisher.Flux;
@SpringBootTest(classes = FaceApplication.class)
public class TestDeepseek {
/**
* 测试流式
* @param deepSeekChatModel
*/
@Test
public void testDeepseekStream(@Autowired DeepSeekChatModel deepSeekChatModel) {
Flux<String> stream = deepSeekChatModel.stream("你好,你是谁");
stream.toIterable().forEach(System.out::println);
}
}
5.文生图
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.cloud.ai.dashscope.image.DashScopeImageModel;
import com.alibaba.cloud.ai.dashscope.image.DashScopeImageOptions;
import org.junit.jupiter.api.Test;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author: yabushan
* @date: 2025/12/01
* @description: 测试阿里模型多模态
*/
@SpringBootTest(classes = FaceApplication.class)
public class TestAliModel {
/**
* 文生图
* @param dashScopeImageModel
*a cat:一只猫
*/
@Test
public voidtext2Img(@AutowiredDashScopeImageModel dashScopeImageModel){
DashScopeImageOptions build = DashScopeImageOptions.builder()
.withModel("wanx2.1-t2i-turbo")//使用万象模型
.withN(1)//生成多少张图片
.withWidth(512)//图片的宽度
.withHeight(512)//图片的高度
.withMaskImageUrl("https://example.com/mask.png") //带水印的图片
.build();
ImageResponse aCat = dashScopeImageModel.call(new ImagePrompt("a cat", build));
//获取图片URL
String url = aCat.getResult().getOutput().getUrl();
System.out.println("获取图片URL:");
System.out.println(url);
}
}
代码和生成效果
6.文生声音
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisModel;
import com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisOptions;
import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisPrompt;
import com.alibaba.cloud.ai.dashscope.audio.synthesis.SpeechSynthesisResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileOutputStream;
@SpringBootTest(classes = FaceApplication.class)
public class TextToSpeechTest {
/**
* 文生语音 - 基础示例
* https://help.aliyun.com/zh/model-studio/cosyvoice-voice-list?spm=a2c4g.11186623.help-menu-2400256.d_2_6_0_9.50c45a35PMcZgx&scm=20140722.H_2997333._.OR_help-T_cn~zh-V_1
*/
@Test
public void textToAudioBasic(@Autowired DashScopeSpeechSynthesisModel speechSynthesisModel) {
try {
System.out.println("=== 阿里百炼语音合成测试 ===");
// 1. 构建语音合成选项
DashScopeSpeechSynthesisOptions options = DashScopeSpeechSynthesisOptions.builder()
.voice("longyingtian")//声音
.model("cosyvoice-v2")//模型
.speed(1.0f) //语速
.build();
// 2. 构建语音合成请求
String textToSynthesize = "大家好,我是雅布珊";
SpeechSynthesisResponse res = speechSynthesisModel.call(new SpeechSynthesisPrompt(textToSynthesize, options));
File file=new File("D:\\TEMP\\"+"output_speech.wav");
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] array = res.getResult().getOutput().getAudio().array();
// 3.写入文件
fileOutputStream.write(array);
fileOutputStream.flush();
} catch (Exception e) {
System.err.println("语音合成失败: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 语音合成配置说明
*/
public void printConfigurationInfo() {
System.out.println("=== 阿里百炼语音合成配置说明 ===");
System.out.println("可用模型:");
System.out.println("- sambert-zhichu-v1: 标准语音合成");
System.out.println("- sambert-zhifu-v1: 高质量语音合成");
System.out.println();
System.out.println("可用发音人:");
System.out.println("- zhitian_emo: 知天情感(默认)");
System.out.println("- zhiyan_emo: 知燕情感");
System.out.println("- zhibei_emo: 知贝情感");
System.out.println("- zhizhe_emo: 知哲情感");
System.out.println();
System.out.println("音频格式:");
System.out.println("- wav: 无损音频,质量最好");
System.out.println("- mp3: 压缩格式,文件小");
System.out.println("- pcm: 原始音频数据");
System.out.println();
System.out.println("参数范围:");
System.out.println("- 采样率: 8000, 16000, 24000, 48000");
System.out.println("- 音调: -500.0 到 500.0");
System.out.println("- 语速: -500.0 到 500.0");
System.out.println("- 音量: 0 到 100");
System.out.println("==============================");
}
}
7.多模态
多模态模型:所谓的多模态是指将各种类型的文件丢给大模型,让大模型去理解后,以文本的形式表达文件的内容
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.content.Media;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.MimeTypeUtils;
/**
* 多模态模型:所谓的多模态是指将各种类型的文件丢给大模型,让大模型去理解后,以文本的形式表达文件的内容
*/
@SpringBootTest(classes = FaceApplication.class)
public class MultimodalTest {
@Test
public void testMultimodal(@AutowiredDashScopeChatModel dashScopeChatModel) {
var audioFile = new ClassPathResource("/f.png");
Media media = new Media(MimeTypeUtils.IMAGE_PNG, audioFile);
DashScopeChatOptions op = DashScopeChatOptions.builder()
.withMultiModel(true)
.withModel("qwen-vl-max-latest")
.build();
Prompt prompt = Prompt.builder().chatOptions(op).messages(UserMessage.builder().media(media).text("识别图片信息").build()).build();
ChatResponse call = dashScopeChatModel.call(prompt);
System.out.println(call.getResult().getOutput());
}
}
8.语音翻译
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.cloud.ai.dashscope.audio.DashScopeAudioTranscriptionModel;
import com.alibaba.cloud.ai.dashscope.audio.DashScopeAudioTranscriptionOptions;
import com.alibaba.cloud.ai.dashscope.audio.DashScopeSpeechSynthesisOptions;
import org.junit.jupiter.api.Test;
import org.springframework.ai.audio.transcription.AudioTranscriptionOptions;
import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt;
import org.springframework.ai.audio.transcription.AudioTranscriptionResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import java.io.File;
import java.net.MalformedURLException;
/**
* 语音翻译
*/
@SpringBootTest(classes = FaceApplication.class)
public class TextTranscriptionTest {
@Test
public void testAudio2Text(@AutowiredDashScopeAudioTranscriptionModel transcriptionModel) throws MalformedURLException {
AudioTranscriptionOptions transcriptionOptions = DashScopeAudioTranscriptionOptions.builder()
.withModel("paraformer-v2")
.build();
AudioTranscriptionPrompt audioTranscriptionPrompt = new AudioTranscriptionPrompt(
new UrlResource("https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251117/khzqvb/%E9%BE%99%E5%AE%89%E6%B4%8B.mp3"),
transcriptionOptions);
AudioTranscriptionResponse response = transcriptionModel.call(audioTranscriptionPrompt);
System.out.println(response.getResult().getOutput());
}
}
9.文生视频
由于SpringAi与alibaba的兼容还存在一些问题,这里我们直接用alibaba的SDK
①引入SDK
<!--引入原生的阿里巴巴的sdk-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.20.6</version>
</dependency>
②编写测试类
package com.example;
import cn.myeasyai.FaceApplication;
import com.alibaba.dashscope.aigc.videosynthesis.VideoSynthesis;
import com.alibaba.dashscope.aigc.videosynthesis.VideoSynthesisParam;
import com.alibaba.dashscope.aigc.videosynthesis.VideoSynthesisResult;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
/**
* 文生视频
*/
@SpringBootTest(classes = FaceApplication.class)
public class TextToVideo {
@Test
publicvoidtextToVideo() throws NoApiKeyException, InputRequiredException {
VideoSynthesis videoSynthesis = new VideoSynthesis();
VideoSynthesisParam para = VideoSynthesisParam.builder()
.model("wanx2.1-t2v-turbo")
.prompt("A man is playing a game")
.size("1280*720")
.apiKey("sk-密钥")
.build();
System.out.println("正在生成。。。。。。。");
VideoSynthesisResult call = videoSynthesis.call(para);
System.out.println(call.getOutput().getVideoUrl());
}
}
生成的视频
页:
[1]