Update app.py
Browse files
app.py
CHANGED
|
@@ -60,14 +60,35 @@ def translate_transcript(transcript):
|
|
| 60 |
response = completion.choices[0].message.content
|
| 61 |
return response
|
| 62 |
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
)
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
def run_quality_check(spanish, english):
|
| 72 |
st.write(spanish)
|
| 73 |
st.write(english)
|
|
@@ -107,11 +128,19 @@ if uploaded_file:
|
|
| 107 |
st.subheader("Translated Text")
|
| 108 |
|
| 109 |
with st.spinner("💿 Generating dub..."):
|
| 110 |
-
dubbed_audio = generate_dub(translated)
|
| 111 |
if dubbed_audio:
|
| 112 |
st.success("Dubbing process completed successfully!")
|
| 113 |
dubbed_audio.seek(0)
|
| 114 |
-
st.audio(dubbed_audio, format=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
|
| 116 |
with st.spinner("Running quality check... "):
|
| 117 |
qa_result = run_quality_check(transcript, translated)
|
|
|
|
| 60 |
response = completion.choices[0].message.content
|
| 61 |
return response
|
| 62 |
|
| 63 |
+
# Helper function for generate_dub
|
| 64 |
+
def convert_audio_response(audio, to_wav=False):
|
| 65 |
+
# Handle generator or bytes input
|
| 66 |
+
if isinstance(audio, (bytes, bytearray)):
|
| 67 |
+
audio_bytes = audio
|
| 68 |
+
elif hasattr(audio, '__iter__'):
|
| 69 |
+
audio_bytes = b''.join(audio)
|
| 70 |
+
else:
|
| 71 |
+
raise ValueError("Unsupported audio format.")
|
| 72 |
+
|
| 73 |
+
def generate_dub(translated_text, to_wav=False):
|
| 74 |
+
try:
|
| 75 |
+
audio_data = client_el.text_to_speech.convert(
|
| 76 |
+
text=translated_text,
|
| 77 |
+
voice_id="EXAVITQu4vr4xnSDxMaL",
|
| 78 |
+
model_id="eleven_multilingual_v2"
|
| 79 |
+
)
|
| 80 |
|
| 81 |
+
if 'audio' in audio_data:
|
| 82 |
+
audio_stream, mime_type = convert_audio_response(audio_data['audio'] to_wav=to_wav)
|
| 83 |
+
return audio_stream, mime_type
|
| 84 |
+
else:
|
| 85 |
+
st.error("❌ No audio data returned.")
|
| 86 |
+
return None, None
|
| 87 |
+
|
| 88 |
+
except Exception as e:
|
| 89 |
+
st.error(f"ElevenLabs API error: {e}")
|
| 90 |
+
return None, None
|
| 91 |
+
|
| 92 |
def run_quality_check(spanish, english):
|
| 93 |
st.write(spanish)
|
| 94 |
st.write(english)
|
|
|
|
| 128 |
st.subheader("Translated Text")
|
| 129 |
|
| 130 |
with st.spinner("💿 Generating dub..."):
|
| 131 |
+
dubbed_audio, mime_type = generate_dub(translated)
|
| 132 |
if dubbed_audio:
|
| 133 |
st.success("Dubbing process completed successfully!")
|
| 134 |
dubbed_audio.seek(0)
|
| 135 |
+
st.audio(dubbed_audio, format=mime_type)
|
| 136 |
+
st.download_button(
|
| 137 |
+
label="Download dub",
|
| 138 |
+
data = dubbed_audio,
|
| 139 |
+
file_name = f"dubbed_audio.{mime_type.split("/")[-1]}",
|
| 140 |
+
mime=mime_type
|
| 141 |
+
)
|
| 142 |
+
else:
|
| 143 |
+
st.warning("No audio to play or download.")
|
| 144 |
|
| 145 |
with st.spinner("Running quality check... "):
|
| 146 |
qa_result = run_quality_check(transcript, translated)
|