zyxciss commited on
Commit
f2bdb6d
·
verified ·
1 Parent(s): 759ca86

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -0
app.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify, Response
2
+ from kokoro import KPipeline
3
+ import soundfile as sf
4
+ import io
5
+
6
+ app = Flask(__name__)
7
+
8
+ # Initialize Kokoro TTS pipeline
9
+ pipeline = KPipeline(lang_code="a")
10
+
11
+ @app.route("/v1/audio/speech", methods=["POST"])
12
+ def generate_tts():
13
+ data = request.json
14
+
15
+ # Extract text and parameters
16
+ text = data.get("input", "")
17
+ if not text:
18
+ return jsonify({"error": "No input text provided"}), 400
19
+
20
+ voice_combo = data.get("voice", "af_heart")
21
+ voices = voice_combo.split("+") # Support multiple voices
22
+ speed = data.get("speed", 1.0)
23
+
24
+ audio_data_list = []
25
+
26
+ # Generate audio for each voice
27
+ for voice in voices:
28
+ generator = pipeline(text, voice=voice.strip(), speed=speed, split_pattern=r"\n+")
29
+ for _, _, audio in generator:
30
+ audio_data_list.append(audio)
31
+ break # Take only the first segment
32
+
33
+ if not audio_data_list:
34
+ return jsonify({"error": "Failed to generate audio"}), 500
35
+
36
+ # Combine audio segments
37
+ final_audio = b"".join(audio_data_list)
38
+
39
+ # Save audio to an in-memory buffer (for streaming)
40
+ buffer = io.BytesIO()
41
+ sf.write(buffer, final_audio, 24000, format="WAV")
42
+ buffer.seek(0)
43
+
44
+ # Streaming response
45
+ def generate():
46
+ yield buffer.read()
47
+
48
+ return Response(generate(), mimetype="audio/wav")
49
+
50
+ if __name__ == "__main__":
51
+ app.run(host="0.0.0.0", port=7860, debug=True)