talk-dial / app.py
suprimedev's picture
Update app.py
defad0a verified
raw
history blame
5.77 kB
import gradio as gr
from pydub import AudioSegment
import requests
import os
import uuid # برای تولید نام فایل منحصر به فرد
# مسیر ذخیره فایل‌های موقت
TEMP_DIR = "temp_audio"
if not os.path.exists(TEMP_DIR):
os.makedirs(TEMP_DIR)
def download_file(url, output_path):
"""فایل را از یک URL دانلود می‌کند."""
try:
response = requests.get(url, stream=True)
response.raise_for_status() # خطایی رخ داد، آن را بالا ببر
with open(output_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
return True
except requests.exceptions.RequestException as e:
print(f"Error downloading {url}: {e}")
return False
except Exception as e:
print(f"An unexpected error occurred during download of {url}: {e}")
return False
def get_audio_from_input(input_source):
"""
منبع ورودی را پردازش کرده و یک شی AudioSegment برمی‌گرداند.
می‌تواند یک فایل محلی یا یک URL باشد.
"""
unique_filename = os.path.join(TEMP_DIR, str(uuid.uuid4()))
if input_source.startswith("http://") or input_source.startswith("https://"):
# این یک URL است، دانلودش کن
temp_filepath = unique_filename + "_downloaded" + os.path.splitext(input_source)[1].split("?")[0]
if not download_file(input_source, temp_filepath):
return None, f"خطا در دانلود فایل از لینک: {input_source}"
audio_path = temp_filepath
else:
# فرض می‌شود یک مسیر فایل محلی است
audio_path = input_source
try:
audio = AudioSegment.from_file(audio_path)
return audio, None
except Exception as e:
return None, f"خطا در بارگذاری فایل صوتی ({audio_path}): {e}. مطمئن شوید فایل MP3 یا WAV معتبر است."
finally:
# اگر فایل از URL دانلود شده بود، آن را پاک کن
if 'temp_filepath' in locals() and os.path.exists(temp_filepath):
os.remove(temp_filepath)
def merge_audio_files(input_sources):
"""
چندین فایل صوتی را (از لینک یا فایل) ادغام می‌کند و یک فایل MP3 خروجی می‌دهد.
input_sources: یک رشته حاوی لینک‌ها یا مسیرهای فایل‌ها که با خط جدید جدا شده‌اند.
"""
if not input_sources.strip():
return None, "لطفاً حداقل یک لینک یا مسیر فایل وارد کنید."
sources = [s.strip() for s in input_sources.split('\n') if s.strip()]
if not sources:
return None, "خطا: لیست ورودی‌ها خالی است."
combined_audio = AudioSegment.empty()
errors = []
for source in sources:
audio_segment, error = get_audio_from_input(source)
if audio_segment:
combined_audio += audio_segment
else:
errors.append(error)
print(f"Skipping {source} due to error: {error}") # برای debugging کنسول
if not combined_audio.duration_seconds > 0:
return None, "هیچ فایل صوتی معتبری برای ادغام پیدا نشد. " + "\n".join(errors) if errors else ""
output_filename = os.path.join(TEMP_DIR, f"merged_audio_{uuid.uuid4()}.mp3")
try:
combined_audio.export(output_filename, format="mp3")
return output_filename, "عملیات موفقیت آمیز بود!"
except Exception as e:
return None, f"خطا در ذخیره فایل خروجی: {e}"
# ایجاد رابط کاربری Gradio
with gr.Blocks() as demo:
gr.Markdown(
"""
# ابزار ادغام فایل‌های صوتی (MP3/WAV)
در اینجا می‌توانید لینک چندین فایل صوتی (MP3 یا WAV) را وارد کنید (هر لینک در یک خط جدید).
این ابزار تمام فایل‌ها را دانلود کرده و به یک فایل MP3 واحد ادغام می‌کند.
**نکته:** برای لینک‌های دانلود، مطمئن شوید قابلیت دانلود مستقیم دارند (نه صفحات وب).
"""
)
audio_links_input = gr.Textbox(
label="لینک یا مسیر فایل‌های صوتی (هر کدام در یک خط جدید)",
placeholder="مثال:\nhttps://example.com/audio1.mp3\n./local_audio.wav\nhttps://example.com/audio2.wav",
lines=10
)
output_message = gr.Textbox(label="پیام", interactive=False)
output_audio = gr.Audio(label="فایل صوتی ادغام شده", type="filepath")
merge_button = gr.Button("ادغام فایل‌ها")
merge_button.click(
fn=merge_audio_files,
inputs=[audio_links_input],
outputs=[output_audio, output_message]
)
gr.Examples(
examples=[
["https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3\nhttps://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3"],
# اگر فایل‌های واقعی داشته باشید، می‌توانید این خط را فعال کنید:
# ["./path/to/your/local_audio.mp3\n./path/to/another/local_audio.wav"]
],
inputs=audio_links_input,
label="نمونه‌ها"
)
if __name__ == "__main__":
demo.launch() # برای اجرا در لوکال
# demo.launch(share=True) # برای اشتراک‌گذاری موقت در یک لینک عمومی (برای هوش مصنوعی)