From c0e1ce4122da6f277432a67c49a47c574c7c3bdf Mon Sep 17 00:00:00 2001 From: Teerapap Changwichukarn Date: Sat, 10 Jun 2023 00:27:44 +0700 Subject: [PATCH 1/2] Add Audio Transcription API (#272) --- .../audio/CreateTranscriptionRequest.java | 46 ++++++++++++++++++ .../openai/audio/TranscriptionResult.java | 44 +++++++++++++++++ .../openai/audio/TranscriptionSegment.java | 32 ++++++++++++ .../java/com/theokanning/openai/JsonTest.java | 2 + .../fixtures/TranscriptionResult.json | 27 ++++++++++ .../com/theokanning/openai/OpenAiApi.java | 4 ++ .../openai/service/OpenAiService.java | 31 ++++++++++++ .../theokanning/openai/service/AudioTest.java | 43 ++++++++++++++++ service/src/test/resources/hello-world.mp3 | Bin 0 -> 12781 bytes 9 files changed, 229 insertions(+) create mode 100644 api/src/main/java/com/theokanning/openai/audio/CreateTranscriptionRequest.java create mode 100644 api/src/main/java/com/theokanning/openai/audio/TranscriptionResult.java create mode 100644 api/src/main/java/com/theokanning/openai/audio/TranscriptionSegment.java create mode 100644 api/src/test/resources/fixtures/TranscriptionResult.json create mode 100644 service/src/test/java/com/theokanning/openai/service/AudioTest.java create mode 100644 service/src/test/resources/hello-world.mp3 diff --git a/api/src/main/java/com/theokanning/openai/audio/CreateTranscriptionRequest.java b/api/src/main/java/com/theokanning/openai/audio/CreateTranscriptionRequest.java new file mode 100644 index 00000000..5c50480f --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/audio/CreateTranscriptionRequest.java @@ -0,0 +1,46 @@ +package com.theokanning.openai.audio; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +/** + * A request for OpenAi to create transcription based on an audio file + * All fields except model are optional + * + * https://platform.openai.com/docs/api-reference/audio/create + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class CreateTranscriptionRequest { + + /** + * The name of the model to use. + */ + @NonNull + String model; + + /** + * An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language. + */ + String prompt; + + /** + * The format of the transcript output, in one of these options: json or verbose_json + */ + @JsonProperty("response_format") + String responseFormat; + + /** + * The sampling temperature, between 0 and 1. + * Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + * If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + */ + Double temperature; + + /** + * The language of the input audio. Supplying the input language in ISO-639-1 format will improve accuracy and latency. + */ + String language; +} diff --git a/api/src/main/java/com/theokanning/openai/audio/TranscriptionResult.java b/api/src/main/java/com/theokanning/openai/audio/TranscriptionResult.java new file mode 100644 index 00000000..2794a346 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/audio/TranscriptionResult.java @@ -0,0 +1,44 @@ +package com.theokanning.openai.audio; + +import lombok.Data; + +import java.util.List; + +/** + * An object with the text transcription + * + * https://platform.openai.com/docs/api-reference/audio/create + */ +@Data +public class TranscriptionResult { + + /** + * The text transcription. + */ + String text; + + /** + * Task name + * @apiNote verbose_json response format only + */ + String task; + + /** + * Speech language + * @apiNote verbose_json response format only + */ + String language; + + /** + * Speech duration + * @apiNote verbose_json response format only + */ + Double duration; + + /** + * List of segments + * @apiNote verbose_json response format only + */ + List segments; + +} diff --git a/api/src/main/java/com/theokanning/openai/audio/TranscriptionSegment.java b/api/src/main/java/com/theokanning/openai/audio/TranscriptionSegment.java new file mode 100644 index 00000000..7f382073 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/audio/TranscriptionSegment.java @@ -0,0 +1,32 @@ +package com.theokanning.openai.audio; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * An object represents transcription segment + * + * https://platform.openai.com/docs/api-reference/audio/create + */ +@Data +public class TranscriptionSegment { + + Integer id; + Integer seek; + Double start; + Double end; + String text; + List tokens; + Double temperature; + @JsonProperty("avg_logprob") + Double averageLogProb; + @JsonProperty("compression_ratio") + Double compressionRatio; + @JsonProperty("no_speech_prob") + Double noSpeechProb; + @JsonProperty("transient") + Boolean transientFlag; + +} diff --git a/api/src/test/java/com/theokanning/openai/JsonTest.java b/api/src/test/java/com/theokanning/openai/JsonTest.java index 1ca23a06..0c09ed06 100644 --- a/api/src/test/java/com/theokanning/openai/JsonTest.java +++ b/api/src/test/java/com/theokanning/openai/JsonTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.*; +import com.theokanning.openai.audio.TranscriptionResult; import com.theokanning.openai.completion.chat.ChatCompletionRequest; import com.theokanning.openai.completion.chat.ChatCompletionResult; import com.theokanning.openai.edit.EditRequest; @@ -42,6 +43,7 @@ public class JsonTest { FineTuneEvent.class, FineTuneResult.class, ImageResult.class, + TranscriptionResult.class, Model.class, ModerationRequest.class, ModerationResult.class diff --git a/api/src/test/resources/fixtures/TranscriptionResult.json b/api/src/test/resources/fixtures/TranscriptionResult.json new file mode 100644 index 00000000..769a139e --- /dev/null +++ b/api/src/test/resources/fixtures/TranscriptionResult.json @@ -0,0 +1,27 @@ +{ + "task": "transcribe", + "language": "english", + "duration": 1.1, + "segments": [ + { + "id": 0, + "seek": 0, + "start": 0.0, + "end": 0.96, + "text": " Hello World.", + "tokens": [ + 50364, + 2425, + 3937, + 13, + 50412 + ], + "temperature": 0.0, + "avg_logprob": -0.7308251063028971, + "compression_ratio": 0.6, + "no_speech_prob": 0.015335720032453537, + "transient": false + } + ], + "text": "Hello World." +} \ No newline at end of file diff --git a/client/src/main/java/com/theokanning/openai/OpenAiApi.java b/client/src/main/java/com/theokanning/openai/OpenAiApi.java index 77e00552..bb772d87 100644 --- a/client/src/main/java/com/theokanning/openai/OpenAiApi.java +++ b/client/src/main/java/com/theokanning/openai/OpenAiApi.java @@ -1,5 +1,6 @@ package com.theokanning.openai; +import com.theokanning.openai.audio.TranscriptionResult; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; import com.theokanning.openai.completion.chat.ChatCompletionRequest; @@ -109,6 +110,9 @@ public interface OpenAiApi { @POST("/v1/images/variations") Single createImageVariation(@Body RequestBody requestBody); + @POST("/v1/audio/transcriptions") + Single createTranscription(@Body RequestBody requestBody); + @POST("/v1/moderations") Single createModeration(@Body ModerationRequest request); diff --git a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java index 8b3b1cb7..e9069033 100644 --- a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java +++ b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java @@ -8,6 +8,8 @@ import com.theokanning.openai.OpenAiApi; import com.theokanning.openai.OpenAiError; import com.theokanning.openai.OpenAiHttpException; +import com.theokanning.openai.audio.CreateTranscriptionRequest; +import com.theokanning.openai.audio.TranscriptionResult; import com.theokanning.openai.completion.CompletionChunk; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; @@ -248,6 +250,35 @@ public ImageResult createImageVariation(CreateImageVariationRequest request, jav return execute(api.createImageVariation(builder.build())); } + public TranscriptionResult createTranscription(CreateTranscriptionRequest request, String audioPath) { + java.io.File audio = new java.io.File(audioPath); + return createTranscription(request, audio); + } + + public TranscriptionResult createTranscription(CreateTranscriptionRequest request, java.io.File audio) { + RequestBody audioBody = RequestBody.create(MediaType.parse("audio"), audio); + + MultipartBody.Builder builder = new MultipartBody.Builder() + .setType(MediaType.get("multipart/form-data")) + .addFormDataPart("model", request.getModel()) + .addFormDataPart("file", audio.getName(), audioBody); + + if (request.getPrompt() != null) { + builder.addFormDataPart("prompt", request.getPrompt()); + } + if (request.getResponseFormat() != null) { + builder.addFormDataPart("response_format", request.getResponseFormat()); + } + if (request.getTemperature() != null) { + builder.addFormDataPart("temperature", request.getTemperature().toString()); + } + if (request.getLanguage() != null) { + builder.addFormDataPart("language", request.getLanguage()); + } + + return execute(api.createTranscription(builder.build())); + } + public ModerationResult createModeration(ModerationRequest request) { return execute(api.createModeration(request)); } diff --git a/service/src/test/java/com/theokanning/openai/service/AudioTest.java b/service/src/test/java/com/theokanning/openai/service/AudioTest.java new file mode 100644 index 00000000..66776e21 --- /dev/null +++ b/service/src/test/java/com/theokanning/openai/service/AudioTest.java @@ -0,0 +1,43 @@ +package com.theokanning.openai.service; + +import com.theokanning.openai.audio.CreateTranscriptionRequest; +import com.theokanning.openai.audio.TranscriptionResult; +import org.junit.jupiter.api.Test; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.*; + + +public class AudioTest { + + static String englishAudioFilePath = "src/test/resources/hello-world.mp3"; + + String token = System.getenv("OPENAI_TOKEN"); + OpenAiService service = new OpenAiService(token, Duration.ofSeconds(30)); + + @Test + void createTranscription() { + CreateTranscriptionRequest createTranscriptionRequest = CreateTranscriptionRequest.builder() + .model("whisper-1") + .build(); + + String text = service.createTranscription(createTranscriptionRequest, englishAudioFilePath).getText(); + assertEquals("Hello World.", text); + } + + @Test + void createTranscriptionVerbose() { + CreateTranscriptionRequest createTranscriptionRequest = CreateTranscriptionRequest.builder() + .model("whisper-1") + .responseFormat("verbose_json") + .build(); + + TranscriptionResult result = service.createTranscription(createTranscriptionRequest, englishAudioFilePath); + assertEquals("Hello World.", result.getText()); + assertEquals("transcribe", result.getTask()); + assertEquals("english", result.getLanguage()); + assertTrue(result.getDuration() > 0); + assertEquals(1, result.getSegments().size()); + } +} diff --git a/service/src/test/resources/hello-world.mp3 b/service/src/test/resources/hello-world.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b5bd8594f12a9bae302a73dde9c85270f99447e7 GIT binary patch literal 12781 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 literal 0 HcmV?d00001 From 80ed82bc9ae99c349ca149b93df9ac614b2a49fb Mon Sep 17 00:00:00 2001 From: Teerapap Changwichukarn Date: Sat, 10 Jun 2023 01:11:48 +0700 Subject: [PATCH 2/2] Add Audio Translation API (#272) --- .../audio/CreateTranslationRequest.java | 41 ++++++++++++++++ .../openai/audio/TranslationResult.java | 44 ++++++++++++++++++ .../java/com/theokanning/openai/JsonTest.java | 2 + .../resources/fixtures/TranslationResult.json | 37 +++++++++++++++ .../com/theokanning/openai/OpenAiApi.java | 4 ++ .../openai/service/OpenAiService.java | 28 +++++++++++ .../theokanning/openai/service/AudioTest.java | 29 ++++++++++++ service/src/test/resources/korean-hello.mp3 | Bin 0 -> 42445 bytes 8 files changed, 185 insertions(+) create mode 100644 api/src/main/java/com/theokanning/openai/audio/CreateTranslationRequest.java create mode 100644 api/src/main/java/com/theokanning/openai/audio/TranslationResult.java create mode 100644 api/src/test/resources/fixtures/TranslationResult.json create mode 100644 service/src/test/resources/korean-hello.mp3 diff --git a/api/src/main/java/com/theokanning/openai/audio/CreateTranslationRequest.java b/api/src/main/java/com/theokanning/openai/audio/CreateTranslationRequest.java new file mode 100644 index 00000000..ace5cc36 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/audio/CreateTranslationRequest.java @@ -0,0 +1,41 @@ +package com.theokanning.openai.audio; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +/** + * A request for OpenAi to create English translation based on an audio file + * All fields except model are optional + * + * https://platform.openai.com/docs/api-reference/audio/create + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class CreateTranslationRequest { + + /** + * The name of the model to use. + */ + @NonNull + String model; + + /** + * An optional text to guide the model's style or continue a previous audio segment. The prompt should be in English. + */ + String prompt; + + /** + * The format of the translated output, in one of these options: json or verbose_json + */ + @JsonProperty("response_format") + String responseFormat; + + /** + * The sampling temperature, between 0 and 1. + * Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. + * If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + */ + Double temperature; +} diff --git a/api/src/main/java/com/theokanning/openai/audio/TranslationResult.java b/api/src/main/java/com/theokanning/openai/audio/TranslationResult.java new file mode 100644 index 00000000..f1f1c446 --- /dev/null +++ b/api/src/main/java/com/theokanning/openai/audio/TranslationResult.java @@ -0,0 +1,44 @@ +package com.theokanning.openai.audio; + +import lombok.Data; + +import java.util.List; + +/** + * An object with the English transcription + * + * https://platform.openai.com/docs/api-reference/audio/create + */ +@Data +public class TranslationResult { + + /** + * Translated text. + */ + String text; + + /** + * Task name + * @apiNote verbose_json response format only + */ + String task; + + /** + * Translated language + * @apiNote verbose_json response format only + */ + String language; + + /** + * Speech duration + * @apiNote verbose_json response format only + */ + Double duration; + + /** + * List of segments + * @apiNote verbose_json response format only + */ + List segments; + +} diff --git a/api/src/test/java/com/theokanning/openai/JsonTest.java b/api/src/test/java/com/theokanning/openai/JsonTest.java index 0c09ed06..09d89f5b 100644 --- a/api/src/test/java/com/theokanning/openai/JsonTest.java +++ b/api/src/test/java/com/theokanning/openai/JsonTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.*; import com.theokanning.openai.audio.TranscriptionResult; +import com.theokanning.openai.audio.TranslationResult; import com.theokanning.openai.completion.chat.ChatCompletionRequest; import com.theokanning.openai.completion.chat.ChatCompletionResult; import com.theokanning.openai.edit.EditRequest; @@ -44,6 +45,7 @@ public class JsonTest { FineTuneResult.class, ImageResult.class, TranscriptionResult.class, + TranslationResult.class, Model.class, ModerationRequest.class, ModerationResult.class diff --git a/api/src/test/resources/fixtures/TranslationResult.json b/api/src/test/resources/fixtures/TranslationResult.json new file mode 100644 index 00000000..3e211cab --- /dev/null +++ b/api/src/test/resources/fixtures/TranslationResult.json @@ -0,0 +1,37 @@ +{ + "task": "translate", + "language": "english", + "duration": 4.38, + "segments": [ + { + "id": 0, + "seek": 0, + "start": 0.0, + "end": 4.32, + "text": " Hello, my name is Yuna. I am Korean voice.", + "tokens": [ + 50364, + 2425, + 11, + 452, + 1315, + 307, + 398, + 5051, + 13, + 286, + 669, + 6933, + 3177, + 13, + 50580 + ], + "temperature": 0.0, + "avg_logprob": -0.6644304394721985, + "compression_ratio": 0.84, + "no_speech_prob": 0.006824055220931768, + "transient": false + } + ], + "text": "Hello, my name is Yuna. I am Korean voice." +} \ No newline at end of file diff --git a/client/src/main/java/com/theokanning/openai/OpenAiApi.java b/client/src/main/java/com/theokanning/openai/OpenAiApi.java index bb772d87..fade9634 100644 --- a/client/src/main/java/com/theokanning/openai/OpenAiApi.java +++ b/client/src/main/java/com/theokanning/openai/OpenAiApi.java @@ -1,6 +1,7 @@ package com.theokanning.openai; import com.theokanning.openai.audio.TranscriptionResult; +import com.theokanning.openai.audio.TranslationResult; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; import com.theokanning.openai.completion.chat.ChatCompletionRequest; @@ -113,6 +114,9 @@ public interface OpenAiApi { @POST("/v1/audio/transcriptions") Single createTranscription(@Body RequestBody requestBody); + @POST("/v1/audio/translations") + Single createTranslation(@Body RequestBody requestBody); + @POST("/v1/moderations") Single createModeration(@Body ModerationRequest request); diff --git a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java index e9069033..761a1db1 100644 --- a/service/src/main/java/com/theokanning/openai/service/OpenAiService.java +++ b/service/src/main/java/com/theokanning/openai/service/OpenAiService.java @@ -9,7 +9,9 @@ import com.theokanning.openai.OpenAiError; import com.theokanning.openai.OpenAiHttpException; import com.theokanning.openai.audio.CreateTranscriptionRequest; +import com.theokanning.openai.audio.CreateTranslationRequest; import com.theokanning.openai.audio.TranscriptionResult; +import com.theokanning.openai.audio.TranslationResult; import com.theokanning.openai.completion.CompletionChunk; import com.theokanning.openai.completion.CompletionRequest; import com.theokanning.openai.completion.CompletionResult; @@ -279,6 +281,32 @@ public TranscriptionResult createTranscription(CreateTranscriptionRequest reques return execute(api.createTranscription(builder.build())); } + public TranslationResult createTranslation(CreateTranslationRequest request, String audioPath) { + java.io.File audio = new java.io.File(audioPath); + return createTranslation(request, audio); + } + + public TranslationResult createTranslation(CreateTranslationRequest request, java.io.File audio) { + RequestBody audioBody = RequestBody.create(MediaType.parse("audio"), audio); + + MultipartBody.Builder builder = new MultipartBody.Builder() + .setType(MediaType.get("multipart/form-data")) + .addFormDataPart("model", request.getModel()) + .addFormDataPart("file", audio.getName(), audioBody); + + if (request.getPrompt() != null) { + builder.addFormDataPart("prompt", request.getPrompt()); + } + if (request.getResponseFormat() != null) { + builder.addFormDataPart("response_format", request.getResponseFormat()); + } + if (request.getTemperature() != null) { + builder.addFormDataPart("temperature", request.getTemperature().toString()); + } + + return execute(api.createTranslation(builder.build())); + } + public ModerationResult createModeration(ModerationRequest request) { return execute(api.createModeration(request)); } diff --git a/service/src/test/java/com/theokanning/openai/service/AudioTest.java b/service/src/test/java/com/theokanning/openai/service/AudioTest.java index 66776e21..d4f7b61b 100644 --- a/service/src/test/java/com/theokanning/openai/service/AudioTest.java +++ b/service/src/test/java/com/theokanning/openai/service/AudioTest.java @@ -1,7 +1,9 @@ package com.theokanning.openai.service; import com.theokanning.openai.audio.CreateTranscriptionRequest; +import com.theokanning.openai.audio.CreateTranslationRequest; import com.theokanning.openai.audio.TranscriptionResult; +import com.theokanning.openai.audio.TranslationResult; import org.junit.jupiter.api.Test; import java.time.Duration; @@ -13,6 +15,8 @@ public class AudioTest { static String englishAudioFilePath = "src/test/resources/hello-world.mp3"; + static String koreanAudioFilePath = "src/test/resources/korean-hello.mp3"; + String token = System.getenv("OPENAI_TOKEN"); OpenAiService service = new OpenAiService(token, Duration.ofSeconds(30)); @@ -40,4 +44,29 @@ void createTranscriptionVerbose() { assertTrue(result.getDuration() > 0); assertEquals(1, result.getSegments().size()); } + + @Test + void createTranslation() { + CreateTranslationRequest createTranslationRequest = CreateTranslationRequest.builder() + .model("whisper-1") + .build(); + + String text = service.createTranslation(createTranslationRequest, koreanAudioFilePath).getText(); + assertEquals("Hello, my name is Yuna. I am Korean voice.", text); + } + + @Test + void createTranslationVerbose() { + CreateTranslationRequest createTranslationRequest = CreateTranslationRequest.builder() + .model("whisper-1") + .responseFormat("verbose_json") + .build(); + + TranslationResult result = service.createTranslation(createTranslationRequest, koreanAudioFilePath); + assertEquals("Hello, my name is Yuna. I am Korean voice.", result.getText()); + assertEquals("translate", result.getTask()); + assertEquals("english", result.getLanguage()); + assertTrue(result.getDuration() > 0); + assertEquals(1, result.getSegments().size()); + } } diff --git a/service/src/test/resources/korean-hello.mp3 b/service/src/test/resources/korean-hello.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d1e65b6097ffe696ae69ad27a3840d1d9200e541 GIT binary patch literal 42445 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 P5*33t8UXko{>c9W&{3&K literal 0 HcmV?d00001