音訊多模態:使用 Spring AI 和 OpenAI 擴充套件 AI 互動

工程 | Christian Tzolov | 2024年12月05日 | ...

這篇博文由我們優秀的貢獻者 Thomas Vitale 合著。

OpenAI 提供用於語音轉文字文字轉語音轉換的專用模型,這些模型以其效能和成本效益而聞名。Spring AI 透過 語音轉文字文字轉語音 (TTS) 集成了這些功能。

新的 音訊生成 功能 (gpt-4o-audio-preview) 更進一步,支援混合輸入和輸出模態。音訊輸入可以包含比純文字更豐富的資料。音訊可以傳達語氣和語調等細微資訊,並且結合音訊輸出可以實現非同步的語音轉語音互動。此外,這種新的多模態為創新應用開闢了可能性,例如結構化資料提取。開發者不僅可以從簡單的文字中提取結構化資訊,還可以從影像和音訊中提取,無縫地構建複雜的結構化物件。

Spring AI 音訊整合

Spring AI 多模態訊息 API 簡化了多模態功能與各種 AI 模型的整合。

現在,它完全支援 OpenAI 的 音訊輸入音訊輸出 模態,這在很大程度上歸功於為該功能開發做出貢獻的社群成員 Thomas Vitale

設定

請遵循 Spring AI-OpenAI 整合文件來準備您的環境。

音訊輸入

OpenAI 的 使用者訊息 API 支援使用 Media 型別在訊息中包含 base64 編碼的音訊檔案。支援的格式包括 audio/mp3audio/wav

示例:向輸入提示新增音訊

// Prepare the audio resource
var audioResource = new ClassPathResource("speech1.mp3");

// Create a user message with audio and send it to the chat model
String response = chatClient.prompt()
        .user(u -> u.text("What is this recording about?")
                    .media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource))                    
        .options(OpenAiChatOptions.builder()
            .withModel(OpenAiApi.ChatModel.GPT_4_O_AUDIO_PREVIEW).build())
        .call()
        .content();

音訊輸出生成

OpenAI 助手訊息 API 可以使用 Media 型別返回 base64 編碼的音訊檔案。

示例:生成音訊輸出

// Generate an audio response
ChatResponse response = chatClient
    .prompt("Tell me a joke about the Spring Framework")
    .options(OpenAiChatOptions.builder()
        .withModel(OpenAiApi.ChatModel.GPT_4_O_AUDIO_PREVIEW)
        .withOutputModalities(List.of("text", "audio"))
        .withOutputAudio(new AudioParameters(Voice.ALLOY, AudioResponseFormat.WAV))
        .build())
    .call()
    .chatResponse();

// Access the audio transcript
String audioTranscript = response.getResult().getOutput().getContent();

// Retrieve the generated audio
byte[] generatedAudio = response.getResult().getOutput().getMedia().get(0).getDataAsByteArray();

要生成音訊輸出,請在 OpenAiChatOptions 中指定音訊模態。使用 AudioParameters 類自定義語音和音訊格式。

語音聊天機器人演示

此示例演示瞭如何使用 Spring AI 構建支援輸入和輸出音訊的互動式聊天機器人。它展示了 AI 如何透過自然流暢的音訊響應增強使用者互動。

設定

新增 Spring AI OpenAI Starter

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

application.properties 中配置 API 金鑰、模型名稱和輸出音訊模態

spring.main.web-application-type=none

spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.options.model=gpt-4o-audio-preview

spring.ai.openai.chat.options.output-modalities=text,audio
spring.ai.openai.chat.options.output-audio.voice=ALLOY
spring.ai.openai.chat.options.output-audio.format=WAV

實現

下方詳細介紹了語音聊天機器人的 Java 實現,它使用音訊輸入和輸出來建立一個會話式 AI 助手。它利用 Spring AI 與 OpenAI 模型的整合來實現與使用者的無縫互動。

VoiceAssistantApplication

  • VoiceAssistantApplication 用作主應用程式。

  • CommandLineRunner bean 初始化聊天機器人

    • 使用 systemPrompt 配置 ChatClient 以獲取上下文理解,並使用記憶體中的聊天記憶來儲存會話歷史。
    • Audio 工具用於錄製使用者的語音輸入,並播放 AI 生成的音訊響應。
  • 聊天迴圈: 在迴圈內部

    • 語音錄製: audio.startRecording()audio.stopRecording() 方法處理錄製過程,暫停以等待使用者輸入。
    • 處理 AI 響應: 使用者訊息透過 chatClient.prompt() 傳送給 AI 模型。音訊資料封裝在 Media 物件中。
    • 響應處理: AI 生成的響應以文字形式檢索,並使用 Audio.play() 方法播放為音訊。

