test / app.py
fmilletari-czi's picture
Update app.py
6aa02f1
import gradio as gr
from huggingface_hub import InferenceClient
def transcribe_audio(audio_file_path: str, oauth_token: gr.OAuthToken | None) -> str:
"""Transcribe audio using Inference Providers, billed to the user."""
if oauth_token is None:
raise gr.Error("Please sign in with Hugging Face first.")
client = InferenceClient(provider="auto", token=oauth_token.token)
transcript = client.automatic_speech_recognition(
audio=audio_file_path,
model="openai/whisper-large-v3"
)
return transcript.text
def generate_summary(transcript: str, oauth_token: gr.OAuthToken | None) -> str:
"""Generate summary using Inference Providers, billed to the user."""
if oauth_token is None:
raise gr.Error("Please sign in with Hugging Face first.")
client = InferenceClient(provider="auto", token=oauth_token.token)
prompt = f"""
Analyze this meeting transcript and provide:
1. A concise summary of key points
2. Action items with responsible parties
3. Important decisions made
Transcript: {transcript}
Format with clear sections:
## Summary
## Action Items
## Decisions Made
"""
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-R1-0528:fastest",
messages=[{"role": "user", "content": prompt}],
max_tokens=1000
)
return response.choices[0].message.content
def process_meeting_audio(audio_file, oauth_token: gr.OAuthToken | None):
"""Process uploaded audio file and return transcript + summary."""
if oauth_token is None:
raise gr.Error("Please sign in with Hugging Face first.")
if audio_file is None:
raise gr.Error("Please upload an audio file.")
transcript = transcribe_audio(audio_file, oauth_token)
summary = generate_summary(transcript, oauth_token)
return transcript, summary
with gr.Blocks() as app:
gr.Markdown("# 🎤 AI Meeting Notes")
gr.Markdown(
"Sign in with your Hugging Face account, then upload a meeting recording "
"to get an instant transcript and summary. Inference is billed to your account."
)
gr.LoginButton()
with gr.Row():
audio_input = gr.Audio(label="Upload Meeting Audio", type="filepath")
with gr.Row():
submit_btn = gr.Button("Process", variant="primary")
with gr.Row():
transcript_output = gr.Textbox(label="Transcript", lines=10)
summary_output = gr.Textbox(label="Summary & Action Items", lines=10)
submit_btn.click(
fn=process_meeting_audio,
inputs=[audio_input],
outputs=[transcript_output, summary_output],
)
if __name__ == "__main__":
app.launch()