Voice2Text_App / app.py
Turbiling's picture
Update app.py
7dc9781 verified
Raw
History Blame
4.13 kB
import os
import gradio as gr
import tempfile
import yt_dlp
from pydub import AudioSegment
from groq import Groq
from huggingface_hub import InferenceClient
# ✅ Environment Variables
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
HUGGINGFACE_API_TOKEN = os.getenv("HUGGINGFACE_API_TOKEN")
if not GROQ_API_KEY or not HUGGINGFACE_API_TOKEN:
raise EnvironmentError("Please set GROQ_API_KEY and HUGGINGFACE_API_TOKEN.")
groq_client = Groq(api_key=GROQ_API_KEY)
hf_client = InferenceClient(token=HUGGINGFACE_API_TOKEN)
# ✅ Download YouTube Audio
def download_youtube_audio(youtube_url):
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as tmp_file:
ydl_opts = {
"format": "bestaudio/best",
"outtmpl": tmp_file.name,
"quiet": True,
"postprocessors": [{
"key": "FFmpegExtractAudio",
"preferredcodec": "mp3",
"preferredquality": "192",
}],
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([youtube_url])
return tmp_file.name
# ✅ Split long audio into chunks (max 5 mins)
def split_audio(file_path, max_duration_ms=5*60*1000):
audio = AudioSegment.from_file(file_path)
chunks = []
for i in range(0, len(audio), max_duration_ms):
chunk = audio[i:i + max_duration_ms]
temp_chunk = tempfile.NamedTemporaryFile(suffix=".mp3", delete=False)
chunk.export(temp_chunk.name, format="mp3")
chunks.append(temp_chunk.name)
return chunks
# ✅ Transcribe with Groq (chunk-wise)
def transcribe_audio(audio_path):
try:
chunks = split_audio(audio_path)
transcript = ""
for i, chunk in enumerate(chunks):
with open(chunk, "rb") as f:
response = groq_client.audio.transcriptions.create(
model="whisper-large-v3",
file=f
)
transcript += response.text + "\n"
return transcript.strip()
except Exception as e:
return f"❌ Error during transcription: {e}"
# ✅ Summarize
def summarize_text(text, lang):
try:
if lang == "English":
model = "facebook/bart-large-cnn"
prompt = f"Summarize the following text in English:\n\n{text}"
else:
model = "facebook/mbart-large-50-many-to-many-mmt"
prompt = f"مندرجہ ذیل عبارت کا جامع اردو خلاصہ تحریر کریں:\n\n{text}"
output = hf_client.text_generation(
model=model,
prompt=prompt,
max_new_tokens=250,
temperature=0.7,
)
return output
except Exception as e:
return f"❌ Error during summarization: {e}"
# ✅ Main Pipeline
def process_input(youtube_url, audio_file, lang):
if youtube_url:
audio_path = download_youtube_audio(youtube_url)
elif audio_file:
audio_path = audio_file
else:
return "❌ Please upload an audio file or paste a YouTube link.", "", ""
transcript = transcribe_audio(audio_path)
if transcript.startswith("❌"):
return transcript, "", ""
summary = summarize_text(transcript, lang)
return "✅ Transcription Completed!", transcript, summary
# ✅ Gradio Interface
with gr.Blocks(title="🎧 Urdu/English Audio Summarizer") as app:
gr.Markdown("## 🎧 Urdu & English Audio Summarizer\nUpload audio or paste YouTube link below:")
with gr.Row():
youtube_link = gr.Textbox(label="📺 YouTube Link (optional)")
language_choice = gr.Dropdown(["English", "Urdu"], value="English", label="🌐 Summary Language")
audio_input = gr.Audio(type="filepath", label="🎙️ Upload Audio File (optional)")
btn = gr.Button("🚀 Transcribe & Summarize")
status = gr.Textbox(label="Status")
transcript_box = gr.Textbox(label="📝 Transcription", lines=8)
summary_box = gr.Textbox(label="🧩 Summary", lines=8)
btn.click(process_input, [youtube_link, audio_input, language_choice], [status, transcript_box, summary_box])
app.launch()