Spring AI系列之使用 Spring AI 转录音频文件(基于OpenAI)

  1. 概述

企业常常需要从各种类型的音频内容中提取有价值的数据,例如:将客户支持通话转录用于情感分析、为视频生成字幕,或整理会议纪要。然而,手动转录音频文件既耗时又昂贵。

为了解决这一问题,OpenAI 提供了强大的语音转文字模型,能够准确地将多种语言的音频文件转录为文本。

在本教程中,我们将学习如何使用 Spring AI 搭配 OpenAI 的语音转文字模型来转录音频文件。

要完成本教程,需要一个 OpenAI 的 API 密钥。


2.项目搭建

在开始实现我们的音频转录功能之前,我们需要引入必要的依赖项,并正确配置我们的应用程序。

2.1. 依赖项

我们首先需要在项目的 pom.xml 文件中添加 Spring AI 提供的 OpenAI Starter 依赖项:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId><version>1.0.0-M7</version>
</dependency>

由于当前版本 1.0.0-M7 是一个里程碑版本(Milestone Release),我们还需要在 pom.xml 中添加 Spring 的 Milestones 仓库:

<repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>

该仓库用于发布里程碑版本,而不是标准的 Maven Central 仓库。

2.2. 配置 OpenAI 属性

接下来,我们将在 application.yaml 文件中配置 OpenAI 的 API 密钥和语音转文字模型:

spring:ai:openai:api-key: ${OPENAI_API_KEY}audio:transcription:options:model: whisper-1language: en

在这里,我们通过模型  whisper-1 指定使用 OpenAI 的 Whisper 模型。需要注意的是,OpenAI还提供了更高级、质量更高的语音转文字模型,如gpt-4o-transcribe 和 gpt-4o-mini-transcribe

但当前版本的 Spring AI 尚不支持它们。

此外,我们还指定了音频文件的语言为en(英语)。当然,也可以根据需求,使用 ISO-639-1 格式指定其他输入语言。如果未指定语言,所选模型会自动尝试识别音频中的语言。

配置好上述属性后,Spring AI 会自动创建一个类型为 

OpenAiAudioTranscriptionModel的Bean,使我们可以与所选模型进行交互。


3. 构建音频转录器

配置完成后,我们将创建一个AudioTranscriber服务类。我们会注入 Spring AI 自动为我们创建的 OpenAiAudioTranscriptionModel Bean。

但在此之前,先定义两个简单的 record 类型,用于表示请求和响应的数据结构:

record TranscriptionRequest(MultipartFile audioFile, @Nullable String context) {}record TranscriptionResponse(String transcription) {}

TranscriptionRequest 包含要转录的音频文件 audioFile,以及一个可选的上下文context,用于帮助模型更好地完成转录过程。需要注意的是,OpenAI当前支持的音频文件格式包括:mp3mp4mpegmpgam4awav 和 webm

同样地,TranscriptionResponse 用于简单地保存生成的转录文本。

现在,让我们实现预期的功能:

TranscriptionResponse transcribe(TranscriptionRequest transcriptionRequest) {AudioTranscriptionPrompt prompt = new AudioTranscriptionPrompt(transcriptionRequest.audioFile().getResource(),OpenAiAudioTranscriptionOptions.builder().prompt(transcriptionRequest.context()).build());AudioTranscriptionResponse response = openAiAudioTranscriptionModel.call(prompt);return new TranscriptionResponse(response.getResult().getOutput());
}

在这里,我们为 AudioTranscriber 类添加了一个新的 transcribe() 方法。

我们使用音频文件资源和可选的上下文提示,创建一个AudioTranscriptionPrompt对象。然后,通过它调用自动注入的 OpenAiAudioTranscriptionModel Bean 的 call() 方法。

最后,我们从响应中提取转录后的文本,并将其包装在 TranscriptionResponse 记录类中返回。

目前,对于语音转文字模型,音频文件的大小限制为25MB。然而,Spring Boot 默认将上传文件的大小限制为 1MB。我们可以在 

application.yaml 文件中增加这一限制:

spring:servlet:multipart:max-file-size: 25MBmax-request-size: 25MB

我们将最大文件大小和请求体大小都设置为25MB,这对于大多数音频转录请求来说应该已经足够。

