File size: 2,455 Bytes
f3f2da6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# app.py
import os
import shutil
from flask import Flask, request, jsonify, send_file
from gradio_client import Client, file as gradio_file

app = Flask(__name__)

VOICES_DIR = "voices"
if not os.path.exists(VOICES_DIR):
    os.makedirs(VOICES_DIR)

SPACE_URL = "https://indexteam-indextts-2-demo.hf.space/"
gradio_client = None

try:
    print("正在连接到 Gradio 服务...")
    gradio_client = Client(SPACE_URL)
    print("Gradio 客户端已准备就绪。")
except Exception as e:
    print(f"错误:无法连接到 Gradio 服务: {e}")

def process_tts_request(text: str, voice_reference_path: str) -> str:
    params = [
        'Same as the voice reference', gradio_file(voice_reference_path), text,
        None, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        "", False, 120, True, 0.8, 30, 0.8, 0.0, 3, 10.0, 1500
    ]
    result = gradio_client.predict(*params, api_name="/gen_single")
    if isinstance(result, dict) and 'value' in result:
        temp_audio_path = result.get('value')
        if temp_audio_path and os.path.exists(temp_audio_path):
            return temp_audio_path
    raise ValueError(f"从 Gradio API 返回了预料之外的格式: {result}")

@app.route('/v1/audio/speech', methods=['POST'])
def openai_style_tts_endpoint():
    if gradio_client is None:
        return jsonify({"error": "服务未就绪"}), 503
    try:
        data = request.get_json()
        input_text, voice_filename = data['input'], data['voice']
    except Exception:
        return jsonify({"error": "无效请求格式"}), 400

    voice_path = os.path.join(VOICES_DIR, voice_filename)
    if not os.path.exists(voice_path):
        return jsonify({"error": f"Voice '{voice_filename}' 不存在。"}), 404

    temp_file = None
    try:
        print(f"收到请求: input='{input_text[:30]}...', voice='{voice_filename}'")
        temp_file = process_tts_request(input_text, voice_path)
        return send_file(temp_file, mimetype="audio/wav", as_attachment=True, download_name="speech.wav")
    except Exception as e:
        print(f"处理请求时出错: {e}")
        return jsonify({"error": {"message": "内部服务器错误", "details": str(e)}}), 500
    finally:
        if temp_file and os.path.exists(temp_file):
            os.remove(temp_file)

# 这段代码是为了在本地测试,部署到Hugging Face时 Gunicorn 会直接调用 app 对象
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)