feat(tts): switch broadcast generation to s2.1-pro-free

Update the generator and temp broadcast flows to send the new Fish Audio model and reference IDs so Chinese and secondary-language audio use the latest requested voice configuration.
This commit is contained in:
2026-08-01 08:50:13 +08:00
parent 529c871b0e
commit a2408da417
3 changed files with 31 additions and 13 deletions
+8 -5
View File
@@ -719,8 +719,9 @@
<div class="toast-container" id="toast-container"></div> <div class="toast-container" id="toast-container"></div>
<script> <script>
const ZH_MODEL = "7b64d954530d490a8c40827e618e55c6"; const TTS_MODEL = "s2.1-pro-free";
const EN_MODEL = "fe09163b345448eabfeccb25dc435c43"; const ZH_REFERENCE_ID = "0aee9f0f5683480d987c9e3c5d2de04c";
const EN_REFERENCE_ID = "38985e545cff41b79c11c32b0196c9a0";
let zhTempFile = null; let zhTempFile = null;
let enTempFile = null; let enTempFile = null;
@@ -821,7 +822,7 @@
const res = await fetch('/api/tts/generate', { const res = await fetch('/api/tts/generate', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text, reference_id }) body: JSON.stringify({ text, reference_id, model: TTS_MODEL })
}); });
const data = await res.json(); const data = await res.json();
if (!data.success) throw new Error(data.message); if (!data.success) throw new Error(data.message);
@@ -1110,7 +1111,8 @@
}, },
body: JSON.stringify({ body: JSON.stringify({
text: zhText, text: zhText,
reference_id: ZH_MODEL reference_id: ZH_REFERENCE_ID,
model: TTS_MODEL
}) })
}); });
@@ -1127,7 +1129,8 @@
}, },
body: JSON.stringify({ body: JSON.stringify({
text: enText, text: enText,
reference_id: EN_MODEL reference_id: EN_REFERENCE_ID,
model: TTS_MODEL
}) })
}); });
+8 -2
View File
@@ -235,7 +235,8 @@
</div> </div>
<script> <script>
const ZH_MODEL = "7b64d954530d490a8c40827e618e55c6"; const TTS_MODEL = "s2.1-pro-free";
const ZH_REFERENCE_ID = "0aee9f0f5683480d987c9e3c5d2de04c";
let state = { let state = {
broadcastId: null, broadcastId: null,
broadcastUrl: null broadcastUrl: null
@@ -335,7 +336,12 @@
const resp = await fetch("/api/temp-broadcast/compose", { const resp = await fetch("/api/temp-broadcast/compose", {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text, reference_id: ZH_MODEL, prefixName: "lsts" }) body: JSON.stringify({
text,
reference_id: ZH_REFERENCE_ID,
model: TTS_MODEL,
prefixName: "lsts"
})
}); });
const data = await resp.json(); const data = await resp.json();
if (!data || !data.success) throw new Error(data?.message || "合成失败"); if (!data || !data.success) throw new Error(data?.message || "合成失败");
+15 -6
View File
@@ -16,7 +16,9 @@ const server = http.createServer(app);
const wss = new WebSocket.Server({ server }); const wss = new WebSocket.Server({ server });
const PORT = Number(process.env.PORT || '8999'); const PORT = Number(process.env.PORT || '8999');
const DEFAULT_ZH_MODEL = process.env.ZH_MODEL || '7b64d954530d490a8c40827e618e55c6'; const DEFAULT_TTS_MODEL = process.env.TTS_MODEL || 's2.1-pro-free';
const DEFAULT_ZH_REFERENCE_ID = process.env.ZH_REFERENCE_ID || '0aee9f0f5683480d987c9e3c5d2de04c';
const DEFAULT_EN_REFERENCE_ID = process.env.EN_REFERENCE_ID || '38985e545cff41b79c11c32b0196c9a0';
const HLS_ENABLE = process.env.HLS_ENABLE !== '0'; const HLS_ENABLE = process.env.HLS_ENABLE !== '0';
const HLS_STREAM_MODE = (process.env.HLS_STREAM_MODE || 'event').toLowerCase(); const HLS_STREAM_MODE = (process.env.HLS_STREAM_MODE || 'event').toLowerCase();
@@ -2265,12 +2267,13 @@ function requestDirect(urlStr, options) {
}); });
} }
async function generateTtsWavToTemp(text, reference_id) { async function generateTtsWavToTemp(text, reference_id, model = DEFAULT_TTS_MODEL) {
const proxyUrl = process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy || process.env.ALL_PROXY || process.env.all_proxy; const proxyUrl = process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy || process.env.ALL_PROXY || process.env.all_proxy;
const requestBody = JSON.stringify({ const requestBody = JSON.stringify({
text: text, text: text,
reference_id: reference_id, reference_id: reference_id,
model: model,
format: "wav" format: "wav"
}); });
@@ -2305,16 +2308,20 @@ async function generateTtsWavToTemp(text, reference_id) {
} }
app.post('/api/tts/generate', express.json(), async (req, res) => { app.post('/api/tts/generate', express.json(), async (req, res) => {
const { text, reference_id } = req.body; const text = String(req.body?.text || '').trim();
const reference_id = String(req.body?.reference_id || '').trim();
const model = String(req.body?.model || DEFAULT_TTS_MODEL).trim();
if (!text || !reference_id) return res.status(400).json({ success: false, message: 'Missing text or reference_id' }); if (!text || !reference_id) return res.status(400).json({ success: false, message: 'Missing text or reference_id' });
if (!model) return res.status(400).json({ success: false, message: 'Missing model' });
try { try {
const proxyUrl = process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy || process.env.ALL_PROXY || process.env.all_proxy; const proxyUrl = process.env.HTTP_PROXY || process.env.http_proxy || process.env.HTTPS_PROXY || process.env.https_proxy || process.env.ALL_PROXY || process.env.all_proxy;
console.log(`[TTS] Sending request for text: "${text}"${proxyUrl ? ` via proxy: ${proxyUrl}` : ''}`); console.log(`[TTS] Sending request for text: "${text}" with model "${model}"${proxyUrl ? ` via proxy: ${proxyUrl}` : ''}`);
const requestBody = JSON.stringify({ const requestBody = JSON.stringify({
text: text, text: text,
reference_id: reference_id, reference_id: reference_id,
model: model,
format: "wav" format: "wav"
}); });
@@ -2482,17 +2489,19 @@ app.post('/api/temp-broadcast/build', (req, res) => {
app.post('/api/temp-broadcast/compose', express.json(), async (req, res) => { app.post('/api/temp-broadcast/compose', express.json(), async (req, res) => {
const text = String(req.body?.text || '').trim(); const text = String(req.body?.text || '').trim();
const reference_id = String(req.body?.reference_id || DEFAULT_ZH_MODEL).trim(); const reference_id = String(req.body?.reference_id || DEFAULT_ZH_REFERENCE_ID).trim();
const model = String(req.body?.model || DEFAULT_TTS_MODEL).trim();
const prefixName = String(req.body?.prefixName || 'lsts').trim(); const prefixName = String(req.body?.prefixName || 'lsts').trim();
if (!text) return res.status(400).json({ success: false, message: 'text required' }); if (!text) return res.status(400).json({ success: false, message: 'text required' });
if (!reference_id) return res.status(400).json({ success: false, message: 'reference_id required' }); if (!reference_id) return res.status(400).json({ success: false, message: 'reference_id required' });
if (!model) return res.status(400).json({ success: false, message: 'model required' });
const prefixWavPath = findWavByBaseName(prefixName); const prefixWavPath = findWavByBaseName(prefixName);
if (!prefixWavPath) return res.status(404).json({ success: false, message: `Prefix wav not found: ${prefixName}.wav` }); if (!prefixWavPath) return res.status(404).json({ success: false, message: `Prefix wav not found: ${prefixName}.wav` });
let ttsTempPath = null; let ttsTempPath = null;
try { try {
const tts = await generateTtsWavToTemp(text, reference_id); const tts = await generateTtsWavToTemp(text, reference_id, model);
ttsTempPath = tts.tempPath; ttsTempPath = tts.tempPath;
const built = buildTempBroadcastFromWav(prefixWavPath, ttsTempPath); const built = buildTempBroadcastFromWav(prefixWavPath, ttsTempPath);
try { fs.unlinkSync(ttsTempPath); } catch {} try { fs.unlinkSync(ttsTempPath); } catch {}