4. 测试我们的音频转录器

现在我们已经实现了服务层,接下来我们来基于它暴露一个

REST API 接口:

@PostMapping("/transcribe")
ResponseEntity<TranscriptionResponse> transcribe(@RequestParam("audioFile") MultipartFile audioFile,@RequestParam("context") String context
) {TranscriptionRequest transcriptionRequest = new TranscriptionRequest(audioFile, context);TranscriptionResponse response = audioTranscriber.transcribe(transcriptionRequest);return ResponseEntity.ok(response);
}

我们用HTTPie去调用接口

http -f POST :8080/transcribe audioFile@××××-audio-description.mp3 context="Short description about Baeldung"

在这里,我们调用 /transcribe API,发送音频文件及其上下文信息。为了演示,我们准备了一个简短的音频文件,存放在代码库的

src/test/resources/audio 文件夹中。让我们来看一下返回的响应内容:

{"transcription": "×××× is a top-notch educational platform that specializes in Java, Spring, and related technologies. It offers a wealth of tutorials, articles, and courses that help developers master programming concepts. Known for its clear examples and practical guides, Baeldung is a go-to resource for developers looking to level up their skills."
}

正如我们所见,API 返回了对所提供音频文件的正确转录内容。


5. 总结

本文介绍了如何在 Spring AI 中使用 OpenAI 进行音频文件转录。

我们详细讲解了所需的配置,并基于 OpenAI 的 Whisper 语音转文字模型实现了一个音频转录器。随后,我们对应用进行了测试,展示了提供上下文提示如何提升转录的准确性。

关注我不迷路,系列化的给您提供当代程序员需要掌握的现代AI工具和框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

室内VR全景助力房产营销及装修

在当今的地产行业&#xff0c;VR全景已成为不可或缺的应用工具。从地产直播到楼市VR地图&#xff0c;从效果图到水电家装施工记录&#xff0c;整个地产行业的上下游生态中&#xff0c;云VR全景的身影无处不在。本文将探讨VR全景在房产营销及装修领域的应用&#xff0c;并介绍众…

Sentinel限流熔断机制实战

1、核心概念 1.1、流量控制 流量控制是为了 防止系统被过多的请求压垮&#xff0c;确保资源合理分配并保持服务的可用性&#xff0c;比如对请求数量的限制。 流量控制的 3 个主要优势&#xff1a; 防止过载&#xff1a;当瞬间涌入的请求量超出系统处理能力时&#xff0c;会…

深度解析 torch.mean 的替代方案

torch.mean 是什么意思 代码效果解释 segment_vector = torch.mean(segment_embedding, dim=1) # [1, hidden_dim] 这行代码的作用是在指定维度上对张量 segment_embedding 求平均值,实现类似平均池化的效果。 具体来说,dim=1 表示沿着索引为1的维度进行操作。假设 segment…

Paraformer语音模型:一种语音模型加速方法

随着智能语音技术的普及&#xff0c;语音识别&#xff08;ASR&#xff09;、语音合成&#xff08;TTS&#xff09;、声纹识别等应用场景对模型推理效率提出了极高要求&#xff0c;本文介绍将Paraformer语音模型从预训练模型导出为ONNX格式&#xff0c;并使用ONNX Runtime进行推…

本地部署FreeGPT+内网穿透公网远程访问,搞定ChatGPT外网访问难题

‌FreeGPT‌是一个基于GPT 3.5/4的ChatGPT聊天网页用户界面&#xff0c;提供了一个开放的聊天界面&#xff0c;开箱即用‌。ChatGPT是非常热门的&#xff0c;但访问体验一直不太理想。为了解决这一问题&#xff0c;出现了各类方法和工具&#xff0c;其中FreeGPT是一款非常实用的…

ElasticSearch迁移至openGauss

Elasticsearch 作为一种高效的全文搜索引擎&#xff0c;广泛应用于实时搜索、日志分析等场景。而 openGauss&#xff0c;作为一款企业级关系型数据库&#xff0c;强调事务处理与数据一致性。那么&#xff0c;当这两者的应用场景和技术架构发生交集时&#xff0c;如何实现它们之…

品优购项目(HTML\CSS)

