Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 26 additions & 24 deletions server.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class OpenAISpeechRequest(BaseModel):

# --- Global Variables & Application Setup ---
startup_complete_event = threading.Event() # For coordinating browser opening
request_lock = threading.Lock()


def _delayed_browser_open(host: str, port: int):
Expand Down Expand Up @@ -1392,7 +1393,7 @@ async def openai_voices_endpoint(model: str = ""):
)

@app.post("/v1/audio/speech", tags=["OpenAI Compatible"])
async def openai_speech_endpoint(request: OpenAISpeechRequest):
def openai_speech_endpoint(request: OpenAISpeechRequest):
# Determine the audio prompt path based on the voice parameter
predefined_voices_path = get_predefined_voices_path(ensure_absolute=True)
reference_audio_path = get_reference_audio_path(ensure_absolute=True)
Expand Down Expand Up @@ -1438,33 +1439,34 @@ async def openai_speech_endpoint(request: OpenAISpeechRequest):
all_audio_segments_np: List[np.ndarray] = []
engine_sr: Optional[int] = None

for i, chunk_text in enumerate(text_chunks):
chunk_seed = seed_to_use + i if seed_to_use is not None and seed_to_use >= 0 else seed_to_use

audio_tensor, sr = engine.synthesize(
text=chunk_text,
audio_prompt_path=str(audio_prompt_path),
temperature=get_gen_default_temperature(),
exaggeration=get_gen_default_exaggeration(),
cfg_weight=get_gen_default_cfg_weight(),
seed=chunk_seed,
language=request.language or get_gen_default_language(),
)

if audio_tensor is None or sr is None:
raise HTTPException(
status_code=500,
detail=f"TTS engine failed to synthesize audio for chunk {i+1}.",
with request_lock:
for i, chunk_text in enumerate(text_chunks):
chunk_seed = seed_to_use + i if seed_to_use is not None and seed_to_use >= 0 else seed_to_use

audio_tensor, sr = engine.synthesize(
text=chunk_text,
audio_prompt_path=str(audio_prompt_path),
temperature=get_gen_default_temperature(),
exaggeration=get_gen_default_exaggeration(),
cfg_weight=get_gen_default_cfg_weight(),
seed=chunk_seed,
language=request.language or get_gen_default_language(),
)

if engine_sr is None:
engine_sr = sr
if audio_tensor is None or sr is None:
raise HTTPException(
status_code=500,
detail=f"TTS engine failed to synthesize audio for chunk {i+1}.",
)

if engine_sr is None:
engine_sr = sr

if request.speed != 1.0:
audio_tensor, _ = utils.apply_speed_factor(audio_tensor, sr, request.speed)
if request.speed != 1.0:
audio_tensor, _ = utils.apply_speed_factor(audio_tensor, sr, request.speed)

chunk_np = audio_tensor.cpu().numpy().squeeze().astype(np.float32)
all_audio_segments_np.append(chunk_np)
chunk_np = audio_tensor.cpu().numpy().squeeze().astype(np.float32)
all_audio_segments_np.append(chunk_np)

# Stitch chunks together with crossfading
if len(all_audio_segments_np) == 1:
Expand Down