randusertry commited on
Commit
ae4e7e6
·
verified ·
1 Parent(s): 3387383

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -19
app.py CHANGED
@@ -61,46 +61,42 @@ class TTSRequest(BaseModel):
61
  gender: str
62
 
63
  @app.post("/tts")
64
- async def tts_post(request: TTSRequest):
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
- # 2. Determine which model file to use
75
  if lang_entry["gendered"]:
76
- # If gendered, try to get the requested gender
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 yields raw PCM; you must set these params manually
90
- wav_file.setnchannels(1) # Mono
91
  wav_file.setsampwidth(2) # 16-bit
92
  wav_file.setframerate(voice.config.sample_rate)
93
 
94
- # Synthesize returns an iterator of audio chunks
95
- for audio_bytes in voice.synthesize(request.text):
96
- wav_file.writeframes(audio_bytes)
 
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"}