Răsfoiți Sursa

feat: bailian 阿里云 TTS 永不熔断,真正优先于 edge-tts

- bailian 质量远好于 edge-tts(CosyVoice 自然、edge-tts 机械)
- 把 bailian 熔断阈值设为 999(永不熔断),冷却时间 10s
- edge-tts 熔断阈值保持 3(免费降级,快速熔断合理)
- 同时支持: bailian 失败时不被 invalidparameter 关键字误判为不可切换
  (depends on error code 428 retry policy in while loop)
MyFramework User 2 luni în urmă
părinte
comite
c2c46a8ef6
1 a modificat fișierele cu 9 adăugiri și 5 ștergeri
  1. 9 5
      server/src/modules/tts/provider.registry.ts

+ 9 - 5
server/src/modules/tts/provider.registry.ts

@@ -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`);