feat: updates to test branch

This commit is contained in:
RT15548
2026-02-25 23:58:05 +08:00
parent 8bfa0dd537
commit c3bb162a10
15 changed files with 3596 additions and 2291 deletions

View File

@@ -1,4 +1,4 @@
// ============ 导入 ============
// ============ 导入 ============
import { event_types } from "../../../../../../script.js";
import { extension_settings, getContext } from "../../../../../extensions.js";
@@ -42,8 +42,12 @@ const HTML_PATH = `${extensionFolderPath}/modules/tts/tts-overlay.html`;
const TTS_DIRECTIVE_REGEX = /\[tts:([^\]]*)\]/gi;
const FREE_VOICE_KEYS = new Set([
'female_1', 'female_2', 'female_3', 'female_4', 'female_5', 'female_6', 'female_7',
'male_1', 'male_2', 'male_3', 'male_4'
'female_1', 'female_2', 'female_3', 'female_4',
'hk_female_1', 'hk_female_2', 'hk_male_1',
'tw_female_1', 'tw_female_2', 'tw_male_1',
'male_1', 'male_2', 'male_3', 'male_4',
'en_female_1', 'en_female_2', 'en_female_3', 'en_male_1', 'en_male_2',
'ja_female_1', 'ja_male_1',
]);
// ============ NovelDraw 兼容 ============
@@ -913,11 +917,26 @@ async function loadConfig() {
config = await TtsStorage.load();
config.volc = config.volc || {};
let legacyPurged = false;
if (Array.isArray(config.volc.mySpeakers)) {
config.volc.mySpeakers = config.volc.mySpeakers.map(s => ({
const normalized = config.volc.mySpeakers.map(s => ({
...s,
source: s.source || getVoiceSource(s.value)
}));
const filtered = normalized.filter(s => {
// Purge legacy free voices that are no longer supported by the current free voice map.
if (s.source === 'free' && !FREE_VOICE_KEYS.has(s.value)) {
legacyPurged = true;
return false;
}
return true;
});
config.volc.mySpeakers = filtered;
}
if (config.volc.defaultSpeaker && getVoiceSource(config.volc.defaultSpeaker) === 'free' && !FREE_VOICE_KEYS.has(config.volc.defaultSpeaker)) {
config.volc.defaultSpeaker = FREE_DEFAULT_VOICE;
legacyPurged = true;
}
config.volc.disableMarkdownFilter = config.volc.disableMarkdownFilter !== false;
@@ -943,6 +962,12 @@ async function loadConfig() {
config.showFloorButton = config.showFloorButton !== false;
config.showFloatingButton = config.showFloatingButton === true;
if (legacyPurged) {
await TtsStorage.set('volc', config.volc);
await TtsStorage.saveNow({ silent: true });
console.info('[TTS] Purged legacy free voices from mySpeakers.');
}
return config;
}
@@ -1054,15 +1079,17 @@ async function handleIframeMessage(ev) {
closeSettings();
break;
case 'xb-tts:save-config': {
const ok = await saveConfig(payload);
const requestId = payload?.requestId || '';
const patch = (payload && typeof payload.patch === 'object') ? payload.patch : payload;
const ok = await saveConfig(patch);
if (ok) {
const cacheStats = await getCacheStatsSafe();
postToIframe(iframe, { type: 'xb-tts:config-saved', payload: { ...config, cacheStats } });
postToIframe(iframe, { type: 'xb-tts:config-saved', payload: { ...config, cacheStats, requestId } });
updateAutoSpeakAll();
updateSpeedAll();
updateVoiceAll();
} else {
postToIframe(iframe, { type: 'xb-tts:config-save-error', payload: { message: '保存失败' } });
postToIframe(iframe, { type: 'xb-tts:config-save-error', payload: { message: '保存失败', requestId } });
}
break;
}
@@ -1472,3 +1499,4 @@ export function cleanupTts() {
cacheCounters.misses = 0;
delete window.xiaobaixTts;
}