import pickle import random import re import requests # from IPython.display import FileLink import os import time from datetime import datetime import random import json import inspect from datetime import datetime import re import os # from deepgram import Deepgram import asyncio from litellm import completion from litellm.exceptions import RateLimitError import gradio as gr # import PyPDF2 import tempfile ############## ### import other files: with open('functions.py') as f: exec(f.read()) with open('prompts.py') as f: exec(f.read()) with open('cleys.py') as f: exec(f.read()) def make_download_file(task, transcript, evaluation): content = ( "=== Generated Task =======================================================================================\n" f"{task}\n\n\n\n" "=== Transcribed Audio =======================================================================================\n\n" f"{transcript}\n\n\n\n\n\n" "=== Evaluation =================================================================================\n" f"{evaluation}\n" ) tmp_path = tempfile.NamedTemporaryFile(delete=False, suffix=".txt").name with open(tmp_path, "w", encoding="utf-8") as f: f.write(content) return tmp_path def on_start(): task_number = f'Now create a practice task number {random.randint(1, 4)}' generated_task = generate_text( task_number, model="gemini/gemini-2.5-flash", system_prompt=task_generator_prompt, temperature=0.7 ) # Task, show audio, clear transcript/eval, hide Start, hide Reset, hide Download return ( generated_task, gr.update(visible=True), "", "", gr.update(visible=False), gr.update(visible=False), gr.update(visible=False) ) def on_audio(audio, current_task): if not audio: return "No audio received.", "", gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), None if not DEEPGRAM_API_KEY: return "Deepgram API key not found.", "", gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), None try: # --- Transcribe with Deepgram result = transcribe_with_deepgram(DEEPGRAM_API_KEY, audio) transcript = ( result.get("results", {}) .get("channels", [{}])[0] .get("alternatives", [{}])[0] .get("transcript", "") ) if not transcript: return "No transcript found.", "", gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), None # --- Build evaluation input answer_to_eval = ( f"Here is the task:\n{current_task}\n\n" f"Here is the answer:\n{transcript}\n\n" "Now evaluate this answer." ) # --- Generate evaluation evaluation = generate_text( answer_to_eval, model="gemini/gemini-2.5-pro", system_prompt=evaluator_prompt, temperature=0.3 ) # --- Normalize evaluation if isinstance(evaluation, dict): evaluation_text_val = ( evaluation.get("choices", [{}])[0] .get("message", {}) .get("content", "") ) else: evaluation_text_val = str(evaluation) # --- Create file file_path = make_download_file(current_task, transcript, evaluation_text_val) # Return transcript, evaluation, hide audio, show Reset, hide Start, show file return ( transcript, evaluation_text_val, gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(value=file_path, visible=True) ) except Exception as e: return f"Transcription error: {e}", "", gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), None def on_reset(): return ( "", # task gr.update(visible=False), # audio hidden "", # transcript "", # evaluation gr.update(visible=True), # show Start gr.update(visible=False), # hide Reset gr.update(visible=False) # hide Download ) with gr.Blocks() as demo: # Sections output_text = gr.Markdown(value="### 📘 Generated Task\n") transcript_text = gr.Textbox(label="Transcribed Audio", interactive=False) evaluation_text = gr.Markdown(value="### ✅ Evaluation\n") audio_input = gr.Audio( sources=["microphone", "upload"], type="filepath", label="Record or Upload Audio", visible=False ) start_btn = gr.Button("Start", visible=True) reset_btn = gr.Button("Reset", visible=False) download_file = gr.File( label="Download Your Results", visible=False, file_types=[".txt"] ) # Start start_btn.click( fn=on_start, inputs=[], outputs=[output_text, audio_input, transcript_text, evaluation_text, start_btn, reset_btn, download_file], ) # Audio input audio_input.change( fn=on_audio, inputs=[audio_input, output_text], outputs=[transcript_text, evaluation_text, audio_input, reset_btn, start_btn, download_file] ) # Reset reset_btn.click( fn=on_reset, inputs=[], outputs=[output_text, audio_input, transcript_text, evaluation_text, start_btn, reset_btn, download_file] ) demo.launch()