from flask import Blueprint, request, jsonify import base64 import os import requests from app.services.minimax_service import synthesize_minimax from app.services.cosyvoice_service import synthesize_cosyvoice bp = Blueprint('tts', __name__, url_prefix='/api') MINIMAX_API_KEY = os.getenv('MINIMAX_API_KEY', '') MINIMAX_API_URL = 'https://api.minimax.chat/v1/t2a_v2' COSYVOICE_API_URL = os.getenv('COSYVOICE_API_URL', 'http://127.0.0.1:5001/v1/audio/synthesis') @bp.route('/synthesize', methods=['POST']) 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') # 用于CosyVoice的情绪指令 emotion = data.get('emotion', 'neutral') # 用于MiniMax的情绪参数 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 ) return jsonify({ 'success': True, 'audio': base64.b64encode(audio_data).decode('utf-8') }) except Exception as e: return jsonify({'error': str(e)}), 500