請參閱以下程式碼片段以瞭解實現細節

@Bean
public CommandLineRunner chatBot(ChatClient.Builder chatClientBuilder,
        @Value("${chatbot.prompt:classpath:/marvin.paranoid.android.txt}") Resource systemPrompt) {
    return args -> {

        var chatClient = chatClientBuilder.defaultSystem(systemPrompt)
            .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
            .build();

        try (Scanner scanner = new Scanner(System.in)) {

            Audio audio = new Audio();

            while (true) {                    
                audio.startRecording();
                System.out.print("Recording your question ... press <Enter> to stop! ");
                scanner.nextLine();
                audio.stopRecording();

                System.out.print("PROCESSING ... ");

                AssistantMessage response = chatClient.prompt()
                    .messages(new UserMessage("Please answer the questions in the audio input",
                            new Media(MediaType.parseMediaType("audio/wav"),
                                    new ByteArrayResource(audio.getLastRecording()))))
                    .call()
                    .chatResponse()
                    .getResult()
                    .getOutput();

                System.out.println("ASSISTANT: " + response.getContent());
                Audio.play(response.getMedia().get(0).getDataAsByteArray());
            }
        }
    };
}

用於捕獲和播放音訊的 Audio 工具是一個單獨的類,它利用了原生的 Java Sound API

 ▗▄▄▖▗▄▄▖ ▗▄▄▖ ▗▄▄▄▖▗▖  ▗▖ ▗▄▄▖     ▗▄▖ ▗▄▄▄▖                                    
▐▌   ▐▌ ▐▌▐▌ ▐▌  █  ▐▛▚▖▐▌▐▌       ▐▌ ▐▌  █                                      
 ▝▀▚▖▐▛▀▘ ▐▛▀▚▖  █  ▐▌ ▝▜▌▐▌▝▜▌    ▐▛▀▜▌  █                                      
▗▄▄▞▘▐▌   ▐▌ ▐▌▗▄█▄▖▐▌  ▐▌▝▚▄▞▘    ▐▌ ▐▌▗▄█▄▖                                    
▗▄▄▖  ▗▄▖ ▗▄▄▖  ▗▄▖ ▗▖  ▗▖ ▗▄▖ ▗▄▄▄▖▗▄▄▄      ▗▄▖ ▗▖  ▗▖▗▄▄▄ ▗▄▄▖  ▗▄▖ ▗▄▄▄▖▗▄▄▄ 
▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▛▚▖▐▌▐▌ ▐▌  █  ▐▌  █    ▐▌ ▐▌▐▛▚▖▐▌▐▌  █▐▌ ▐▌▐▌ ▐▌  █  ▐▌  █
▐▛▀▘ ▐▛▀▜▌▐▛▀▚▖▐▛▀▜▌▐▌ ▝▜▌▐▌ ▐▌  █  ▐▌  █    ▐▛▀▜▌▐▌ ▝▜▌▐▌  █▐▛▀▚▖▐▌ ▐▌  █  ▐▌  █
▐▌   ▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌  ▐▌▝▚▄▞▘▗▄█▄▖▐▙▄▄▀    ▐▌ ▐▌▐▌  ▐▌▐▙▄▄▀▐▌ ▐▌▝▚▄▞▘▗▄█▄▖▐▙▄▄▀

2024-12-01T11:00:11.274+01:00  INFO 31297 --- [voice-assistant-chatbot] [           main] s.a.d.a.m.VoiceAssistantApplication      : Started VoiceAssistantApplication in 0.827 seconds (process running for 1.054)

Recording your question ... press <Enter> to stop!

完整的演示可在 GitHub 上獲取:voice-assistant-chatbot

重要注意事項

  • 一小時音訊輸入大約相當於 128k token。
  • 該模型目前支援 modalities = ["text", "audio"]
  • 未來的更新可能會提供更靈活的模態控制。

結論

gpt-4o-audio-preview 模型為動態音訊互動開闢了新的可能性,使開發者能夠構建豐富的、AI 驅動的音訊應用。

免責宣告:API 功能和特性可能會發生變化。請參考最新的 OpenAI 和 Spring AI 文件獲取更新資訊。

獲取 Spring 時事通訊

訂閱 Spring 時事通訊以保持聯絡

訂閱

搶先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲取支援

Tanzu Spring 提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一個簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群即將舉行的所有活動。

檢視全部