File size: 2,854 Bytes
a13cae7
7517ea5
a13cae7
cc3b298
9b290a2
717a0dc
 
 
 
 
8f41d61
a13cae7
cc3b298
 
 
 
 
 
a13cae7
9b290a2
 
 
 
 
cc3b298
 
9b290a2
 
 
a13cae7
7517ea5
cc3b298
a13cae7
cc3b298
a13cae7
cc3b298
 
a13cae7
9b290a2
 
 
 
8f41d61
717a0dc
 
 
 
 
a13cae7
 
 
717a0dc
cc3b298
8f41d61
a13cae7
 
 
 
 
 
 
 
 
 
cb7453d
cc3b298
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import re
import gradio as gr
from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api._errors import TranscriptsDisabled
import traceback
import asyncio
from concurrent.futures import ThreadPoolExecutor

# Criar um executor para executar funções síncronas de forma assíncrona
executor = ThreadPoolExecutor(max_workers=4)

def extract_video_id(youtube_url):
    # Regex para extrair o ID do vídeo da URL do YouTube
    match = re.search(r'(?:youtu\.be\/|(?:www\.)?youtube\.com\/(?:watch\?v=|embed\/|v\/|.+\?v=))([^&]{11})', youtube_url)
    video_id = match.group(1) if match else None
    print(f"URL recebida: {youtube_url}")
    print(f"ID do vídeo extraído: {video_id}")
    return video_id

def get_available_transcripts(video_id):
    try:
        transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
        available_languages = [t.language_code for t in transcript_list]
        return f"Transcrições disponíveis: {available_languages}"
    except TranscriptsDisabled:
        return "Não há transcrições disponíveis para este vídeo."
    except Exception as e:
        return f"Erro ao listar transcrições: {str(e)}"

def get_transcript(video_id, language="en"):
    try:
        print(f"Tentando obter transcrição para o vídeo ID: {video_id} no idioma: {language}")
        transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=[language])
        print("Transcrição obtida com sucesso.")
        return "\n".join([f"{t['start']}: {t['text']}" for t in transcript])
    except TranscriptsDisabled:
        return "Erro: As legendas estão desabilitadas para este vídeo."
    except Exception as e:
        available_transcripts = get_available_transcripts(video_id)
        error_message = f"Erro ao obter transcrição: {str(e)}\n{available_transcripts}\n"
        error_message += traceback.format_exc()
        return error_message

async def async_get_transcript(video_id, language="en"):
    loop = asyncio.get_event_loop()
    return await loop.run_in_executor(executor, get_transcript, video_id, language)

async def gradio_interface(youtube_url, language):
    video_id = extract_video_id(youtube_url)
    if not video_id:
        return "Erro: URL inválida. Por favor, insira um link válido do YouTube."
    transcript = await async_get_transcript(video_id, language)
    return transcript

iface = gr.Interface(
    fn=gradio_interface,
    inputs=[
        gr.Textbox(label="URL do Vídeo (YouTube)", placeholder="Ex: https://www.youtube.com/watch?v=tl1jHm0qC_4"),
        gr.Dropdown(label="Idioma", choices=["en", "pt", "es", "fr"], value="en")
    ],
    outputs="text",
    title="Obter Transcrição de Vídeos do YouTube",
    description="Insira a URL de um vídeo do YouTube e selecione o idioma da transcrição."
)

iface.launch(share=True)