fix(tts): surface TTS errors from Python to Node.js logs and DB

- Python: capture tts_error_msg on exception, return in response
- Python: log tts_provider, minimax_api_key presence before call
- ffmpeg.ts: read tts_error from response, log and return it
- reels.ts: store TTS error in post.generationError for visibility
This commit is contained in:
Michael committed 2026-05-18 13:26:13 +02:00
1 parent 211b7dc272
commit cf20b0a264
3 files changed
+24 -9

No files matched your search

+10 -5
View File
@@ -872,13 +872,15 @@ async def process_reel(request: ReelRequest, x_api_key: str = Header(None)):
# 3. Generate TTS (if enabled) # 3. Generate TTS (if enabled)
has_tts = False has_tts = False
tts_clean_text = "" tts_clean_text = ""
tts_error_msg = None
if request.tts_enabled and request.text: if request.tts_enabled and request.text:
try: try:
# Clean text for TTS (remove hashtags/emojis) # Clean text for TTS (remove hashtags/emojis)
tts_clean_text = clean_text_for_tts(request.text) tts_clean_text = clean_text_for_tts(request.text)
print(f"🔊 TTS enabled. Original: '{request.text}'") print(f"🔊 TTS enabled. Provider: {request.tts_provider}, Voice: {request.tts_voice}")
print(f"🔊 TTS cleaned: '{tts_clean_text}'") print(f"🔊 TTS has minimax_api_key: {bool(request.minimax_api_key)}")
print(f"🔊 TTS cleaned: '{tts_clean_text[:80]}...'")
# Check for male/female voice map (edge_tts only) # Check for male/female voice map (edge_tts only)
voice = request.tts_voice voice = request.tts_voice
@@ -913,12 +915,14 @@ async def process_reel(request: ReelRequest, x_api_key: str = Header(None)):
) )
has_tts = True has_tts = True
else: else:
print("❌ TTS audio file missing or empty!") tts_error_msg = "TTS audio file missing or empty after generation"
print(f"❌ {tts_error_msg}")
else: else:
print("⚠️ TTS text is empty after cleaning, skipping.") tts_error_msg = "TTS text empty after cleaning (hashtags/emojis removed)"
print(f"⚠️ {tts_error_msg}")
except Exception as e: except Exception as e:
import traceback import traceback
tts_error_msg = str(e)
print(f"❌ Failed to generate TTS: {e}") print(f"❌ Failed to generate TTS: {e}")
traceback.print_exc() traceback.print_exc()
@@ -1247,6 +1251,7 @@ async def process_reel(request: ReelRequest, x_api_key: str = Header(None)):
"output_base64": out_b64, "output_base64": out_b64,
"duration": duration, "duration": duration,
"processing_stats": stats, "processing_stats": stats,
"tts_error": tts_error_msg,
} }
except Exception as e: except Exception as e:
+5
View File
@@ -640,6 +640,11 @@ async function processReelBackground(
console.log(`⏱️ [Background] FFmpeg took ${(Date.now() - startTime) / 1000}s`); console.log(`⏱️ [Background] FFmpeg took ${(Date.now() - startTime) / 1000}s`);
if (ffmpegResult.ttsError) {
console.error(`❌ [Background] TTS FAILED: ${ffmpegResult.ttsError}`);
await storage.updatePost(postId, { generationError: `TTS échoué: ${ffmpegResult.ttsError}` });
}
if (!ffmpegResult.success || !ffmpegResult.videoBase64) { if (!ffmpegResult.success || !ffmpegResult.videoBase64) {
throw new Error(ffmpegResult.error || 'Erreur de traitement vidéo FFmpeg'); throw new Error(ffmpegResult.error || 'Erreur de traitement vidéo FFmpeg');
} }
+9 -4
View File
@@ -27,9 +27,10 @@ interface FFmpegReelRequest {
interface FFmpegReelResponse { interface FFmpegReelResponse {
success: boolean; success: boolean;
output_base64?: string; // Vidéo traitée en base64 output_base64?: string;
duration?: number; // Durée de la vidéo en secondes duration?: number;
detail?: string; // Message d'erreur si échec detail?: string;
tts_error?: string;
} }
interface FFmpegConfig { interface FFmpegConfig {
@@ -189,7 +190,7 @@ export class FFmpegService {
storeName?: string; storeName?: string;
enableEndingEffect?: boolean; enableEndingEffect?: boolean;
} = {} } = {}
): Promise<{ success: boolean; videoBase64?: string; duration?: number; error?: string }> { ): Promise<{ success: boolean; videoBase64?: string; duration?: number; error?: string; ttsError?: string }> {
const config = this.ensureConfigured(); const config = this.ensureConfigured();
const requestBody: FFmpegReelRequest = { const requestBody: FFmpegReelRequest = {
@@ -262,11 +263,15 @@ export class FFmpegService {
}; };
} }
if (data.tts_error) {
console.error('❌ TTS failed in Python service:', data.tts_error);
}
console.log('✅ Reel video processed successfully from URL'); console.log('✅ Reel video processed successfully from URL');
return { return {
success: true, success: true,
videoBase64: data.output_base64, videoBase64: data.output_base64,
duration: data.duration, duration: data.duration,
ttsError: data.tts_error,
}; };
} catch (error) { } catch (error) {