File size: 2,780 Bytes
784afc6
bccef6e
784afc6
d865f27
784afc6
8d4e3a2
 
 
d865f27
784afc6
 
d865f27
cd73846
 
784afc6
 
bccef6e
 
 
2a78fb3
bccef6e
 
 
8d4e3a2
 
 
bccef6e
8d4e3a2
784afc6
 
 
d865f27
 
 
3e8d071
 
 
 
 
 
d865f27
 
3e8d071
d865f27
 
 
2a78fb3
 
d865f27
4ab03ed
2a78fb3
d865f27
2a78fb3
 
 
 
d865f27
2a78fb3
 
d865f27
2a78fb3
d865f27
 
 
3e8d071
784afc6
cd73846
784afc6
 
8d4e3a2
784afc6
 
8d4e3a2
784afc6
5c4b08e
4ab03ed
784afc6
 
 
 
2a78fb3
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import gradio as gr
from transformers import pipeline, AutoTokenizer
import torch
from transformers.pipelines.audio_utils import ffmpeg_read

# Verificando se a GPU está disponível
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# Carregando o modelo Whisper para transcrição de áudio
transcriber = pipeline(
    task="automatic-speech-recognition",
    model="openai/whisper-medium",  # Você pode alterar para 'openai/whisper-small' para maior velocidade
    device=device,
    generate_kwargs={"language": "Portuguese", "task": "transcribe"}
)

# Carregando o tokenizer lento para o classificador
tokenizer = AutoTokenizer.from_pretrained(
    "joeddav/xlm-roberta-large-xnli",
    use_fast=False
)

# Carregando o pipeline de classificação zero-shot com o tokenizer lento
classifier = pipeline(
    "zero-shot-classification",
    model="joeddav/xlm-roberta-large-xnli",
    tokenizer=tokenizer,
    device=device
)

def transcribe_and_analyze(audio_file):
    progress = gr.Progress(track_tqdm=True)
    progress(0, desc="Iniciando transcrição...")

    # Abrindo o arquivo de áudio em modo binário
    with open(audio_file, 'rb') as f:
        bpayload = f.read()

    # Lendo os dados de áudio usando ffmpeg_read
    audio_data = ffmpeg_read(bpayload, sampling_rate=16000)

    # Transcrevendo o áudio
    transcription_result = transcriber(audio_data)
    transcription = transcription_result["text"]
    progress(50, desc="Transcrição concluída. Analisando emoções...")

    # Lista de emoções para a classificação
    emotions = ["alegria", "tristeza", "raiva", "nojo", "medo", "ansiedade", "vergonha", "tédio", "inveja"]

    # Realizando a classificação zero-shot na transcrição
    classification = classifier(transcription, emotions, multi_label=True)

    # Formatando os resultados
    results = []
    for label, score in zip(classification["labels"], classification["scores"]):
        results.append(f"{label.capitalize()}: {score:.2f}")

    # Ordenando os resultados por score decrescente
    results.sort(key=lambda x: float(x.split(": ")[1]), reverse=True)

    emotion_output = "\n".join(results)

    progress(100, desc="Processamento concluído.")

    return transcription, emotion_output

# Criando a interface Gradio com barra de progresso
interface = gr.Interface(
    fn=transcribe_and_analyze,
    inputs=gr.Audio(type="filepath", label="Faça upload do seu áudio"),
    outputs=[
        gr.Textbox(label="Transcrição do Áudio"),
        gr.Textbox(label="Emoções Detectadas")
    ],
    title="Voxsense 🗣️❣️",
    description="Envie um arquivo de áudio para transcrição e análise de emoções.",
    theme="default"
)

if __name__ == "__main__":
    interface.queue().launch()