File size: 2,747 Bytes
9c3aa3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)