Skip to content

Commit 02cd5e3

Browse files
authored
feat: add trigger probability setting for TTS and support to render slider in schema (#4047)
* feat: add trigger probability setting for TTS and support to render slider in schema * chore: ruff format
1 parent 56673ad commit 02cd5e3

File tree

7 files changed

+114
-23
lines changed

7 files changed

+114
-23
lines changed

astrbot/core/config/default.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
"provider_id": "",
109109
"dual_output": False,
110110
"use_file_service": False,
111+
"trigger_probability": 1.0,
111112
},
112113
"provider_ltm_settings": {
113114
"group_icl_enable": False,
@@ -2209,6 +2210,9 @@
22092210
"use_file_service": {
22102211
"type": "bool",
22112212
},
2213+
"trigger_probability": {
2214+
"type": "float",
2215+
},
22122216
},
22132217
},
22142218
"provider_ltm_settings": {
@@ -2419,6 +2423,14 @@
24192423
"provider_tts_settings.enable": True,
24202424
},
24212425
},
2426+
"provider_tts_settings.trigger_probability": {
2427+
"description": "TTS 触发概率",
2428+
"type": "float",
2429+
"slider": {"min": 0, "max": 1, "step": 0.05},
2430+
"condition": {
2431+
"provider_tts_settings.enable": True,
2432+
},
2433+
},
24222434
"provider_settings.image_caption_prompt": {
24232435
"description": "图片转述提示词",
24242436
"type": "text",
@@ -2986,6 +2998,7 @@
29862998
"description": "回复概率",
29872999
"type": "float",
29883000
"hint": "0.0-1.0 之间的数值",
3001+
"slider": {"min": 0, "max": 1, "step": 0.05},
29893002
"condition": {
29903003
"provider_ltm_settings.active_reply.enable": True,
29913004
},

astrbot/core/config/i18n_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def convert_to_i18n_keys(metadata: dict[str, Any]) -> dict[str, Any]:
7979
"_special",
8080
"invisible",
8181
"options",
82+
"slider",
8283
]:
8384
if attr in field_data:
8485
field_result[attr] = field_data[attr]

astrbot/core/pipeline/result_decorate/stage.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import random
12
import re
23
import time
34
import traceback
@@ -42,6 +43,18 @@ async def initialize(self, ctx: PipelineContext):
4243
"forward_threshold"
4344
]
4445

