Update app.py
Browse files
app.py
CHANGED
|
@@ -277,13 +277,13 @@ def process_entry(entry, i, video_width, video_height, add_voiceover, target_lan
|
|
| 277 |
audio_segment = None
|
| 278 |
if add_voiceover:
|
| 279 |
segment_audio_path = f"segment_{i}_voiceover.wav"
|
| 280 |
-
|
|
|
|
| 281 |
audio_clip = AudioFileClip(segment_audio_path)
|
| 282 |
# Get and log all methods in AudioFileClip
|
| 283 |
logger.info("Methods in AudioFileClip:")
|
| 284 |
for method in dir(audio_clip):
|
| 285 |
logger.info(method)
|
| 286 |
-
desired_duration = entry["end"] - entry["start"]
|
| 287 |
|
| 288 |
# Log duration of the audio clip and the desired duration for debugging.
|
| 289 |
logger.debug(f"Audio clip duration: {audio_clip.duration}, Desired duration: {desired_duration}")
|
|
@@ -362,7 +362,26 @@ def generate_voiceover(translated_json, language, output_audio_path):
|
|
| 362 |
except Exception as e:
|
| 363 |
raise ValueError(f"Error generating voiceover: {e}")
|
| 364 |
|
| 365 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 366 |
"""
|
| 367 |
Generate voiceover from translated text for a given language using OpenAI TTS API.
|
| 368 |
"""
|
|
@@ -380,12 +399,13 @@ def generate_voiceover_OpenAI(translated_json, language, output_audio_path):
|
|
| 380 |
|
| 381 |
while retry_count < max_retries:
|
| 382 |
try:
|
|
|
|
| 383 |
# Create the speech using OpenAI TTS API
|
| 384 |
response = client.audio.speech.create(
|
| 385 |
model=model,
|
| 386 |
voice=voice,
|
| 387 |
input=full_text,
|
| 388 |
-
speed=
|
| 389 |
)
|
| 390 |
# Save the audio to the specified path
|
| 391 |
with open(output_audio_path, 'wb') as f:
|
|
|
|
| 277 |
audio_segment = None
|
| 278 |
if add_voiceover:
|
| 279 |
segment_audio_path = f"segment_{i}_voiceover.wav"
|
| 280 |
+
desired_duration = entry["end"] - entry["start"]
|
| 281 |
+
generate_voiceover_OpenAI([entry], target_language, desired_duration, segment_audio_path)
|
| 282 |
audio_clip = AudioFileClip(segment_audio_path)
|
| 283 |
# Get and log all methods in AudioFileClip
|
| 284 |
logger.info("Methods in AudioFileClip:")
|
| 285 |
for method in dir(audio_clip):
|
| 286 |
logger.info(method)
|
|
|
|
| 287 |
|
| 288 |
# Log duration of the audio clip and the desired duration for debugging.
|
| 289 |
logger.debug(f"Audio clip duration: {audio_clip.duration}, Desired duration: {desired_duration}")
|
|
|
|
| 362 |
except Exception as e:
|
| 363 |
raise ValueError(f"Error generating voiceover: {e}")
|
| 364 |
|
| 365 |
+
def truncated_linear(x):
|
| 366 |
+
if x < 15:
|
| 367 |
+
return 1
|
| 368 |
+
elif x > 25:
|
| 369 |
+
return 1.2
|
| 370 |
+
else:
|
| 371 |
+
slope = (1.2 - 1) / (25 - 15)
|
| 372 |
+
return 1 + slope * (x - 15)
|
| 373 |
+
|
| 374 |
+
def calculate_speed(text, desired_duration):
|
| 375 |
+
# Calculate characters per second
|
| 376 |
+
char_count = len(text)
|
| 377 |
+
chars_per_second = char_count / (desired_duration + 0.001)
|
| 378 |
+
|
| 379 |
+
# Apply truncated linear function to get speed
|
| 380 |
+
speed = truncated_linear(chars_per_second)
|
| 381 |
+
|
| 382 |
+
return speed
|
| 383 |
+
|
| 384 |
+
def generate_voiceover_OpenAI(translated_json, language, desired_duration, output_audio_path):
|
| 385 |
"""
|
| 386 |
Generate voiceover from translated text for a given language using OpenAI TTS API.
|
| 387 |
"""
|
|
|
|
| 399 |
|
| 400 |
while retry_count < max_retries:
|
| 401 |
try:
|
| 402 |
+
speed_tts = calculate_speed(full_text, desired_duration)
|
| 403 |
# Create the speech using OpenAI TTS API
|
| 404 |
response = client.audio.speech.create(
|
| 405 |
model=model,
|
| 406 |
voice=voice,
|
| 407 |
input=full_text,
|
| 408 |
+
speed=speed_tts
|
| 409 |
)
|
| 410 |
# Save the audio to the specified path
|
| 411 |
with open(output_audio_path, 'wb') as f:
|