bafifi4972 commited on
Commit
9c3aa3c
·
verified ·
1 Parent(s): 22d3fa7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -0
app.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import io
3
+ import soundfile as sf
4
+ from flask import Flask, request, jsonify, send_file
5
+ from supertonic import TTS
6
+
7
+ app = Flask(__name__)
8
+
9
+ # 1. Загружаем модель ГЛОБАЛЬНО при старте приложения
10
+ print("Загрузка модели Supertonic TTS...")
11
+ tts = TTS(auto_download=True)
12
+ # Предзагружаем дефолтный стиль, чтобы экономить время на запросах
13
+ default_style = tts.get_voice_style(voice_name="M2")
14
+ print("Модель успешно загружена и готова к работе!")
15
+
16
+ @app.route('/')
17
+ def index():
18
+ return jsonify({
19
+ "status": "ok",
20
+ "message": "Supertonic TTS API is running",
21
+ "usage": "Отправьте POST запрос на /api/tts с JSON: {'text': 'ваш текст', 'lang': 'ru', 'voice': 'M2'}"
22
+ })
23
+
24
+ @app.route('/api/tts', methods=['POST'])
25
+ def synthesize():
26
+ data = request.get_json()
27
+
28
+ if not data or 'text' not in data:
29
+ return jsonify({"error": "Нужно передать JSON с полем 'text'"}), 400
30
+
31
+ text = data.get('text')
32
+ # В вашем примере текст на русском, а lang="en". Я вынес это в параметры.
33
+ lang = data.get('lang', 'ru')
34
+ voice_name = data.get('voice', 'M2')
35
+
36
+ try:
37
+ # Получаем стиль голоса
38
+ if voice_name == "M2":
39
+ style = default_style
40
+ else:
41
+ style = tts.get_voice_style(voice_name=voice_name)
42
+
43
+ # Синтез
44
+ wav, duration = tts.synthesize(text, voice_style=style, lang=lang)
45
+
46
+ # 2. Конвертируем numpy array в WAV прямо в оперативной памяти
47
+ out = io.BytesIO()
48
+ # Узнаем sample_rate модели (обычно 24000 или 44100).
49
+ # Если звук идет "мультяшным" голосом или слишком медленный, поменяйте 24000 на нужный.
50
+ sample_rate = getattr(tts, 'sample_rate', 24000)
51
+
52
+ sf.write(out, wav, samplerate=sample_rate, format='WAV')
53
+ out.seek(0)
54
+
55
+ # Отдаем аудиофайл как HTTP-ответ
56
+ return send_file(
57
+ out,
58
+ mimetype='audio/wav',
59
+ as_attachment=False,
60
+ download_name='speech.wav'
61
+ )
62
+
63
+ except Exception as e:
64
+ return jsonify({"error": f"Ошибка генерации: {str(e)}"}), 500
65
+
66
+ if __name__ == '__main__':
67
+ # Hugging Face автоматически передает порт через переменную окружения PORT
68
+ port = int(os.environ.get('PORT', 7860))
69
+ app.run(host='0.0.0.0', port=port)