Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -61,46 +61,42 @@ class TTSRequest(BaseModel):
|
|
| 61 |
gender: str
|
| 62 |
|
| 63 |
@app.post("/tts")
|
| 64 |
-
|
| 65 |
try:
|
| 66 |
lang_code = request.language.lower()
|
| 67 |
-
gender_req = request.gender.lower()
|
| 68 |
-
|
| 69 |
-
# 1. Get the language entry
|
| 70 |
lang_entry = VOICE_MAP.get(lang_code)
|
|
|
|
| 71 |
if not lang_entry:
|
| 72 |
raise HTTPException(status_code=400, detail=f"Language '{lang_code}' not supported.")
|
| 73 |
|
| 74 |
-
#
|
| 75 |
if lang_entry["gendered"]:
|
| 76 |
-
|
| 77 |
-
model_name = lang_entry.get(gender_req)
|
| 78 |
-
if not model_name:
|
| 79 |
-
# Fallback to male if requested gender isn't found in a gendered set
|
| 80 |
-
model_name = lang_entry["male"]
|
| 81 |
else:
|
| 82 |
-
# If not gendered, use the default key
|
| 83 |
model_name = lang_entry["default"]
|
| 84 |
|
| 85 |
-
# 3. Load and Synthesize
|
| 86 |
voice = get_voice(model_name)
|
|
|
|
|
|
|
| 87 |
wav_buffer = io.BytesIO()
|
|
|
|
| 88 |
with wave.open(wav_buffer, "wb") as wav_file:
|
| 89 |
-
# Piper
|
| 90 |
-
wav_file.setnchannels(1) # Mono
|
| 91 |
wav_file.setsampwidth(2) # 16-bit
|
| 92 |
wav_file.setframerate(voice.config.sample_rate)
|
| 93 |
|
| 94 |
-
#
|
| 95 |
-
for
|
| 96 |
-
wav_file.writeframes(
|
|
|
|
| 97 |
wav_buffer.seek(0)
|
| 98 |
-
|
| 99 |
return Response(content=wav_buffer.getvalue(), media_type="audio/wav")
|
| 100 |
|
| 101 |
except Exception as e:
|
|
|
|
|
|
|
| 102 |
raise HTTPException(status_code=500, detail=str(e))
|
| 103 |
-
|
| 104 |
@app.get("/health")
|
| 105 |
def home():
|
| 106 |
return {"status": "Piper TTS is running"}
|
|
|
|
| 61 |
gender: str
|
| 62 |
|
| 63 |
@app.post("/tts")
|
| 64 |
+
def tts_post(request: TTSRequest): # Removed 'async' to prevent event loop blocking
|
| 65 |
try:
|
| 66 |
lang_code = request.language.lower()
|
|
|
|
|
|
|
|
|
|
| 67 |
lang_entry = VOICE_MAP.get(lang_code)
|
| 68 |
+
|
| 69 |
if not lang_entry:
|
| 70 |
raise HTTPException(status_code=400, detail=f"Language '{lang_code}' not supported.")
|
| 71 |
|
| 72 |
+
# Determine model name
|
| 73 |
if lang_entry["gendered"]:
|
| 74 |
+
model_name = lang_entry.get(request.gender.lower(), lang_entry["male"])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
else:
|
|
|
|
| 76 |
model_name = lang_entry["default"]
|
| 77 |
|
|
|
|
| 78 |
voice = get_voice(model_name)
|
| 79 |
+
|
| 80 |
+
# Create an in-memory buffer for the WAV file
|
| 81 |
wav_buffer = io.BytesIO()
|
| 82 |
+
|
| 83 |
with wave.open(wav_buffer, "wb") as wav_file:
|
| 84 |
+
wav_file.setnchannels(1) # Piper is mono
|
|
|
|
| 85 |
wav_file.setsampwidth(2) # 16-bit
|
| 86 |
wav_file.setframerate(voice.config.sample_rate)
|
| 87 |
|
| 88 |
+
# THE FIX: Access chunk.audio to get the bytes
|
| 89 |
+
for chunk in voice.synthesize(request.text):
|
| 90 |
+
wav_file.writeframes(chunk.audio)
|
| 91 |
+
|
| 92 |
wav_buffer.seek(0)
|
|
|
|
| 93 |
return Response(content=wav_buffer.getvalue(), media_type="audio/wav")
|
| 94 |
|
| 95 |
except Exception as e:
|
| 96 |
+
# This will now catch and print the specific error to your logs
|
| 97 |
+
print(f"Error during TTS: {e}")
|
| 98 |
raise HTTPException(status_code=500, detail=str(e))
|
| 99 |
+
|
| 100 |
@app.get("/health")
|
| 101 |
def home():
|
| 102 |
return {"status": "Piper TTS is running"}
|