File size: 2,532 Bytes
de44379
 
 
0a494dc
77c34b5
de44379
77c34b5
de44379
 
77c34b5
 
0a494dc
 
de44379
 
 
 
 
995fd34
de44379
 
995fd34
de44379
 
 
995fd34
 
5e37164
995fd34
 
 
de44379
 
 
77c34b5
de44379
 
77c34b5
de44379
 
 
 
 
 
77c34b5
de44379
 
 
 
77c34b5
de44379
 
 
 
 
 
77c34b5
de44379
 
77c34b5
de44379
 
77c34b5
de44379
 
3b01ecb
de44379
 
 
 
 
 
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
import gradio as gr
import torch
import numpy as np
from transformers import Wav2Vec2Processor, Wav2Vec2ForSequenceClassification
from safetensors.torch import load_file

# Carregar o modelo e o processador salvos
model_name = "results"
processor = Wav2Vec2Processor.from_pretrained(model_name)

# Carregar o modelo do arquivo safetensors
state_dict = load_file("results/model.safetensors")
model = Wav2Vec2ForSequenceClassification.from_pretrained(model_name, state_dict=state_dict)

def classify_accent(audio):
    if audio is None:
        return "Error: No se recibió audio"

    # Verificar o tipo de entrada de áudio
    print(f"Tipo de entrada de audio: {type(audio)}")

    # Verificar a estrutura do áudio
    print(f"Entrada de audio recibida: {audio}")

    try:
        # Se o áudio vier como uma tupla, vamos lidar com isso
        if isinstance(audio, tuple):
            audio_array = np.array(audio[0])  # O áudio no primeiro elemento da tupla
            sample_rate = audio[1]  # A taxa de amostragem no segundo elemento da tupla
        else:
            raise ValueError("Formato de áudio inesperado.")

        print(f"Forma del audio: {audio_array.shape}, Frecuencia de muestreo: {sample_rate}")

        # Converter o áudio para float32
        audio_array = audio_array.astype(np.float32)

        # Resample para 16kHz, se necessário
        if sample_rate != 16000:
            import librosa
            audio_array = librosa.resample(audio_array, orig_sr=sample_rate, target_sr=16000)

        input_values = processor(audio_array, return_tensors="pt", sampling_rate=16000).input_values

        # Inferência
        with torch.no_grad():
            logits = model(input_values).logits
        predicted_ids = torch.argmax(logits, dim=-1).item()

        # IDs de sotaque
        labels = ["Español", "Otro"]
        return labels[predicted_ids]

    except Exception as e:
        return f"Error al procesar el audio: {str(e)}"

# Interface do Gradio
description_html = """
<p>Prueba con grabación o cargando un archivo de audio. Para probar, recomiendo una palabra.</p>
<p>Ramon Mayor Martins: <a href="https://rmayormartins.github.io/" target="_blank">Website</a> | <a href="https://huggingface.co/rmayormartins" target="_blank">Spaces</a></p>
"""

# Interface do Gradio
interface = gr.Interface(
    fn=classify_accent,
    inputs=gr.Audio(type="numpy"),
    outputs="label",
    title="Clasificador de Sotaques (Español vs Otro)",
    description=description_html
)

interface.launch()