|
|
@@ -57,25 +57,29 @@ export function initTtsRegistry(): ProviderRegistry<ITtsProvider> {
|
|
|
|
|
|
const maxTextLen = ttsModel?.maxTextLength;
|
|
|
const provider = new ProviderClass(vendorKey, vendorData.apiKey, modelId, ttsApiPath, maxTextLen);
|
|
|
+ // 阿里云(bailian)质量更好,设永不熔断(用户明确要求 bailian 优先)
|
|
|
+ // edge-tts 是免费降级方案,熔断阈值低一些也无妨
|
|
|
+ const failureThreshold = vendorKey === 'bailian' ? 999 : 3;
|
|
|
+ const cooldownMs = vendorKey === 'bailian' ? 10000 : 60000; // bailian 冷却短,快速恢复尝试
|
|
|
_registry.register(provider, {
|
|
|
enabled: true,
|
|
|
- breakerConfig: { name: `${vendorKey}-tts`, failureThreshold: 3, cooldownMs: 60000 },
|
|
|
+ breakerConfig: { name: `${vendorKey}-tts`, failureThreshold, cooldownMs },
|
|
|
});
|
|
|
- ttsLogger.registry('register', provider.name, `model=${modelId}, vendor=${vendorKey}`);
|
|
|
+ ttsLogger.registry('register', provider.name, `model=${modelId}, vendor=${vendorKey}, threshold=${failureThreshold}, cooldownMs=${cooldownMs}`);
|
|
|
} catch (e) {
|
|
|
ttsLogger.error(`注册 ${vendorKey} TTS 失败`, e as Error);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Mock Provider 兜底(当前已禁用,需要时改为 enabled: true)
|
|
|
+ // Mock Provider 兜底(紧急时启用,平时保持禁用避免污染用户数据)
|
|
|
if (!_registry.get('mock-tts')) {
|
|
|
const mockProvider = new MockTtsProvider();
|
|
|
_registry.register(mockProvider, {
|
|
|
- enabled: false,
|
|
|
+ enabled: process.env.MOCK_TTS_FALLBACK === 'true',
|
|
|
breakerConfig: { name: 'mock-tts', failureThreshold: 999, cooldownMs: 1000 },
|
|
|
});
|
|
|
- ttsLogger.registry('register', mockProvider.name, '已禁用');
|
|
|
+ ttsLogger.registry('register', mockProvider.name, process.env.MOCK_TTS_FALLBACK === 'true' ? '已启用(兜底)' : '已禁用');
|
|
|
}
|
|
|
|
|
|
ttsLogger.info(`TTS Registry 初始化完成,共 ${_registry.size} 个 Provider`);
|