from flask import Blueprint, request, jsonify, session import base64 import os from app.services.minimax_service import synthesize_minimax from app.services.cosyvoice_service import synthesize_cosyvoice from app.routes.auth import login_required from app.db import get_db bp = Blueprint('tts', __name__, url_prefix='/api') @bp.route('/synthesize', methods=['POST']) @login_required def synthesize(): data = request.get_json() if not data or 'text' not in data: return jsonify({'error': '缺少text参数'}), 400 text = data.get('text') engine = data.get('engine', 'minimax') speed = data.get('speed', 1.0) pitch = data.get('pitch', 0) volume = data.get('volume', 1.0) instruction = data.get('instruction') emotion = data.get('emotion', 'neutral') if not text.strip(): return jsonify({'error': '文本不能为空'}), 400 if len(text) > 2000: return jsonify({'error': '文本不能超过2000字'}), 400 try: if engine == 'cosyvoice': audio_data = synthesize_cosyvoice( text=text, speed=speed, pitch=pitch, volume=volume, instruction=instruction ) else: audio_data = synthesize_minimax( text=text, speed=speed, pitch=pitch, volume=volume, emotion=emotion ) # 记录使用日志 try: conn = get_db() conn.execute( '''INSERT INTO usage_logs (user_id, username, display_name, text_content, text_length, engine, emotion) VALUES (?, ?, ?, ?, ?, ?, ?)''', (session['user_id'], session['username'], session['display_name'], text, len(text), engine, emotion) ) conn.commit() conn.close() except Exception: pass # 日志写入失败不影响正常合成 return jsonify({ 'success': True, 'audio': base64.b64encode(audio_data).decode('utf-8') }) except Exception as e: return jsonify({'error': str(e)}), 500