46+
trigger_probability = ctx.astrbot_config["provider_tts_settings"].get(
47+
"trigger_probability",
48+
1,
49+
)
50+
try:
51+
self.tts_trigger_probability = max(
52+
0.0,
53+
min(float(trigger_probability), 1.0),
54+
)
55+
except (TypeError, ValueError):
56+
self.tts_trigger_probability = 1.0
57+
4558
# 分段回复
4659
self.words_count_threshold = int(
4760
ctx.astrbot_config["platform_settings"]["segmented_reply"][
@@ -246,7 +259,14 @@ async def process(
246259
and result.is_llm_result()
247260
and SessionServiceManager.should_process_tts_request(event)
248261
):
249-
if not tts_provider:
262+
should_tts = self.tts_trigger_probability >= 1.0 or (
263+
self.tts_trigger_probability > 0.0
264+
and random.random() <= self.tts_trigger_probability
265+
)
266+
267+
if not should_tts:
268+
logger.debug("跳过 TTS:触发概率未命中。")
269+
elif not tts_provider:
250270
logger.warning(
251271
f"会话 {event.unified_msg_origin} 未配置文本转语音模型。",
252272
)

dashboard/src/components/shared/AstrBotConfig.vue

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -304,16 +304,32 @@ function hasVisibleItemsAfter(items, currentIndex) {
304304
hide-details
305305
></v-text-field>
306306
307-
<!-- Numeric input -->
308-
<v-text-field
307+
<!-- Numeric input with optional slider -->
308+
<div
309309
v-else-if="(metadata[metadataKey].items[key]?.type === 'int' || metadata[metadataKey].items[key]?.type === 'float') && !metadata[metadataKey]?.invisible"
310-
v-model="iterable[key]"
311-
density="compact"
312-
variant="outlined"
313-
class="config-field"
314-
type="number"
315-
hide-details
316-
></v-text-field>
310+
class="d-flex align-center gap-3"
311+
>
312+
<v-slider
313+
v-if="metadata[metadataKey].items[key]?.slider"
314+
v-model.number="iterable[key]"
315+
:min="metadata[metadataKey].items[key]?.slider?.min ?? 0"
316+
:max="metadata[metadataKey].items[key]?.slider?.max ?? 100"
317+
:step="metadata[metadataKey].items[key]?.slider?.step ?? 1"
318+
color="primary"
319+
density="compact"
320+
hide-details
321+
class="flex-grow-1"
322+
></v-slider>
323+
<v-text-field
324+
v-model.number="iterable[key]"
325+
density="compact"
326+
variant="outlined"
327+
class="config-field"
328+
type="number"
329+
hide-details
330+
style="max-width: 140px;"
331+
></v-text-field>
332+
</div>
317333
318334
<!-- Text area -->
319335
<v-textarea
@@ -413,16 +429,32 @@ function hasVisibleItemsAfter(items, currentIndex) {
413429
hide-details
414430
></v-text-field>
415431
416-
<!-- Numeric input -->
417-
<v-text-field
432+
<!-- Numeric input with optional slider -->
433+
<div
418434
v-else-if="(metadata[metadataKey]?.type === 'int' || metadata[metadataKey]?.type === 'float') && !metadata[metadataKey]?.invisible"
419-
v-model="iterable[metadataKey]"
420-
density="compact"
421-
variant="outlined"
422-
class="config-field"
423-
type="number"
424-
hide-details
425-
></v-text-field>
435+
class="d-flex align-center gap-3"
436+
>
437+
<v-slider
438+
v-if="metadata[metadataKey]?.slider"
439+
v-model.number="iterable[metadataKey]"
440+
:min="metadata[metadataKey]?.slider?.min ?? 0"
441+
:max="metadata[metadataKey]?.slider?.max ?? 100"
442+
:step="metadata[metadataKey]?.slider?.step ?? 1"
443+
color="primary"
444+
density="compact"
445+
hide-details
446+
class="flex-grow-1"
447+
></v-slider>
448+
<v-text-field
449+
v-model.number="iterable[metadataKey]"
450+
density="compact"
451+
variant="outlined"
452+
class="config-field"
453+
type="number"
454+
hide-details
455+
style="max-width: 140px;"
456+
></v-text-field>
457+
</div>
426458
427459
<!-- Text area -->
428460
<v-textarea

dashboard/src/components/shared/AstrBotConfigV4.vue

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,29 @@ function getSpecialSubtype(value) {
245245
<v-text-field v-else-if="itemMeta?.type === 'string'" v-model="createSelectorModel(itemKey).value"
246246
density="compact" variant="outlined" class="config-field" hide-details></v-text-field>
247247
248-
<!-- Numeric input for JSON selector -->
249-
<v-text-field v-else-if="itemMeta?.type === 'int' || itemMeta?.type === 'float'"
250-
v-model="createSelectorModel(itemKey).value" density="compact" variant="outlined" class="config-field"
251-
type="number" hide-details></v-text-field>
248+
<!-- Numeric input with optional slider for JSON selector -->
249+
<div v-else-if="itemMeta?.type === 'int' || itemMeta?.type === 'float'" class="d-flex align-center gap-3">
250+
<v-slider
251+
v-if="itemMeta?.slider"
252+
v-model.number="createSelectorModel(itemKey).value"
253+
:min="itemMeta?.slider?.min ?? 0"
254+
:max="itemMeta?.slider?.max ?? 100"
255+
:step="itemMeta?.slider?.step ?? 1"
256+
color="primary"
257+
density="compact"
258+
hide-details
259+
style="flex: 3"
260+
></v-slider>
261+
<v-text-field
262+
v-model.number="createSelectorModel(itemKey).value"
263+
density="compact"
264+
variant="outlined"
265+
class="config-field"
266+
style="flex: 2"
267+
type="number"
268+
hide-details
269+
></v-text-field>
270+
</div>
252271
253272
<!-- Text area for JSON selector -->
254273
<v-textarea v-else-if="itemMeta?.type === 'text'" v-model="createSelectorModel(itemKey).value"

dashboard/src/i18n/locales/en-US/features/config-metadata.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
},
5858
"provider_id": {
5959
"description": "Default Text-to-Speech Model"
60+
},
61+
"trigger_probability": {
62+
"description": "TTS Trigger Probability"
6063
}
6164
}
6265
},

dashboard/src/i18n/locales/zh-CN/features/config-metadata.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
},
6363
"provider_id": {
6464
"description": "默认文本转语音模型"
65+
},
66+
"trigger_probability": {
67+
"description": "TTS 触发概率"
6568
}
6669
}
6770
},

0 commit comments

Comments
 (0)