Spaces:
Sleeping
Sleeping
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") | |
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() |