diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java index 38f99312d1d..eb2196a82c0 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java @@ -392,7 +392,13 @@ public enum Voice { @JsonProperty("nova") NOVA("nova"), @JsonProperty("shimmer") - SHIMMER("shimmer"); + SHIMMER("shimmer"), + @JsonProperty("sage") + SAGE("sage"), + @JsonProperty("coral") + CORAL("coral"), + @JsonProperty("ash") + ASH("ash"); // @formatter:on public final String value; diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/speech/OpenAiSpeechModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/speech/OpenAiSpeechModelIT.java index 7d9fe45c0c1..c36cc4afb82 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/speech/OpenAiSpeechModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/speech/OpenAiSpeechModelIT.java @@ -20,6 +20,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import reactor.core.publisher.Flux; import org.springframework.ai.openai.OpenAiAudioSpeechOptions; @@ -111,4 +113,22 @@ void shouldStreamNonEmptyResponsesForValidSpeechPrompts() { assertThat(response.getResult().getOutput()).isNotEmpty()); } + @ParameterizedTest(name = "{0} : {displayName} ") + @ValueSource(strings = { "alloy", "echo", "fable", "onyx", "nova", "shimmer", "sage", "coral", "ash" }) + void speechVoicesTest(String voice) { + OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder() + .voice(OpenAiAudioApi.SpeechRequest.Voice.valueOf(voice.toUpperCase())) + .speed(SPEED) + .responseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3) + .model(OpenAiAudioApi.TtsModel.TTS_1.value) + .build(); + SpeechPrompt speechPrompt = new SpeechPrompt("Today is a wonderful day to build something people love!", + speechOptions); + SpeechResponse response = this.speechModel.call(speechPrompt); + byte[] audioBytes = response.getResult().getOutput(); + assertThat(response.getResults()).hasSize(1); + assertThat(response.getResults().get(0).getOutput()).isNotEmpty(); + assertThat(audioBytes).hasSizeGreaterThan(0); + } + }