from transformers import pipeline from openai import OpenAI import gradio as gr import pandas as pd import os import spaces import soundfile as sf import numpy as np import librosa # تنظیم کلید API از متغیر محیطی client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # بارگذاری مدل Whisper whisper = pipeline("automatic-speech-recognition", model="openai/whisper-large-v3-turbo", device="cuda") @spaces.GPU def speech_to_text(audio_file): if audio_file is None: return "خطا: فایل صوتی دریافت نشد. لطفاً یک فایل صوتی آپلود کنید." try: # خواندن فایل صوتی audio_data, sample_rate = sf.read(audio_file) # اطمینان از نرخ نمونه‌برداری 16kHz (استاندارد برای Whisper) if sample_rate != 16000: audio_data = librosa.resample(audio_data, orig_sr=sample_rate, target_sr=16000) # پردازش با Whisper با پشتیبانی از فایل‌های طولانی result = whisper(audio_data, return_timestamps=True) return result["text"] except Exception as e: return f"خطا در پردازش فایل صوتی: {str(e)}" def summarize_text(text): if not text or text.startswith("خطا"): return "خطا: متن معتبر برای خلاصه‌سازی دریافت نشد." response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are a helpful assistant that summarizes text in Persian."}, {"role": "user", "content": f"لطفاً متن زیر را به صورت خلاصه و در قالب یک گزارش کوتاه ارائه دهید:\n{text}"} ], max_tokens=150 ) return response.choices[0].message.content def create_summary_table(summary): data = {"خلاصه گزارش": [summary]} df = pd.DataFrame(data) return df def process_audio(audio_file, progress=gr.Progress()): if audio_file is None: return "خطا: فایل صوتی دریافت نشد.", "", None progress(0, desc="در حال پردازش فایل صوتی...") text = speech_to_text(audio_file) progress(0.5, desc="در حال خلاصه‌سازی متن...") summary = summarize_text(text) progress(0.9, desc="ایجاد جدول خلاصه...") table = create_summary_table(summary) progress(1.0, desc="پردازش کامل شد") return text, summary, table with gr.Blocks() as app: gr.Markdown("## اپلیکیشن تبدیل صوت به متن و خلاصه سازی کال سنتر\n**توجه**: برای بهترین عملکرد، از فایل‌های صوتی کوتاه (کمتر از ۵ مگابایت، ۱۰-۲۰ ثانیه) با فرمت MP3، WAV یا M4A استفاده کنید. فایل‌های طولانی‌تر از ۳۰ ثانیه ممکن است زمان پردازش بیشتری نیاز داشته باشند.") audio_input = gr.Audio(type="filepath", label="فایل صوتی را آپلود کنید (MP3، WAV، M4A)") text_output = gr.Textbox(label="متن تبدیل‌شده") summary_output = gr.Textbox(label="خلاصه گزارش") table_output = gr.DataFrame(label="جدول خلاصه") submit_button = gr.Button("پردازش") submit_button.click( fn=process_audio, inputs=audio_input, outputs=[text_output, summary_output, table_output] ) app.launch()