项目效果可访问 http://zhousunyu.3vdo.club 查看 主页 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

因泰立科技:镭眸T51激光雷达,打造智能门控新生态

在高端门控行业&#xff0c;安全与效率是永恒的追求。如今&#xff0c;随着科技的飞速发展&#xff0c;激光雷达与TOF相机技术的融合&#xff0c;为门控系统带来了前所未有的智能感知能力&#xff0c;开启了精准守护的新时代。因泰立科技的镭眸T51激光雷达&#xff0c;作为这一…

MyBatisPlus--快速入门

MyBatisPlus介绍 从名字中就可以感觉到MybatisPlus与MyBatis之间的渊源&#xff0c;而MyBatis是一个非常流行的持久层框架&#xff0c;主要来做数据库的增删改查&#xff0c;而MyBatisPlus这种命名方式让人不得不往MyBatis的升级版去联想&#xff0c;事实也确实如此&#xff0…

redis持久化策略

RDB 是通过生成数据快照来实现持久化的&#xff0c;相当于给内存中的数据拍一张"照片"保存到磁盘上。AOF 记录所有写操作命令&#xff0c;以Redis协议格式追加到文件末尾。 RDB 在满足特定条件时触发内存快照&#xff0c;生成新的RDB文件替换旧文件 AOF 先写入内…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 处理动态 JSON 属性 在实际的后端开发中,尤其是使用 Spring Boot 构建 API 时,我们经常会遇到需要处理动态 JSON 属性的场景。例如,前端传递过来的 JSON 数据结构不固定,或者业务需求变更频繁,导致实体类无法预先定…

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接&#xff1a;开始 下载nvm - nvm中文官网 情况&#xff1a;npm i 下载依赖缓慢&#xff0c;可能是node版本不对&#xff0c;可能node版本太高 可能得问题&#xff1a;使用nvm 下载低版本的node时&#xff0c;…

【解决办法】ubuntu重启不起来,输入用户名和密码进不去,又重新返回登录页。

项目场景&#xff1a; ubuntu重启不起来&#xff0c;输入用户名和密码进不去&#xff0c;又重新返回登录页。 问题描述 在华硕天选一代笔记本上面安装了ubuntu22.04.5桌面版&#xff0c;但是重启以后出现&#xff0c;输入了用户名和密码&#xff0c;等待一会还让输入用户名和…

# 云端大模型:智能时代的新引擎

云端大模型&#xff1a;智能时代的新引擎 在人工智能技术的迅猛发展中&#xff0c;云端大模型扮演着至关重要的角色。它们不仅推动了技术的边界&#xff0c;也为各行各业带来了前所未有的机遇。本文将结合一系列图片和代码示例&#xff0c;深入探讨云端大模型的功能、应用及其…

(1)pytest简介和环境准备

1. pytest简介 pytest是python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高。根据pytest的官方网站介绍&#xff0c;它具有如下特点&#xff1a; 非常容易上手&#xff0c;入门简单&a…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.5 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.5 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe <-data.frame( wrapc(17,20,12,9,…

线程池的详细知识(含有工厂模式)

前言 下午学习了线程池的知识。重点探究了ThreadPoolExecutor里面的各种参数的含义。我详细了解了这部分的知识。其中有一个参数涉及工厂模式&#xff0c;我将这一部分知识分享给大家~ 线程池的详细介绍(含工厂模式) 结语 分享到此结束啦。byebye~

嵌入式开发学习(第二阶段 C语言笔记)

内存操作 我们对于内存操作需要依赖于string.h头文件中相关的函数库。 内存操作函数 内存填充 头文件&#xff1a;#include <string.h> 函数原型&#xff1a; void* memset(void *s,int c,size_t n)函数功能&#xff1a;将内存块s的前n个字节填充为c&#xff0c;一般…

C++学习-入门到精通【9】面向对象编程:继承

C学习-入门到精通【9】面向对象编程&#xff1a;继承 目录 C学习-入门到精通【9】面向对象编程&#xff1a;继承一、基类与派生类CommunityMember类的继承层次结构如何定义一个派生类呢 二、基类和派生类间的关系1.创建并使用类CommissionEmployee2.不使用继承创建类BasePlusCo…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…