本文将带你深入了解如何在Spring AI框架中使用文本转语音(TTS)功能。我们会详细介绍相关的接口、依赖配置,以及如何编写代码实现文本转语音,还会涉及实时音频流的处理。掌握这些内容,能帮助你在开发中轻松实现语音交互功能。

一、Spring AI中的文本转语音接口

Spring AI为开发者提供了与支持的大语言模型(LLM)的文本转语音API进行交互的能力,比如可以和OpenAI的tts-1、tts-1-hd模型对接。这里主要涉及两个关键接口:

(一)SpeechModel接口

这个接口的作用是向文本转语音API发送语音请求,并以指定的音频格式返回生成的语音响应。通过它,我们能把文本信息转化为栩栩如生的语音。

(二)StreamingSpeechModel接口

该接口可以根据输入的文本实时生成音频字节流。它返回的是一个包含语音响应的Flux序列,每个响应都包含一部分生成的音频内容。这种方式就像播客一样,能够逐段传输音频,对于构建类似音频播放器的功能非常有用。

目前,OpenAiAudioSpeechModel类实现了这两个接口,这意味着它既支持一次性生成完整音频响应,也支持以流的方式生成音频。

二、使用SpeechModel快速上手

要在项目中使用SpeechModel,首先得添加依赖。我们需要在项目里引入spring-ai-openai-spring-boot-starter依赖。关于如何搭建一个新的Spring AI项目,可以参考相关的入门教程。在pom.xml文件中添加如下依赖:

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 

添加好依赖后,Spring Boot会自动进行配置。它会创建OpenAiAudioSpeechModel类的实例,并设置一些默认配置。不过,这些配置可以根据实际需求进行修改。配置项如下:

# API Key是必填项,需替换为自己的OpenAI API Key spring.ai.openai.api-key=${OPENAI_API_KEY} # 选择使用的语音模型,这里以tts-1为例 spring.ai.openai.audio.speech=tts-1 # 选择语音,比如alloy、echo、fable、onyx、nova、shimmer等 spring.ai.openai.audio.speech.options.voice=alloy # 选择响应音频格式,如mp3、opus、aac、flac、wav、pcm等 spring.ai.openai.audio.speech.options.response-format=mp3 # 设置语速,取值范围从0.0(最慢)到1.0(最快),这里设置为正常语速 spring.ai.openai.audio.speech.options.speed=1.0 

配置完成后,就可以在Spring管理的bean中注入SpeechModelStreamingSpeechModel类型的bean了。

三、编程方式创建SpeechModel

(一)使用默认配置创建

如果想使用默认配置创建SpeechModel bean,只需要提供OpenAI的API Key即可。示例代码如下:

// 创建OpenAiAudioApi实例,传入系统环境变量中的OpenAI API Key var openAiAudioApi = new OpenAiAudioApi(System.getenv("OPENAI_API_KEY")); // 使用OpenAiAudioApi实例创建OpenAiAudioSpeechModel,即SpeechModel的实例 var speechModel = new OpenAiAudioSpeechModel(openAiAudioApi); 

(二)自定义参数创建

要是想修改默认配置,使用自定义参数创建SpeechModel,可以借助OpenAiAudioSpeechOptions类。示例代码如下:

// 通过OpenAiAudioSpeechOptions.builder()构建器设置自定义参数 OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder() // 设置使用的模型为tts-1 .withModel(OpenAiAudioApi.TtsModel.TTS_1.getValue()) // 设置响应音频格式为mp3 .withResponseFormat(AudioResponseFormat.MP3) // 设置语音为alloy .withVoice(OpenAiAudioApi.SpeechRequest.Voice.ALLOY) // 设置语速为1.0 .withSpeed(1.0f) // 构建OpenAiAudioSpeechOptions实例 .build(); // 创建OpenAiAudioApi实例,传入系统环境变量中的OpenAI API Key OpenAiAudioApi openAiAudioApi = new OpenAiAudioApi(System.getenv("OPENAI_API_KEY")); // 使用OpenAiAudioApi实例和自定义的OpenAiAudioSpeechOptions实例创建SpeechModel SpeechModel speechModel = new OpenAiAudioSpeechModel(openAiAudioApi, speechOptions); 

四、文本转语音实战示例

SpeechModel bean初始化完成后,就可以使用它的call()方法将文本转换为语音了。示例代码如下:

// 调用SpeechModel的call()方法,传入包含待转换文本的SpeechPrompt对象 SpeechResponse speechResponse = speechModel.call(new SpeechPrompt(message)); // 获取转换后的语音音频字节数组 byte[] audio = speechResponse.getResult().getOutput(); 

下面是一个完整的Spring Boot控制器方法示例,用于接收前端传来的文本并返回转换后的语音:

@RestController class SpeechController { // 注入SpeechModel private final SpeechModel speechModel; public SpeechController(SpeechModel speechModel) { this.speechModel = speechModel; } // 处理POST请求,接收前端传来的文本并返回转换后的语音音频字节数组 @PostMapping("/speech") public byte[] speech(@RequestBody String message) { return speechModel.call(new SpeechPrompt(message)) .getResult() .getOutput(); } } 

我们可以使用Postman或其他工具来测试这个接口。接口返回的是原始字节数据,可以将其保存为mp3文件,然后通过播放音频文件来验证转换效果。

五、实时音频流处理

在实际应用中,有时需要像播客那样以流的方式获取音频,这时候就可以用到StreamingSpeechModel接口。和前面的文本转语音示例相比,大部分代码是相同的,只是调用的方法从call()变成了stream(),并且通常会选择适合网络流传输、低延迟的AudioResponseFormat.OPUS格式。示例代码如下:

@GetMapping("/stream-speech") public Flux<byte[]> streamingSpeech(@RequestParam String message) { // 通过OpenAiAudioSpeechOptions.builder()构建器设置响应音频格式为opus OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder() .withResponseFormat(AudioResponseFormat.OPUS) .build(); // 创建OpenAiAudioApi实例,传入系统环境变量中的OpenAI API Key OpenAiAudioApi openAiAudioApi = new OpenAiAudioApi(System.getenv("OPENAI_API_KEY")); // 使用OpenAiAudioApi实例和自定义的OpenAiAudioSpeechOptions实例创建StreamingSpeechModel StreamingSpeechModel streamingSpeechModel = new OpenAiAudioSpeechModel(openAiAudioApi, speechOptions); // 调用stream()方法,传入文本,返回音频字节流 return streamingSpeechModel.stream(message); } 

当在浏览器中调用这个API时,能看到响应是以分块的形式接收的。

六、总结

本文详细介绍了Spring AI中使用文本转语音功能的方法:

  1. 目前,该模块仅支持OpenAI的tts-1系列模型。
  2. SpeechModelStreamingSpeechModel是生成音频文件的主要接口,OpenAiAudioSpeechModel类对它们进行了实现。
  3. 只要在项目中添加spring-ai-openai-spring-boot-starter依赖,就可以使用默认配置的OpenAiAudioSpeechModel bean。
  4. 可以通过属性配置或使用OpenAiAudioSpeechOptions类进行Java配置,来定制音频的语速、语音等参数。

希望通过本文的学习,大家能在项目中熟练运用Spring AI的文本转语音功能,实现更丰富的语音交互应用。