From c6766f300dc0e1e8b5bb3d321db1d8cde4286570 Mon Sep 17 00:00:00 2001 From: Kirill Bykov Date: Wed, 13 Dec 2023 16:32:06 -0600 Subject: [PATCH] Initial draft --- .../java/ai/rev/speechtotext/ApiClient.java | 4 ++ .../ai/rev/speechtotext/ApiInterface.java | 4 ++ .../ai/rev/speechtotext/models/NlpModel.java | 28 ++++++++++++++ .../models/asynchronous/RevAiJob.java | 8 ++++ .../models/asynchronous/RevAiJobOptions.java | 17 +++++++++ .../models/asynchronous/Summarization.java | 29 +++++++++++++++ .../SummarizationFormattingOptions.java | 15 ++++++++ .../asynchronous/SummarizationJobStatus.java | 37 +++++++++++++++++++ .../asynchronous/SummarizationOptions.java | 19 ++++++++++ .../integration/SubmitJobTest.java | 27 ++++++++++++-- 10 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ai/rev/speechtotext/models/NlpModel.java create mode 100644 src/main/java/ai/rev/speechtotext/models/asynchronous/Summarization.java create mode 100644 src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationFormattingOptions.java create mode 100644 src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationJobStatus.java create mode 100644 src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationOptions.java diff --git a/src/main/java/ai/rev/speechtotext/ApiClient.java b/src/main/java/ai/rev/speechtotext/ApiClient.java index 02332947..05b9cbe9 100755 --- a/src/main/java/ai/rev/speechtotext/ApiClient.java +++ b/src/main/java/ai/rev/speechtotext/ApiClient.java @@ -181,6 +181,10 @@ public String getTranscriptText(String id) throws IOException { return apiInterface.getTranscriptText(id).execute().body(); } + public String getTranscriptSummary(String id) throws IOException { + return apiInterface.getTranscriptSummary(id).execute().body(); + } + /** * Sends a POST request to the /jobs endpoint, starts an asynchronous job to transcribe * the media file located at the url provided and returns a {@link RevAiJob} object. diff --git a/src/main/java/ai/rev/speechtotext/ApiInterface.java b/src/main/java/ai/rev/speechtotext/ApiInterface.java index b248bdbe..e0cf034c 100644 --- a/src/main/java/ai/rev/speechtotext/ApiInterface.java +++ b/src/main/java/ai/rev/speechtotext/ApiInterface.java @@ -46,6 +46,10 @@ public interface ApiInterface { @GET("jobs/{id}/transcript") Call getTranscriptText(@Path("id") String jobID); + @Headers("Accept: " + REV_TEXT_CONTENT_TYPE) + @GET("jobs/{id}/transcript/summary") + Call getTranscriptSummary(@Path("id") String jobID); + @POST("jobs") Call submitJobUrl(@Body RevAiJobOptions options); diff --git a/src/main/java/ai/rev/speechtotext/models/NlpModel.java b/src/main/java/ai/rev/speechtotext/models/NlpModel.java new file mode 100644 index 00000000..855434e5 --- /dev/null +++ b/src/main/java/ai/rev/speechtotext/models/NlpModel.java @@ -0,0 +1,28 @@ +package ai.rev.speechtotext.models; + +import com.google.gson.annotations.SerializedName; + +/** Model type. */ +public enum NlpModel { + + /** gpt 3.5. This is the default value. */ + @SerializedName("standard") + STANDARD("standard"), + + /** gpt 4. */ + @SerializedName("premium") + PREMIUM("premium"); + + private final String model; + + NlpModel(String model) { + this.model = model; + } + + public String getModel() { return model; } + + @Override + public String toString() { + return "{" + "model='" + model + '\'' + '}'; + } +} diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJob.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJob.java index b01929d9..d7860c09 100644 --- a/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJob.java +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJob.java @@ -79,6 +79,9 @@ public class RevAiJob { @SerializedName("segments_to_transcribe") private List segmentsToTranscribe; + @SerializedName("summarization") + private Summarization summarization; + /** * Returns a String that contains the job ID. * @@ -517,6 +520,11 @@ public void setSegmentsToTranscribe(List segmentsToTranscri this.segmentsToTranscribe = segmentsToTranscribe; } + public Summarization getSummarization() { return summarization; } + public void setSummarization(Summarization summarization) { + this.summarization = summarization; + } + @Override public String toString() { return "{" diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJobOptions.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJobOptions.java index fc359838..8a79baf5 100644 --- a/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJobOptions.java +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/RevAiJobOptions.java @@ -136,6 +136,9 @@ public class RevAiJobOptions { @SerializedName("speaker_names") private List speakerNames; + @SerializedName("summarization_config") + private SummarizationOptions summarizationOptions; + /** * Returns the media url. * @@ -563,4 +566,18 @@ public List getSpeakerNames() { public void setSpeakerNames(List speakerNames) { this.speakerNames = speakerNames; } + + /** + * Returns summarization options + * + * @return Summarization options + */ + public SummarizationOptions getSummarizationOptions() { return summarizationOptions; } + + /** + * Specifies summarization options. + * + * @param summarizationOptions Summarization options + */ + public void setSummarizationOptions(SummarizationOptions summarizationOptions) { this.summarizationOptions = summarizationOptions; } } diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/Summarization.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/Summarization.java new file mode 100644 index 00000000..b586fca7 --- /dev/null +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/Summarization.java @@ -0,0 +1,29 @@ +package ai.rev.speechtotext.models.asynchronous; + +import ai.rev.speechtotext.models.NlpModel; +import com.google.gson.annotations.SerializedName; + +public class Summarization { + /** User defined prompt. **/ + @SerializedName("prompt") + private String prompt; + + /** Standard or Premium AI backend. **/ + @SerializedName("model") + private NlpModel model; + + /** Formatting options. Default is Paragraph. **/ + @SerializedName("type") + private SummarizationFormattingOptions type; + + @SerializedName("status") + private SummarizationJobStatus jobStatus; + + @SerializedName("completed_on") + private String completedOn; + + @SerializedName("failure") + private String failure; + + public SummarizationJobStatus getJobStatus() { return jobStatus;} +} diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationFormattingOptions.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationFormattingOptions.java new file mode 100644 index 00000000..3217ee54 --- /dev/null +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationFormattingOptions.java @@ -0,0 +1,15 @@ +package ai.rev.speechtotext.models.asynchronous; + +import com.google.gson.annotations.SerializedName; + +/** Summarization formatting options. **/ +public enum SummarizationFormattingOptions { + + /** Paragraph formatting **/ + @SerializedName("paragraph") + Paragraph, + + /** Bullet points formatting **/ + @SerializedName("bullets") + Bullets +} diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationJobStatus.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationJobStatus.java new file mode 100644 index 00000000..0b182986 --- /dev/null +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationJobStatus.java @@ -0,0 +1,37 @@ +package ai.rev.speechtotext.models.asynchronous; + +import com.google.gson.annotations.SerializedName; + +public enum SummarizationJobStatus { + /** The status when transcription has failed. */ + @SerializedName("failed") + FAILED("failed"), + + /** The status when transcription of the file is in progress. */ + @SerializedName("in_progress") + IN_PROGRESS("in_progress"), + + /** The status when the file has been transcribed. */ + @SerializedName("completed") + COMPLETED("completed"); + + private String status; + + SummarizationJobStatus(String status) { + this.status = status; + } + + /** + * Returns the String value of the enumeration. + * + * @return The String value of the enumeration. + */ + public String getStatus() { + return status; + } + + @Override + public String toString() { + return "{" + "status='" + status + '\'' + '}'; + } +} diff --git a/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationOptions.java b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationOptions.java new file mode 100644 index 00000000..2348cd4b --- /dev/null +++ b/src/main/java/ai/rev/speechtotext/models/asynchronous/SummarizationOptions.java @@ -0,0 +1,19 @@ +package ai.rev.speechtotext.models.asynchronous; + +import ai.rev.speechtotext.models.NlpModel; +import com.google.gson.annotations.SerializedName; + +public class SummarizationOptions { + + /** User defined prompt. **/ + @SerializedName("prompt") + private String prompt; + + /** Standard or Premium AI backend. **/ + @SerializedName("model") + private NlpModel model; + + /** Formatting options. Default is Paragraph. **/ + @SerializedName("type") + private SummarizationFormattingOptions type; +} diff --git a/src/test/java/ai/rev/speechtotext/integration/SubmitJobTest.java b/src/test/java/ai/rev/speechtotext/integration/SubmitJobTest.java index 3917a8de..de941a22 100644 --- a/src/test/java/ai/rev/speechtotext/integration/SubmitJobTest.java +++ b/src/test/java/ai/rev/speechtotext/integration/SubmitJobTest.java @@ -1,9 +1,7 @@ package ai.rev.speechtotext.integration; import ai.rev.speechtotext.ApiClient; -import ai.rev.speechtotext.models.asynchronous.RevAiJob; -import ai.rev.speechtotext.models.asynchronous.RevAiJobOptions; -import ai.rev.speechtotext.models.asynchronous.RevAiJobStatus; +import ai.rev.speechtotext.models.asynchronous.*; import ai.rev.testutils.EnvHelper; import org.junit.Before; import org.junit.Rule; @@ -158,7 +156,30 @@ public void SubmitJobUrl_OnlyUrlIsSpecified_ReturnsRevAiJobInProgress() throws I assertRevAiJob(revAiJob); } + @Test + public void SubmitJobLocalFile_SummarizationOptionsSpecified_ReturnsRevAiJobInProgress() + throws IOException, InterruptedException { + + RevAiJobOptions revAiJobOptions = new RevAiJobOptions(); + revAiJobOptions.setMetadata(testName.getMethodName()); + //revAiJobOptions.setDeleteAfterSeconds(0); + revAiJobOptions.setLanguage("en"); + revAiJobOptions.setSummarizationOptions(new SummarizationOptions()); + + RevAiJob revAiJob = apiClient.submitJobLocalFile(LOCAL_FILE, revAiJobOptions); + + assertRevAiJob(revAiJob); + assertThat(revAiJob.getSummarization()).isNotNull(); + while(revAiJob != null && revAiJob.getSummarization().getJobStatus() == SummarizationJobStatus.IN_PROGRESS) + { + Thread.sleep(5000); + revAiJob = apiClient.getJobDetails(revAiJob.getJobId()); + } + + String summary = apiClient.getTranscriptSummary(revAiJob.getJobId()); + assertThat(summary).isNotNull(); + } public void assertRevAiJob(RevAiJob revAiJob) { assertThat(revAiJob.getJobId()).as("Job Id").isNotNull(); assertThat(revAiJob.getJobStatus()).as("Job status").isEqualTo(RevAiJobStatus.IN_PROGRESS);