Skip to content

Commit 886c29b

Browse files
authored
Merge pull request #152 from LianjiaTech/develop
merge to main
2 parents 88bd8c7 + 78cbe65 commit 886c29b

25 files changed

Lines changed: 1067 additions & 103 deletions

‎.github/workflows/claude.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ jobs:
5858
claude_env: |
5959
ANTHROPIC_AUTH_TOKEN: ${{ secrets.ANTHROPIC_AUTH_TOKEN }}
6060
ANTHROPIC_SMALL_FAST_MODEL: claude-3-5-haiku
61-
CLAUDE_CODE_MAX_OUTPUT_TOKENS: 64000
61+
CLAUDE_CODE_MAX_OUTPUT_TOKENS: 32000
6262
env:
63-
ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }}
63+
ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }}

‎api/sdk/src/main/java/com/ke/bella/openapi/protocol/IPriceInfo.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.ke.bella.openapi.protocol.realtime.RealTimePriceInfo;
77
import com.ke.bella.openapi.protocol.completion.CompletionPriceInfo;
88
import com.ke.bella.openapi.protocol.embedding.EmbeddingPriceInfo;
9+
import com.ke.bella.openapi.protocol.speaker.SpeakerEmbeddingPriceInfo;
910
import com.ke.bella.openapi.protocol.tts.TtsPriceInfo;
1011
import com.ke.bella.openapi.protocol.images.ImagesPriceInfo;
1112
import lombok.AllArgsConstructor;
@@ -24,6 +25,7 @@ enum EndpointPriceInfoType {
2425
REALTIME_ASR("/v1/audio/asr/stream", RealTimePriceInfo.class),
2526
REALTIME("/v1/audio/realtime", RealTimePriceInfo.class),
2627
TRANSCRIPTION_ASR("/v1/audio/transcriptions", TranscriptionsAsrPriceInfo.class),
28+
SPEAKER_EMBEDDING("/v1/audio/speaker/embedding", SpeakerEmbeddingPriceInfo.class),
2729
IMAGES("/v1/images/generations", ImagesPriceInfo.class),
2830
;
2931

‎api/sdk/src/main/java/com/ke/bella/openapi/protocol/document/parse/DocParseRequest.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ public class DocParseRequest implements UserRequest {
1414
private SourceFile file;
1515
private String user;
1616
private String model;
17-
private String type; //task, block
17+
private String type; //task, blocking
18+
private String callbackUrl;
19+
private int maxTimeoutMillis;
1820
}

‎api/sdk/src/main/java/com/ke/bella/openapi/protocol/realtime/RealTimeMessage.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,20 @@ public static class Payload implements Serializable {
269269
* 变量配置
270270
*/
271271
private Map<String, Object> variables;
272+
273+
/**
274+
* 热词字符串
275+
* 用于语音识别热词配置
276+
*/
277+
@JsonProperty("hot_words")
278+
private String hotWords;
279+
280+
/**
281+
* 热词表ID
282+
* 用于语音识别热词表配置
283+
*/
284+
@JsonProperty("hot_words_table_id")
285+
private String hotWordsTableId;
272286
}
273287

274288
/**
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.ke.bella.openapi.protocol.speaker;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import com.ke.bella.openapi.protocol.IPriceInfo;
5+
import lombok.Data;
6+
7+
import java.io.Serializable;
8+
import java.math.BigDecimal;
9+
import java.util.Map;
10+
11+
/**
12+
* Price information for speaker embedding requests
13+
* 基于音频时长计费
14+
*/
15+
@Data
16+
public class SpeakerEmbeddingPriceInfo implements IPriceInfo, Serializable {
17+
private static final long serialVersionUID = 1L;
18+
19+
/**
20+
* 音频处理单价(元/小时)
21+
*/
22+
private BigDecimal price;
23+
24+
@Override
25+
public String getUnit() {
26+
return "元/小时";
27+
}
28+
29+
@Override
30+
public Map<String, String> description() {
31+
return ImmutableMap.of("price", "每小时价格(元)");
32+
}
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.ke.bella.openapi.protocol.speaker;
2+
3+
import lombok.Data;
4+
import org.apache.commons.lang3.StringUtils;
5+
6+
/**
7+
* Property class for speaker embedding providers
8+
*/
9+
@Data
10+
public class SpeakerEmbeddingProperty {
11+
private String encodingType = StringUtils.EMPTY;
12+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.ke.bella.openapi.protocol.speaker;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.ke.bella.openapi.protocol.UserRequest;
6+
import lombok.Data;
7+
8+
import java.io.Serializable;
9+
10+
/**
11+
* Speaker embedding request for generating voice embeddings from audio
12+
*/
13+
@JsonInclude(JsonInclude.Include.NON_NULL)
14+
@Data
15+
public class SpeakerEmbeddingRequest implements UserRequest, Serializable {
16+
private static final long serialVersionUID = 1L;
17+
18+
private String url;
19+
private String base64;
20+
private String model;
21+
private boolean normalize = true;
22+
private String user = "";
23+
@JsonProperty("sample_rate")
24+
private int sampleRate = 16000;
25+
@JsonProperty("task_id")
26+
private String taskId = "";
27+
28+
// Voice Activity Detection parameters
29+
@JsonProperty("enable_vad")
30+
private boolean enableVad = false;
31+
@JsonProperty("vad_aggressiveness")
32+
private int vadAggressiveness = 1;
33+
@JsonProperty("min_speech_duration")
34+
private double minSpeechDuration = 1.0;
35+
@JsonProperty("max_silence_duration")
36+
private double maxSilenceDuration = 0.5;
37+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.ke.bella.openapi.protocol.speaker;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.ke.bella.openapi.protocol.OpenapiResponse;
6+
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
8+
9+
import java.math.BigDecimal;
10+
import java.math.RoundingMode;
11+
import java.util.List;
12+
13+
/**
14+
* Speaker embedding response containing embeddings for audio segments
15+
*/
16+
@JsonInclude(JsonInclude.Include.NON_NULL)
17+
@EqualsAndHashCode(callSuper = true)
18+
@Data
19+
public class SpeakerEmbeddingResponse extends OpenapiResponse {
20+
private String task = "speaker_embedding";
21+
@JsonProperty("task_id")
22+
private String taskId = "";
23+
private double duration = 0;
24+
private List<Embedding> embeddings;
25+
private int dimensions = 0;
26+
27+
@Data
28+
public static class Embedding {
29+
private int id = 0;
30+
private double start = 0;
31+
private double end = 0;
32+
private double confidence = 0.0;
33+
private List<Double> embedding;
34+
35+
public void setStart(double start) {
36+
this.start = roundToThreeDecimals(start);
37+
}
38+
39+
public void setEnd(double end) {
40+
this.end = roundToThreeDecimals(end);
41+
}
42+
43+
private double roundToThreeDecimals(double value) {
44+
return BigDecimal.valueOf(value)
45+
.setScale(3, RoundingMode.HALF_UP)
46+
.doubleValue();
47+
}
48+
}
49+
}

‎api/server/pom.xml‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,19 @@
243243
<groupId>org.springframework.boot</groupId>
244244
<artifactId>spring-boot-starter-logging</artifactId>
245245
</exclusion>
246+
<!-- 排除不兼容的Redisson Spring Data适配器 -->
247+
<exclusion>
248+
<groupId>org.redisson</groupId>
249+
<artifactId>redisson-spring-data-27</artifactId>
250+
</exclusion>
246251
</exclusions>
247252
</dependency>
253+
<!-- 显式添加兼容的Redisson Spring Data适配器 -->
254+
<dependency>
255+
<groupId>org.redisson</groupId>
256+
<artifactId>redisson-spring-data-23</artifactId>
257+
<version>3.17.7</version>
258+
</dependency>
248259
<dependency>
249260
<groupId>com.lmax</groupId>
250261
<artifactId>disruptor</artifactId>
@@ -271,11 +282,6 @@
271282
<artifactId>cas-client-core</artifactId>
272283
<version>3.6.4</version>
273284
</dependency>
274-
<dependency>
275-
<groupId>org.springframework.data</groupId>
276-
<artifactId>spring-data-redis</artifactId>
277-
<version>2.2.0.RELEASE</version>
278-
</dependency>
279285
<dependency>
280286
<groupId>junit</groupId>
281287
<artifactId>junit</artifactId>

‎api/server/src/main/java/com/ke/bella/openapi/endpoints/AudioController.java‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
import com.ke.bella.openapi.protocol.log.EndpointLogger;
2323
import com.ke.bella.openapi.protocol.realtime.RealTimeAdaptor;
2424
import com.ke.bella.openapi.protocol.realtime.RealTimeHandler;
25+
import com.ke.bella.openapi.protocol.speaker.SpeakerEmbeddingAdaptor;
26+
import com.ke.bella.openapi.protocol.speaker.SpeakerEmbeddingProperty;
27+
import com.ke.bella.openapi.protocol.speaker.SpeakerEmbeddingRequest;
28+
import com.ke.bella.openapi.protocol.speaker.SpeakerEmbeddingResponse;
2529
import com.ke.bella.openapi.protocol.tts.TtsAdaptor;
2630
import com.ke.bella.openapi.protocol.tts.TtsProperty;
2731
import com.ke.bella.openapi.protocol.tts.TtsRequest;
@@ -269,4 +273,25 @@ public FlashAsrResponse flashAsr(@RequestHeader(value = "format", defaultValue =
269273
return adaptor.asr(request, url, property, processData);
270274
}
271275

276+
@PostMapping("/speaker/embedding")
277+
@SuppressWarnings({ "rawtypes", "unchecked" })
278+
public SpeakerEmbeddingResponse speakerEmbedding(@RequestBody SpeakerEmbeddingRequest request) {
279+
String endpoint = EndpointContext.getRequest().getRequestURI();
280+
String model = request.getModel();
281+
EndpointContext.setEndpointData(endpoint, model, request);
282+
EndpointProcessData processData = EndpointContext.getProcessData();
283+
ChannelDB channel = router.route(endpoint, model, EndpointContext.getApikey(), processData.isMock());
284+
EndpointContext.setEndpointData(channel);
285+
if(!EndpointContext.getProcessData().isPrivate()) {
286+
limiterManager.incrementConcurrentCount(EndpointContext.getProcessData().getAkCode(), model);
287+
}
288+
String protocol = processData.getProtocol();
289+
String url = processData.getForwardUrl();
290+
String channelInfo = channel.getChannelInfo();
291+
SpeakerEmbeddingAdaptor adaptor = adaptorManager.getProtocolAdaptor(endpoint, protocol, SpeakerEmbeddingAdaptor.class);
292+
SpeakerEmbeddingProperty property = (SpeakerEmbeddingProperty) JacksonUtils.deserialize(channelInfo, adaptor.getPropertyClass());
293+
EndpointContext.setEncodingType(property.getEncodingType());
294+
return adaptor.speakerEmbedding(request, url, property);
295+
}
296+
272297
}

0 commit comments

Comments
 (0)