Spaces:
Building
Building
Update admin_routes.py
Browse files- admin_routes.py +62 -34
admin_routes.py
CHANGED
@@ -795,47 +795,75 @@ async def generate_tts(
|
|
795 |
username: str = Depends(verify_token)
|
796 |
):
|
797 |
"""Generate TTS audio from text"""
|
798 |
-
|
799 |
-
|
800 |
-
|
801 |
-
tts_engine = getattr(cfg.global_config, 'tts_engine', 'no_tts')
|
802 |
-
if tts_engine == 'no_tts':
|
803 |
-
# Return empty response for no TTS
|
804 |
-
return {
|
805 |
-
"audio_url": None,
|
806 |
-
"audio_base64": None,
|
807 |
-
"message": "TTS is disabled"
|
808 |
-
}
|
809 |
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
819 |
|
820 |
@router.get("/tts/voices")
|
821 |
async def get_tts_voices(username: str = Depends(verify_token)):
|
822 |
"""Get available TTS voices"""
|
823 |
-
|
824 |
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
833 |
-
|
834 |
-
|
835 |
-
{"id":
|
836 |
-
|
837 |
]
|
838 |
-
|
|
|
|
|
|
|
|
|
|
|
839 |
|
840 |
# ===================== Helper Functions =====================
|
841 |
async def notify_llm_startup(project, version):
|
|
|
795 |
username: str = Depends(verify_token)
|
796 |
):
|
797 |
"""Generate TTS audio from text"""
|
798 |
+
from tts_factory import TTSFactory
|
799 |
+
from tts_preprocessor import TTSPreprocessor
|
800 |
+
import base64
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
801 |
|
802 |
+
try:
|
803 |
+
# Create TTS provider
|
804 |
+
tts_provider = TTSFactory.create_provider()
|
805 |
+
|
806 |
+
if not tts_provider:
|
807 |
+
# Return empty response for no TTS
|
808 |
+
return Response(
|
809 |
+
content=b"",
|
810 |
+
media_type="audio/mpeg",
|
811 |
+
headers={"X-TTS-Status": "disabled"}
|
812 |
+
)
|
813 |
+
|
814 |
+
log(f"🎤 TTS request: '{request.text[:50]}...' with provider: {tts_provider.get_provider_name()}")
|
815 |
+
|
816 |
+
# Preprocess text if needed
|
817 |
+
preprocessor = TTSPreprocessor(language=request.language)
|
818 |
+
processed_text = preprocessor.process(
|
819 |
+
request.text,
|
820 |
+
tts_provider.get_preprocessing_flags()
|
821 |
+
)
|
822 |
+
|
823 |
+
# Generate audio
|
824 |
+
audio_data = await tts_provider.synthesize(
|
825 |
+
text=processed_text,
|
826 |
+
voice_id=request.voice_id
|
827 |
+
)
|
828 |
+
|
829 |
+
# Return audio as binary response
|
830 |
+
return Response(
|
831 |
+
content=audio_data,
|
832 |
+
media_type="audio/mpeg",
|
833 |
+
headers={
|
834 |
+
"Content-Disposition": 'inline; filename="tts_output.mp3"',
|
835 |
+
"X-TTS-Provider": tts_provider.get_provider_name()
|
836 |
+
}
|
837 |
+
)
|
838 |
+
|
839 |
+
except Exception as e:
|
840 |
+
log(f"❌ TTS generation error: {e}")
|
841 |
+
raise HTTPException(status_code=500, detail=str(e))
|
842 |
|
843 |
@router.get("/tts/voices")
|
844 |
async def get_tts_voices(username: str = Depends(verify_token)):
|
845 |
"""Get available TTS voices"""
|
846 |
+
from tts_factory import TTSFactory
|
847 |
|
848 |
+
try:
|
849 |
+
tts_provider = TTSFactory.create_provider()
|
850 |
+
|
851 |
+
if not tts_provider:
|
852 |
+
return {"voices": []}
|
853 |
+
|
854 |
+
voices = tts_provider.get_supported_voices()
|
855 |
+
|
856 |
+
# Convert dict to list format
|
857 |
+
voice_list = [
|
858 |
+
{"id": voice_id, "name": voice_name}
|
859 |
+
for voice_id, voice_name in voices.items()
|
860 |
]
|
861 |
+
|
862 |
+
return {"voices": voice_list}
|
863 |
+
|
864 |
+
except Exception as e:
|
865 |
+
log(f"❌ Error getting TTS voices: {e}")
|
866 |
+
return {"voices": []}
|
867 |
|
868 |
# ===================== Helper Functions =====================
|
869 |
async def notify_llm_startup(project, version):
|