1. Visión general
Las empresas a menudo necesitan extraer datos significativos de varios tipos de contenido de audio, como transcribir llamadas de soporte al cliente para análisis de sentimiento, generar subtítulos para videos o generar minutas de reuniones. Sin embargo, transcribir manualmente archivos de audio es un proceso que consume mucho tiempo y es costoso.
Para automatizar este proceso, OpenAI ofrece potentes modelos de voz a texto capaces de transcribir con precisión archivos de audio en varios idiomas.
En este tutorial, exploraremos cómo transcribir archivos de audio con los modelos de voz a texto de OpenAI utilizando Spring AI.
Para seguir este tutorial, necesitaremos una clave API de OpenAI.
2. Configuración del Proyecto
Antes de poder comenzar a implementar nuestro transcriptor de audio, necesitaremos incluir la dependencia necesaria y configurar nuestra aplicación correctamente.
2.1. Dependencias
Comencemos añadiendo la dependencia inicial de OpenAI del Spring AI a nuestro archivo pom.xml:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
<version>1.0.0-M7</version>
</dependency>
Como la versión actual, 1.0.0-M7, es una versión de hito, también necesitaremos agregar el repositorio de hitos de Spring a nuestro pom.xml:
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
Este repositorio es donde se publican las versiones de hito, en lugar del repositorio Maven Central estándar.
2.2. Configuración de las Propiedades de OpenAI
A continuación, configuraremos la clave API de OpenAI y el modelo de voz a texto en nuestro archivo application.yaml:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
audio:
transcription:
options:
model: whisper-1
language: en
Usamos el marcador de posición de propiedad ${} para cargar el valor de nuestra clave API desde una variable de entorno.
Aquí, especificamos el modelo Whisper de OpenAI a través de su ID de modelo whisper-1. Es importante notar que OpenAI ofrece modelos de voz a texto más avanzados y de mayor calidad, como gpt-4o-transcribe y gpt-4o-mini-transcribe. Sin embargo, no son compatibles con la versión actual de Spring AI.
Además, especificamos en como el idioma de nuestros archivos de audio. Alternativamente, podemos especificar un idioma de entrada diferente en formato ISO-639-1 según los requisitos. Si no se especifica, el modelo indicado intentará detectar automáticamente el idioma hablado en el audio.
Al configurar las propiedades anteriores, Spring AI crea automáticamente un bean del tipo OpenAiAudioTranscriptionModel, lo que nos permite interactuar con el modelo especificado.
3. Creando Nuestro Transcriptor de Audio
Con nuestras configuraciones en su lugar, creemos una clase de servicio AudioTranscriber. Inyectaremos el bean OpenAiAudioTranscriptionModel que Spring AI crea automáticamente para nosotros.
Pero primero, definamos dos registros simples para representar los datos de solicitud y respuesta:
record TranscriptionRequest(MultipartFile audioFile, @Nullable String context) {}
record TranscriptionResponse(String transcription) {}
El TranscriptionRequest contiene el audioFile que se transcribirá y un context opcional para ayudar al modelo con el proceso de transcripción. Es importante notar que OpenAI admite actualmente archivos de audio en formatos mp3, mp4, mpeg, mpga, m4a, wav y webm.
Del mismo modo, el TranscriptionResponse simplemente contiene la transcription generada.
Ahora, implemente la funcionalidad prevista:
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());
}
Aquí, añadimos un nuevo método transcribe() a nuestra clase AudioTranscriber.
Creamos un objeto AudioTranscriptionPrompt usando el recurso audioFile y la solicitud opcional context. Luego, lo utilizamos para invocar el método call() del bean OpenAiAudioTranscriptionModel inyectado.
Finalmente, extraemos el texto transcrito de la response y lo devolvemos envuelto en nuestro registro TranscriptionResponse.
Actualmente, para los modelos de voz a texto, el tamaño del archivo de audio está limitado a 25 MB. Sin embargo, por defecto, Spring Boot limita el tamaño de los archivos cargados a 1 MB. Incrementemos este límite en nuestro archivo application.yaml:
spring:
servlet:
multipart:
max-file-size: 25MB
max-request-size: 25MB
Establecemos el tamaño máximo del archivo y del pedido a 25MB, lo que debería ser suficiente para la mayoría de las solicitudes de transcripción de audio.
4. Probando Nuestro Transcriptor de Audio
Ahora que hemos implementado nuestra capa de servicio, exponemos una API REST encima de ella:
@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);
}
A continuación, usemos la CLI HTTPie para invocar el endpoint anterior:
http -f POST :8080/transcribe /cdn-cgi/l/email-protection context="Short description about CodeJa"
Aquí, invocamos nuestra API /transcribe y enviamos el audioFile junto con su context. Para nuestra demostración, hemos preparado un archivo de audio que ofrece una breve descripción de CodeJa. Este archivo se encuentra en la carpeta src/test/resources/audio del código base.
Veamos qué obtuvimos como respuesta:
{
"transcription": "CodeJa 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, CodeJa is a go-to resource for developers looking to level up their skills."
}
Como podemos ver, la API devuelve la transcription correcta del archivo de audio proporcionado.
Nótese cómo proporcionar el prompt context ayuda al modelo a transcribir correctamente el nombre CodeJa. Sin este context, el modelo Whisper transcribe la palabra como Baildung.
5. Conclusión
En este artículo, hemos explorado la transcripción de archivos de audio con OpenAI en Spring AI.
Revisamos la configuración necesaria e implementamos un transcriptor de audio utilizando el modelo de voz a texto Whisper de OpenAI. También probamos nuestra aplicación y vimos cómo proporcionar un prompt de contexto mejora la precisión de la transcripción generada, especialmente para nombres específicos de dominio.
Newsletter Semanal de Java
Cada viernes recibe lo más nuevo del ecosistema Java: frameworks, herramientas y mejores prácticas.
Sin spam. Cancela cuando quieras.