feat: 添加TTS语音播放功能

Backend:
- 新增edge-tts依赖
- 新增/api/tts API生成语音
- 新增/api/tts/voices API获取语音列表
- 系统配置新增tts_provider和tts_voice字段

前端app.js:
- 新增TTS状态变量(enableTTS, ttsVoice, ttsQueue等)
- 智能体对话和普通对话header添加TTS开关按钮
- 消息操作栏添加语音播放按钮
- 实现playTTS和cleanTTS函数
- 加载后台TTS配置

前端admin.js:
- 系统设置页面添加TTS方案和语音配置
- 支持选择晓晓/云希/云扬/晓伊等中文语音

前端style.css:
- 新增.tts-btn样式
This commit is contained in:
2026-04-29 16:58:53 +08:00
parent da71f99db4
commit a7383396db
5 changed files with 253 additions and 8 deletions

View File

@@ -1264,6 +1264,25 @@ async function loadSystemPage(content) {
<input type="text" class="form-input" id="adminPassword" value="${systemConfigs.admin_password?.value || ''}" placeholder="修改管理员密码">
</div>
<h3 style="margin: 24px 0 16px; padding-top: 16px; border-top: 1px solid #e2e8f0;">TTS语音配置</h3>
<div class="form-group">
<label class="form-label">TTS方案</label>
<select class="form-select" id="ttsProvider">
<option value="edge" ${systemConfigs.tts_provider?.value === 'edge' ? 'selected' : ''}>Edge TTS (微软)</option>
</select>
</div>
<div class="form-group">
<label class="form-label">TTS语音</label>
<select class="form-select" id="ttsVoice">
<option value="zh-CN-XiaoxiaoNeural" ${systemConfigs.tts_voice?.value === 'zh-CN-XiaoxiaoNeural' ? 'selected' : ''}>晓晓 (女声)</option>
<option value="zh-CN-YunxiNeural" ${systemConfigs.tts_voice?.value === 'zh-CN-YunxiNeural' ? 'selected' : ''}>云希 (男声)</option>
<option value="zh-CN-YunyangNeural" ${systemConfigs.tts_voice?.value === 'zh-CN-YunyangNeural' ? 'selected' : ''}>云扬 (男声)</option>
<option value="zh-CN-XiaoyiNeural" ${systemConfigs.tts_voice?.value === 'zh-CN-XiaoyiNeural' ? 'selected' : ''}>晓伊 (女声)</option>
</select>
</div>
<button class="form-submit" onclick="saveSystemConfig()">保存设置</button>
</div>
@@ -1282,7 +1301,9 @@ async function saveSystemConfig() {
guest_chat_sessions: document.getElementById('guestChatSessions').value,
guest_chat_messages: document.getElementById('guestChatMessages').value,
guest_agent_messages: document.getElementById('guestAgentMessages').value,
admin_password: document.getElementById('adminPassword').value
admin_password: document.getElementById('adminPassword').value,
tts_provider: document.getElementById('ttsProvider').value,
tts_voice: document.getElementById('ttsVoice').value
};
await fetchAPI('/api/admin/system', 'POST', data);