Skip to content

Commit 265c988

Browse files
authored
[Add] QwenTranscription (#157)
1 parent 42a13a3 commit 265c988

File tree

7 files changed

+329
-0
lines changed

7 files changed

+329
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
import com.alibaba.dashscope.api.AsynchronousApi;
6+
import com.alibaba.dashscope.common.Function;
7+
import com.alibaba.dashscope.common.Task;
8+
import com.alibaba.dashscope.common.TaskGroup;
9+
import com.alibaba.dashscope.exception.ApiException;
10+
import com.alibaba.dashscope.exception.NoApiKeyException;
11+
import com.alibaba.dashscope.protocol.ApiServiceOption;
12+
import com.alibaba.dashscope.protocol.HttpMethod;
13+
import com.alibaba.dashscope.protocol.Protocol;
14+
import com.alibaba.dashscope.protocol.StreamingMode;
15+
import lombok.extern.slf4j.Slf4j;
16+
17+
@Slf4j
18+
public final class QwenTranscription {
19+
private final AsynchronousApi<QwenTranscriptionParam> asyncApi;
20+
private final ApiServiceOption createServiceOptions;
21+
private final String baseUrl;
22+
23+
public QwenTranscription() {
24+
asyncApi = new AsynchronousApi<QwenTranscriptionParam>();
25+
createServiceOptions =
26+
ApiServiceOption.builder()
27+
.protocol(Protocol.HTTP)
28+
.httpMethod(HttpMethod.POST)
29+
.streamingMode(StreamingMode.NONE)
30+
.taskGroup(TaskGroup.AUDIO.getValue())
31+
.task(Task.ASR.getValue())
32+
.function(Function.TRANSCRIPTION.getValue())
33+
.isAsyncTask(true)
34+
.build();
35+
this.baseUrl = null;
36+
}
37+
38+
public QwenTranscriptionResult asyncCall(QwenTranscriptionParam param) {
39+
try {
40+
return QwenTranscriptionResult.fromDashScopeResult(
41+
asyncApi.asyncCall(param, createServiceOptions));
42+
} catch (NoApiKeyException e) {
43+
throw new ApiException(e);
44+
}
45+
}
46+
47+
public QwenTranscriptionResult wait(QwenTranscriptionQueryParam queryParam) {
48+
try {
49+
return QwenTranscriptionResult.fromDashScopeResult(
50+
asyncApi.wait(
51+
queryParam.getTaskId(),
52+
queryParam.getApiKey(),
53+
baseUrl,
54+
queryParam.getCustomHeaders()));
55+
} catch (NoApiKeyException e) {
56+
throw new ApiException(e);
57+
}
58+
}
59+
60+
public QwenTranscriptionResult fetch(QwenTranscriptionQueryParam queryParam) {
61+
try {
62+
return QwenTranscriptionResult.fromDashScopeResult(
63+
asyncApi.fetch(
64+
queryParam.getTaskId(),
65+
queryParam.getApiKey(),
66+
baseUrl,
67+
queryParam.getCustomHeaders()));
68+
} catch (NoApiKeyException e) {
69+
throw new ApiException(e);
70+
}
71+
}
72+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
public class QwenTranscriptionApiKeywords {
6+
7+
public static final String CHANNEL_ID = "channel_id";
8+
9+
public static final String TASK_ID = "task_id";
10+
11+
public static final String TASK_STATUS = "task_status";
12+
13+
public static final String TASK_RESULT = "result";
14+
15+
public static final String FILE_URL = "file_url";
16+
17+
public static final String TRANSCRIPTION_URL = "transcription_url";
18+
19+
public static final String SUBTASK_STATUS = "subtask_status";
20+
21+
public static final String TASK_METRICS = "task_metrics";
22+
23+
public static final String DIARIZATION_ENABLED = "diarization_enabled";
24+
25+
public static final String SPEAKER_COUNT = "speaker_count";
26+
27+
public static final String DISFLUENCY_REMOVAL_ENABLED = "disfluency_removal_enabled";
28+
29+
public static final String TIMESTAMP_ALIGNMENT_ENABLED = "timestamp_alignment_enabled";
30+
31+
public static final String SPECIAL_WORD_FILTER = "special_word_filter";
32+
33+
public static final String AUDIO_EVENT_DETECTION_ENABLED = "audio_event_detection_enabled";
34+
35+
public static final String VOCABULARY_ID = "vocabulary_id";
36+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
import com.alibaba.dashscope.utils.JsonUtils;
6+
import com.google.gson.JsonObject;
7+
import com.google.gson.annotations.SerializedName;
8+
import lombok.Data;
9+
10+
@Data
11+
public class QwenTranscriptionMetrics {
12+
@SerializedName("TOTAL")
13+
private int total;
14+
15+
@SerializedName("SUCCEEDED")
16+
private int succeeded;
17+
18+
@SerializedName("FAILED")
19+
private int failed;
20+
21+
public static QwenTranscriptionMetrics from(JsonObject asJsonObject) {
22+
return JsonUtils.fromJsonObject(asJsonObject, QwenTranscriptionMetrics.class);
23+
}
24+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
import com.alibaba.dashscope.base.HalfDuplexServiceParam;
6+
import com.alibaba.dashscope.exception.InputRequiredException;
7+
import com.alibaba.dashscope.utils.ApiKeywords;
8+
import com.alibaba.dashscope.utils.JsonUtils;
9+
import com.google.gson.JsonArray;
10+
import com.google.gson.JsonElement;
11+
import com.google.gson.JsonObject;
12+
import lombok.Builder;
13+
import lombok.Data;
14+
import lombok.EqualsAndHashCode;
15+
import lombok.NonNull;
16+
import lombok.experimental.SuperBuilder;
17+
import lombok.extern.slf4j.Slf4j;
18+
19+
import java.nio.ByteBuffer;
20+
import java.util.Collections;
21+
import java.util.List;
22+
23+
@EqualsAndHashCode(callSuper = true)
24+
@Data
25+
@SuperBuilder
26+
@Slf4j
27+
public class QwenTranscriptionParam extends HalfDuplexServiceParam {
28+
29+
@NonNull private String fileUrl;
30+
31+
@Override
32+
public JsonObject getHttpBody() {
33+
JsonObject body = new JsonObject();
34+
body.addProperty("model", getModel());
35+
36+
JsonArray jsonChannelId = new JsonArray();
37+
38+
JsonObject jsonInput = new JsonObject();
39+
jsonInput.addProperty(QwenTranscriptionApiKeywords.FILE_URL, fileUrl);
40+
body.add("input", jsonInput);
41+
42+
JsonObject jsonParameters = JsonUtils.parametersToJsonObject(getParameters());
43+
body.add("parameters", jsonParameters);
44+
log.debug("body=>{}", body);
45+
return body;
46+
}
47+
48+
@Override
49+
public Object getInput() {
50+
JsonObject jsonInput = new JsonObject();
51+
jsonInput.addProperty(QwenTranscriptionApiKeywords.FILE_URL, fileUrl);
52+
return jsonInput;
53+
}
54+
55+
@Override
56+
public ByteBuffer getBinaryData() {
57+
throw new UnsupportedOperationException("Unimplemented method 'getBinaryData'");
58+
}
59+
60+
@Override
61+
public void validate() throws InputRequiredException {}
62+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.alibaba.dashscope.audio.qwen_asr;
2+
3+
import lombok.Data;
4+
import lombok.experimental.SuperBuilder;
5+
6+
import java.util.Map;
7+
8+
@Data
9+
@SuperBuilder
10+
public class QwenTranscriptionQueryParam {
11+
private String taskId;
12+
13+
private String apiKey;
14+
15+
private Map<String, String> headers;
16+
17+
public Map<String, String> getCustomHeaders() {
18+
return headers;
19+
}
20+
21+
public static QwenTranscriptionQueryParam FromTranscriptionParam(
22+
QwenTranscriptionParam param, String taskId) {
23+
return QwenTranscriptionQueryParam.builder()
24+
.apiKey(param.getApiKey())
25+
.taskId(taskId)
26+
.headers(param.getHeaders())
27+
.build();
28+
}
29+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
import com.alibaba.dashscope.common.DashScopeResult;
6+
import com.alibaba.dashscope.common.TaskStatus;
7+
import com.alibaba.dashscope.exception.ApiException;
8+
import com.alibaba.dashscope.utils.ApiKeywords;
9+
import com.google.gson.JsonArray;
10+
import com.google.gson.JsonElement;
11+
import com.google.gson.JsonObject;
12+
import com.google.gson.annotations.SerializedName;
13+
import lombok.Data;
14+
import lombok.EqualsAndHashCode;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
@Data
20+
@EqualsAndHashCode()
21+
public class QwenTranscriptionResult {
22+
@SerializedName(ApiKeywords.REQUEST_ID)
23+
private String requestId;
24+
/** The model outputs. */
25+
private JsonObject output;
26+
27+
/** The data usage. */
28+
private JsonObject usage;
29+
30+
private TaskStatus taskStatus;
31+
32+
private String taskId;
33+
34+
private QwenTranscriptionTaskResult result;
35+
36+
private QwenTranscriptionMetrics metrics;
37+
38+
public static QwenTranscriptionResult fromDashScopeResult(DashScopeResult dashScopeResult)
39+
throws ApiException {
40+
QwenTranscriptionResult result = new QwenTranscriptionResult();
41+
result.output = (JsonObject) dashScopeResult.getOutput();
42+
if (dashScopeResult.getUsage() != null) {
43+
result.usage = dashScopeResult.getUsage().getAsJsonObject();
44+
}
45+
result.requestId = dashScopeResult.getRequestId();
46+
if (dashScopeResult.getOutput() != null) {
47+
if (result.output.has(QwenTranscriptionApiKeywords.TASK_STATUS)) {
48+
JsonElement jsonTaskStatus = result.output.get(QwenTranscriptionApiKeywords.TASK_STATUS);
49+
if (jsonTaskStatus != null) {
50+
result.taskStatus = TaskStatus.valueOf(jsonTaskStatus.getAsString());
51+
} else {
52+
result.taskStatus = TaskStatus.FAILED;
53+
}
54+
}
55+
if (result.output.has(QwenTranscriptionApiKeywords.TASK_ID)) {
56+
result.taskId = result.output.get(QwenTranscriptionApiKeywords.TASK_ID).getAsString();
57+
} else {
58+
result.taskId = null;
59+
}
60+
if (result.output.has(QwenTranscriptionApiKeywords.TASK_RESULT)) {
61+
JsonElement jsonResult = result.output.get(QwenTranscriptionApiKeywords.TASK_RESULT);
62+
if (jsonResult != null) {
63+
result.result = QwenTranscriptionTaskResult.from(jsonResult.getAsJsonObject());
64+
} else {
65+
result.result = new QwenTranscriptionTaskResult();
66+
}
67+
}
68+
if (result.output.has(QwenTranscriptionApiKeywords.TASK_METRICS)) {
69+
JsonElement jsonMetrics = result.output.get(QwenTranscriptionApiKeywords.TASK_METRICS);
70+
if (jsonMetrics != null) {
71+
result.setMetrics(QwenTranscriptionMetrics.from(jsonMetrics.getAsJsonObject()));
72+
} else {
73+
result.setMetrics(new QwenTranscriptionMetrics());
74+
}
75+
}
76+
}
77+
return result;
78+
}
79+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) Alibaba, Inc. and its affiliates.
2+
3+
package com.alibaba.dashscope.audio.qwen_asr;
4+
5+
import com.alibaba.dashscope.common.TaskStatus;
6+
import com.alibaba.dashscope.utils.JsonUtils;
7+
import com.google.gson.JsonObject;
8+
import com.google.gson.annotations.SerializedName;
9+
import lombok.Data;
10+
11+
@Data
12+
public class QwenTranscriptionTaskResult {
13+
@SerializedName("file_url")
14+
String fileUrl;
15+
16+
@SerializedName("transcription_url")
17+
String transcriptionUrl;
18+
19+
@SerializedName("subtask_status")
20+
TaskStatus subTaskStatus;
21+
22+
String message;
23+
24+
public static QwenTranscriptionTaskResult from(JsonObject json) {
25+
return JsonUtils.fromJsonObject(json, QwenTranscriptionTaskResult.class);
26+
}
27+
}

0 commit comments

Comments
 (0)