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) # برای اشتراک‌گذاری موقت در یک لینک عمومی (برای هوش مصنوعی)