bafifi4972 commited on
Commit
72a07cd
·
verified ·
1 Parent(s): 9c3aa3c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +50 -40
app.py CHANGED
@@ -1,69 +1,79 @@
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)
 
1
  import os
2
  import io
3
+ import traceback
4
+ import numpy as np
5
  import soundfile as sf
6
+ from fastapi import FastAPI, HTTPException
7
+ from fastapi.responses import Response
8
+ from pydantic import BaseModel
9
  from supertonic import TTS
10
+ import uvicorn
11
 
12
+ app = FastAPI(title="Supertonic TTS API")
13
 
14
+ # Модели для валидации запросов
15
+ class TTSRequest(BaseModel):
16
+ text: str
17
+ lang: str = "ru"
18
+ voice: str = "M2"
19
+
20
+ # Глобальная загрузка модели
21
  print("Загрузка модели Supertonic TTS...")
22
  tts = TTS(auto_download=True)
 
23
  default_style = tts.get_voice_style(voice_name="M2")
24
  print("Модель успешно загружена и готова к работе!")
25
 
26
+ @app.get("/")
27
+ async def root():
28
+ return {
29
  "status": "ok",
30
  "message": "Supertonic TTS API is running",
31
+ "docs": "/docs",
32
+ "usage": "POST /api/tts с JSON: {'text': 'ваш текст', 'lang': 'ru', 'voice': 'M2'}"
33
+ }
 
 
 
 
 
 
 
 
 
 
 
34
 
35
+ @app.post("/api/tts")
36
+ async def synthesize(request: TTSRequest):
37
  try:
38
  # Получаем стиль голоса
39
+ if request.voice == "M2":
40
  style = default_style
41
  else:
42
+ style = tts.get_voice_style(voice_name=request.voice)
43
 
44
  # Синтез
45
+ wav, duration = tts.synthesize(request.text, voice_style=style, lang=request.lang)
46
 
47
+ # Конвертация тензоров в numpy если нужно
48
+ if hasattr(wav, 'cpu'):
49
+ wav = wav.cpu().numpy()
50
+ elif hasattr(wav, 'numpy'):
51
+ wav = wav.numpy()
52
+
53
+ wav = np.asarray(wav, dtype=np.float32)
54
+
55
+ # Получаем sample rate
56
+ sample_rate = getattr(tts, 'sample_rate', 24000)
57
+
58
+ # Записываем в память
59
  out = io.BytesIO()
60
+ sf.write(out, wav, samplerate=sample_rate, format='WAV', subtype='PCM_16')
61
+ audio_bytes = out.getvalue()
 
 
 
 
62
 
63
+ # Возвращаем аудио
64
+ return Response(
65
+ content=audio_bytes,
66
+ media_type='audio/wav',
67
+ headers={
68
+ "Content-Disposition": f"attachment; filename=speech.wav",
69
+ "X-Audio-Duration": str(round(duration, 2))
70
+ }
71
  )
72
 
73
  except Exception as e:
74
+ traceback.print_exc()
75
+ raise HTTPException(status_code=500, detail=f"Ошибка генерации: {str(e)}")
76
 
77
  if __name__ == '__main__':
 
78
  port = int(os.environ.get('PORT', 7860))
79
+ uvicorn.run(app, host='0.0.0.0', port=port)