callcenter / app.py
diginoron's picture
Update app.py
4e2b9b1 verified
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()