| import whisper |
| import yt_dlp |
| import gradio as gr |
| import os |
|
|
| def youtube_(link): |
| if not link.strip(): |
| gr.Info("You need to provide a download link.") |
| print("You need to provide a download link") |
| return None |
| |
| try: |
| ydl_opts = { |
| 'format': 'bestaudio/best', |
| 'outtmpl': '%(title)s.%(ext)s', |
| 'nocheckcertificate': True, |
| 'ignoreerrors': True, |
| 'no_warnings': True, |
| 'quiet': True, |
| 'extractaudio': True, |
| 'postprocessors': [{ |
| 'key': 'FFmpegExtractAudio', |
| 'preferredcodec': 'wav', |
| 'preferredquality': '192', |
| }], |
| } |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: |
| result = ydl.extract_info(link, download=True) |
| download_path = ydl.prepare_filename(result, outtmpl='%(title)s.wav') |
| |
| return download_path |
| |
| except Exception as e: |
| gr.Error(f"Error downloading video: {str(e)}") |
| print(f"Error: {e}") |
| return None |
|
|
| def whisper_(input_audio): |
| try: |
| model = whisper.load_model("base") |
| |
| |
| result = model.transcribe(input_audio) |
| |
| text_result = result["text"] |
| language = result["language"] |
| |
| print(f"Detected language: {language}") |
| print(f"Transcription: {text_result}") |
| |
| return text_result |
| |
| except Exception as e: |
| gr.Error(f"Error during transcription: {str(e)}") |
| print(f"Error: {e}") |
| return None |
|
|
| def transcribe(url_audio): |
| |
| audio_path = youtube_(url_audio) |
| |
| if audio_path is None: |
| return "Failed to download audio. Please check the URL and try again." |
| |
| |
| result = whisper_(audio_path) |
| |
| |
| try: |
| if os.path.exists(audio_path): |
| os.remove(audio_path) |
| except: |
| pass |
| |
| if result is None: |
| return "Failed to transcribe audio. Please try again." |
| |
| return result |
|
|
| |
| with gr.Blocks(title="YouTube Audio Transcriber") as demo: |
| gr.Markdown(""" |
| # 🎙️ YouTube Audio Transcriber |
| Enter a YouTube URL and get the audio transcribed using Whisper AI. |
| """) |
| |
| with gr.Row(): |
| with gr.Column(scale=4): |
| url_input = gr.Textbox( |
| label="YouTube URL", |
| placeholder="https://www.youtube.com/watch?v=...", |
| lines=2 |
| ) |
| transcribe_btn = gr.Button("Transcribe", variant="primary", size="lg") |
| |
| with gr.Column(scale=5): |
| output_text = gr.Textbox( |
| label="Transcription", |
| lines=10, |
| placeholder="The transcribed text will appear here...", |
| interactive=False |
| ) |
| |
| with gr.Row(): |
| with gr.Column(): |
| gr.Markdown(""" |
| ### ⚡ Tips: |
| - Works with most YouTube videos |
| - Supports multiple languages |
| - Audio is automatically downloaded and processed |
| - Processing may take a few seconds depending on video length |
| """) |
| |
| |
| transcribe_btn.click( |
| fn=transcribe, |
| inputs=url_input, |
| outputs=output_text |
| ) |
| |
| |
| url_input.submit( |
| fn=transcribe, |
| inputs=url_input, |
| outputs=output_text |
| ) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch(share=True) |