Skip to content

Commit bf2c882

Browse files
committed
feat(ai-gateway): ASR 热词增强全链路透传
所有 provider 新增 hotwords 参数,支持 ASR 热词增强端到端透传: - base_provider.py: 基类 hotwords 骨架参数 - glm_provider.py: GLM-ASR 官方 hotwords 参数透传 - qwen_provider.py: Qwen3-ASR-Flash asr_options.hotwords 透传 - deepseek/gemini_provider.py: 骨架参数保持接口一致 - transcribe_chain.py: 链式调用透传 hotwords - routers/transcribe.py: API 端点新增 hotwords 字段(≤500 字符)
1 parent 3522567 commit bf2c882

7 files changed

Lines changed: 16 additions & 0 deletions

File tree

‎server/ai-gateway/chains/transcribe_chain.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ async def run(
5757
language: str = "zh",
5858
sample_rate: int = 16000,
5959
channels: int = 1,
60+
hotwords: str = "",
6061
) -> dict[str, Any]:
6162
"""
6263
将音频 base64 数据转写为文本
@@ -66,6 +67,7 @@ async def run(
6667
language: 语言代码(zh/en/auto)
6768
sample_rate: 采样率
6869
channels: 声道数
70+
hotwords: 热词增强字符串(空格分隔)
6971
7072
Returns:
7173
{
@@ -88,6 +90,7 @@ async def run(
8890
sample_rate=sample_rate,
8991
channels=channels,
9092
model=self.model,
93+
hotwords=hotwords,
9194
_feature="transcribe",
9295
)
9396

‎server/ai-gateway/providers/base_provider.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ async def transcribe(
333333
sample_rate: int = 16000,
334334
channels: int = 1,
335335
model: str = "",
336+
hotwords: str = "",
336337
) -> dict[str, Any]:
337338
"""
338339
语音转文字

‎server/ai-gateway/providers/deepseek_provider.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ async def transcribe(
182182
sample_rate: int = 16000,
183183
channels: int = 1,
184184
model: str = "",
185+
hotwords: str = "",
185186
) -> dict[str, Any]:
186187
"""DeepSeek 不支持 ASR,始终抛出 NotImplementedError"""
187188
raise NotImplementedError("DeepSeekProvider 不支持语音转文字,请使用 Qwen 或 GLM Provider")

‎server/ai-gateway/providers/gemini_provider.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ async def transcribe(
349349
sample_rate: int = 16000,
350350
channels: int = 1,
351351
model: str = "",
352+
hotwords: str = "",
352353
) -> dict[str, Any]:
353354
"""Gemini 不提供独立 ASR,暂不支持"""
354355
raise NotImplementedError("GeminiProvider 不支持独立语音转文字")

‎server/ai-gateway/providers/glm_provider.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ async def transcribe(
138138
sample_rate: int = 16000,
139139
channels: int = 1,
140140
model: str = "glm-asr",
141+
hotwords: str = "",
141142
) -> dict[str, Any]:
142143
"""
143144
调用智谱 GLM-ASR 语音转文字
@@ -146,6 +147,7 @@ async def transcribe(
146147
经 OpenAI 兼容 SDK 的 audio.transcriptions.create 调用。官方参数仅
147148
model/file(或 file_base64)/prompt/hotwords/stream,不支持 language,
148149
故不传;音频限制 wav/mp3、≤25MB、时长 ≤30 秒。
150+
hotwords 经 kwargs 透传(GLM-ASR 官方支持)。
149151
"""
150152
start_time = time.monotonic()
151153

@@ -159,6 +161,8 @@ async def transcribe(
159161
"model": model,
160162
"file": audio_file,
161163
}
164+
if hotwords:
165+
kwargs["hotwords"] = hotwords
162166

163167
response = await self._client.audio.transcriptions.create(**kwargs)
164168

‎server/ai-gateway/providers/qwen_provider.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ async def transcribe(
123123
sample_rate: int = 16000,
124124
channels: int = 1,
125125
model: str = "qwen3-asr-flash",
126+
hotwords: str = "",
126127
) -> dict[str, Any]:
127128
"""
128129
调用阿里云百炼 Qwen3-ASR-Flash 语音转文字
@@ -132,6 +133,7 @@ async def transcribe(
132133
官方调用规范:chat.completions + input_audio 内容块(Base64 Data URL,
133134
编码后 ≤10MB),语言经 extra_body.asr_options.language 指定,
134135
language="auto" 时不传该字段由模型自动检测。
136+
hotwords 经 asr_options.hotwords 透传(Qwen3-ASR-Flash 支持热词增强)。
135137
"""
136138
start_time = time.monotonic()
137139

@@ -143,6 +145,8 @@ async def transcribe(
143145
asr_options: dict[str, Any] = {"enable_itn": True}
144146
if language != "auto":
145147
asr_options["language"] = language
148+
if hotwords:
149+
asr_options["hotwords"] = hotwords
146150

147151
response = await self._client.chat.completions.create(
148152
model=model,

‎server/ai-gateway/routers/transcribe.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class TranscribeRequest(BaseModel):
3434
language: str = Field(default="zh", max_length=16, description="语言代码:zh/en/auto")
3535
sample_rate: int = Field(default=16000, ge=8000, le=96000, description="采样率")
3636
channels: int = Field(default=1, ge=1, le=2, description="声道数")
37+
hotwords: str = Field(default="", max_length=500, description="热词增强字符串(空格分隔,透传 ASR 引擎)")
3738

3839

3940
class TranscribeSegment(BaseModel):
@@ -88,6 +89,7 @@ async def _run_chain(provider, model_name):
8889
language=body.language,
8990
sample_rate=body.sample_rate,
9091
channels=body.channels,
92+
hotwords=body.hotwords,
9193
)
9294

9395
try:

0 commit comments

Comments
 (0)