mirror of
https://github.com/R0m1k3/Socialflow.git
synced 2026-10-23 06:58:12 +02:00
feat(ffmpeg): Gemini TTS as primary engine, Edge TTS as fallback
Default tts_engine changed from "edge" to "gemini". Both /process-reel and /preview-tts now try Gemini first, fall back to Edge TTS on failure. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
1 parent
07fd43a5ed
commit
c008b41eb7
1 file changed
+43
-20
+43
-20
@@ -159,7 +159,7 @@ class ReelRequest(BaseModel):
|
|||||||
music_volume: float = 0.25
|
music_volume: float = 0.25
|
||||||
tts_enabled: bool = False
|
tts_enabled: bool = False
|
||||||
tts_voice: str = "fr-FR-VivienneMultilingualNeural"
|
tts_voice: str = "fr-FR-VivienneMultilingualNeural"
|
||||||
tts_engine: str = "edge" # "edge" or "gemini"
|
tts_engine: str = "gemini" # "gemini" or "edge"
|
||||||
gemini_api_key: Optional[str] = None # Google Cloud API key for Gemini TTS
|
gemini_api_key: Optional[str] = None # Google Cloud API key for Gemini TTS
|
||||||
draw_text: bool = True
|
draw_text: bool = True
|
||||||
stabilize: bool = False # Stabilisation vidéo via vidstab
|
stabilize: bool = False # Stabilisation vidéo via vidstab
|
||||||
@@ -924,18 +924,30 @@ async def process_reel(request: ReelRequest, x_api_key: str = Header(None)):
|
|||||||
|
|
||||||
if tts_clean_text:
|
if tts_clean_text:
|
||||||
print(f"🔊 Generating TTS audio to: {tts_audio_path}")
|
print(f"🔊 Generating TTS audio to: {tts_audio_path}")
|
||||||
engine = request.tts_engine or "edge"
|
engine = request.tts_engine or "gemini"
|
||||||
|
|
||||||
|
# Primary: Gemini TTS. Fallback: Edge TTS
|
||||||
if engine == "gemini" and request.gemini_api_key:
|
if engine == "gemini" and request.gemini_api_key:
|
||||||
await generate_tts_gemini(
|
try:
|
||||||
tts_clean_text,
|
await generate_tts_gemini(
|
||||||
voice,
|
tts_clean_text,
|
||||||
request.gemini_api_key,
|
voice,
|
||||||
tts_audio_path,
|
request.gemini_api_key,
|
||||||
tts_ass_path,
|
tts_audio_path,
|
||||||
display_text=clean_text_for_display(request.text),
|
tts_ass_path,
|
||||||
delay=2.0,
|
display_text=clean_text_for_display(request.text),
|
||||||
)
|
delay=2.0,
|
||||||
|
)
|
||||||
|
except Exception as gemini_err:
|
||||||
|
print(f"⚠️ Gemini TTS failed ({gemini_err}), falling back to Edge TTS")
|
||||||
|
await generate_tts_with_subs(
|
||||||
|
tts_clean_text,
|
||||||
|
voice,
|
||||||
|
tts_audio_path,
|
||||||
|
tts_ass_path,
|
||||||
|
display_text=clean_text_for_display(request.text),
|
||||||
|
delay=2.0,
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await generate_tts_with_subs(
|
await generate_tts_with_subs(
|
||||||
tts_clean_text,
|
tts_clean_text,
|
||||||
@@ -1323,17 +1335,28 @@ async def preview_tts(request: ReelRequest, x_api_key: str = Header(None)):
|
|||||||
# Note: Gemini voices (fr-FR-Standard-A etc.) are valid Edge voices too,
|
# Note: Gemini voices (fr-FR-Standard-A etc.) are valid Edge voices too,
|
||||||
# so we don't check for "Neural" - let edge_tts handle voice resolution
|
# so we don't check for "Neural" - let edge_tts handle voice resolution
|
||||||
|
|
||||||
engine = request.tts_engine or "edge"
|
engine = request.tts_engine or "gemini"
|
||||||
|
|
||||||
|
# Primary: Gemini TTS. Fallback: Edge TTS
|
||||||
if engine == "gemini" and request.gemini_api_key:
|
if engine == "gemini" and request.gemini_api_key:
|
||||||
await generate_tts_gemini(
|
try:
|
||||||
clean_text,
|
await generate_tts_gemini(
|
||||||
voice,
|
clean_text,
|
||||||
request.gemini_api_key,
|
voice,
|
||||||
tts_audio_path,
|
request.gemini_api_key,
|
||||||
tts_srt_path,
|
tts_audio_path,
|
||||||
display_text=clean_text_for_display(request.text),
|
tts_srt_path,
|
||||||
)
|
display_text=clean_text_for_display(request.text),
|
||||||
|
)
|
||||||
|
except Exception as gemini_err:
|
||||||
|
print(f"⚠️ Gemini TTS failed ({gemini_err}), falling back to Edge TTS")
|
||||||
|
await generate_tts_with_subs(
|
||||||
|
clean_text,
|
||||||
|
voice,
|
||||||
|
tts_audio_path,
|
||||||
|
tts_srt_path,
|
||||||
|
display_text=clean_text_for_display(request.text),
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
await generate_tts_with_subs(
|
await generate_tts_with_subs(
|
||||||
clean_text,
|
clean_text,
|
||||||
|
|||||||
Reference in new issue
Block a user