import os import io import soundfile as sf from flask import Flask, request, jsonify, send_file from supertonic import TTS app = Flask(__name__) # 1. Загружаем модель ГЛОБАЛЬНО при старте приложения print("Загрузка модели Supertonic TTS...") tts = TTS(auto_download=True) # Предзагружаем дефолтный стиль, чтобы экономить время на запросах default_style = tts.get_voice_style(voice_name="M2") print("Модель успешно загружена и готова к работе!") @app.route('/') def index(): return jsonify({ "status": "ok", "message": "Supertonic TTS API is running", "usage": "Отправьте POST запрос на /api/tts с JSON: {'text': 'ваш текст', 'lang': 'ru', 'voice': 'M2'}" }) @app.route('/api/tts', methods=['POST']) def synthesize(): data = request.get_json() if not data or 'text' not in data: return jsonify({"error": "Нужно передать JSON с полем 'text'"}), 400 text = data.get('text') # В вашем примере текст на русском, а lang="en". Я вынес это в параметры. lang = data.get('lang', 'ru') voice_name = data.get('voice', 'M2') try: # Получаем стиль голоса if voice_name == "M2": style = default_style else: style = tts.get_voice_style(voice_name=voice_name) # Синтез wav, duration = tts.synthesize(text, voice_style=style, lang=lang) # 2. Конвертируем numpy array в WAV прямо в оперативной памяти out = io.BytesIO() # Узнаем sample_rate модели (обычно 24000 или 44100). # Если звук идет "мультяшным" голосом или слишком медленный, поменяйте 24000 на нужный. sample_rate = getattr(tts, 'sample_rate', 24000) sf.write(out, wav, samplerate=sample_rate, format='WAV') out.seek(0) # Отдаем аудиофайл как HTTP-ответ return send_file( out, mimetype='audio/wav', as_attachment=False, download_name='speech.wav' ) except Exception as e: return jsonify({"error": f"Ошибка генерации: {str(e)}"}), 500 if __name__ == '__main__': # Hugging Face автоматически передает порт через переменную окружения PORT port = int(os.environ.get('PORT', 7860)) app.run(host='0.0.0.0', port=port)