Spaces:
Sleeping
Sleeping
Commit
·
b5c4e01
1
Parent(s):
889e0f6
Fix WavLM processor and update dependencies
Browse files- app.py +32 -14
- requirements.txt +5 -5
app.py
CHANGED
|
@@ -2,7 +2,7 @@ import gradio as gr
|
|
| 2 |
import torch
|
| 3 |
import torchaudio
|
| 4 |
import numpy as np
|
| 5 |
-
from transformers import AutoModel,
|
| 6 |
import librosa
|
| 7 |
import matplotlib.pyplot as plt
|
| 8 |
import seaborn as sns
|
|
@@ -13,11 +13,13 @@ MODEL_NAME = "marcosremar2/wavlm-large-deploy"
|
|
| 13 |
def load_model():
|
| 14 |
"""Carrega o modelo WavLM-Large"""
|
| 15 |
try:
|
| 16 |
-
|
|
|
|
| 17 |
model = AutoModel.from_pretrained(MODEL_NAME)
|
| 18 |
model.eval()
|
| 19 |
return processor, model
|
| 20 |
except Exception as e:
|
|
|
|
| 21 |
return None, None
|
| 22 |
|
| 23 |
processor, model = load_model()
|
|
@@ -28,17 +30,22 @@ def process_audio(audio_file):
|
|
| 28 |
return "Por favor, carregue um arquivo de áudio.", None, None
|
| 29 |
|
| 30 |
if processor is None or model is None:
|
| 31 |
-
return "Erro: Modelo não foi carregado corretamente.", None, None
|
| 32 |
|
| 33 |
try:
|
| 34 |
# Carregar áudio
|
| 35 |
audio, sr = librosa.load(audio_file, sr=16000)
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
# Processar com o modelo
|
| 38 |
-
inputs = processor(audio, sampling_rate=16000, return_tensors="pt")
|
| 39 |
|
| 40 |
with torch.no_grad():
|
| 41 |
-
outputs = model(
|
| 42 |
hidden_states = outputs.last_hidden_state
|
| 43 |
|
| 44 |
# Informações sobre o áudio
|
|
@@ -53,32 +60,35 @@ def process_audio(audio_file):
|
|
| 53 |
- Shape das features: {hidden_states.shape}
|
| 54 |
- Dimensões: {hidden_states.shape[1]} frames × {hidden_states.shape[2]} features
|
| 55 |
- Modelo: {MODEL_NAME}
|
|
|
|
|
|
|
| 56 |
"""
|
| 57 |
|
| 58 |
# Criar visualização das features
|
| 59 |
-
features = hidden_states.squeeze(0).numpy()
|
| 60 |
|
| 61 |
# Plot 1: Waveform
|
| 62 |
fig1, ax1 = plt.subplots(figsize=(12, 4))
|
| 63 |
time_axis = np.linspace(0, duration, len(audio))
|
| 64 |
-
ax1.plot(time_axis, audio)
|
| 65 |
-
ax1.set_title('Forma de Onda do Áudio')
|
| 66 |
ax1.set_xlabel('Tempo (s)')
|
| 67 |
ax1.set_ylabel('Amplitude')
|
| 68 |
ax1.grid(True, alpha=0.3)
|
|
|
|
| 69 |
|
| 70 |
# Plot 2: Features heatmap (primeiras 50 features)
|
| 71 |
fig2, ax2 = plt.subplots(figsize=(12, 8))
|
| 72 |
features_subset = features[:, :50].T # Transpor para ter features nas linhas
|
| 73 |
sns.heatmap(features_subset, ax=ax2, cmap='viridis', cbar_kws={'label': 'Valor da Feature'})
|
| 74 |
-
ax2.set_title('Mapa de Calor das Features WavLM (primeiras 50 dimensões)')
|
| 75 |
ax2.set_xlabel('Frame Temporal')
|
| 76 |
ax2.set_ylabel('Dimensão da Feature')
|
| 77 |
|
| 78 |
return audio_info, fig1, fig2
|
| 79 |
|
| 80 |
except Exception as e:
|
| 81 |
-
return f"Erro ao processar áudio
|
| 82 |
|
| 83 |
def create_demo():
|
| 84 |
"""Cria a interface do Gradio"""
|
|
@@ -87,7 +97,7 @@ def create_demo():
|
|
| 87 |
gr.Markdown("""
|
| 88 |
# 🎵 WavLM-Large Demo
|
| 89 |
|
| 90 |
-
Este é
|
| 91 |
|
| 92 |
O WavLM é um modelo de aprendizado auto-supervisionado para processamento de fala que pode:
|
| 93 |
- Extrair representações ricas de áudio
|
|
@@ -110,14 +120,16 @@ def create_demo():
|
|
| 110 |
)
|
| 111 |
process_btn = gr.Button(
|
| 112 |
"🎯 Processar Áudio",
|
| 113 |
-
variant="primary"
|
|
|
|
| 114 |
)
|
| 115 |
|
| 116 |
gr.Markdown("""
|
| 117 |
### 💡 Dicas:
|
| 118 |
-
- Arquivos de
|
| 119 |
-
- O modelo espera áudio em 16kHz (
|
| 120 |
- Formatos suportados: WAV, MP3, FLAC, M4A
|
|
|
|
| 121 |
""")
|
| 122 |
|
| 123 |
with gr.Column(scale=2):
|
|
@@ -142,6 +154,12 @@ def create_demo():
|
|
| 142 |
- **Treinado em**: 94k horas de áudio (Libri-Light, GigaSpeech, VoxPopuli)
|
| 143 |
- **Paper**: [WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing](https://arxiv.org/abs/2110.13900)
|
| 144 |
- **Repositório**: [marcosremar2/wavlm-large-deploy](https://huggingface.co/marcosremar2/wavlm-large-deploy)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
""")
|
| 146 |
|
| 147 |
return demo
|
|
|
|
| 2 |
import torch
|
| 3 |
import torchaudio
|
| 4 |
import numpy as np
|
| 5 |
+
from transformers import AutoModel, Wav2Vec2Processor
|
| 6 |
import librosa
|
| 7 |
import matplotlib.pyplot as plt
|
| 8 |
import seaborn as sns
|
|
|
|
| 13 |
def load_model():
|
| 14 |
"""Carrega o modelo WavLM-Large"""
|
| 15 |
try:
|
| 16 |
+
# Usar Wav2Vec2Processor para WavLM
|
| 17 |
+
processor = Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h")
|
| 18 |
model = AutoModel.from_pretrained(MODEL_NAME)
|
| 19 |
model.eval()
|
| 20 |
return processor, model
|
| 21 |
except Exception as e:
|
| 22 |
+
print(f"Erro ao carregar modelo: {e}")
|
| 23 |
return None, None
|
| 24 |
|
| 25 |
processor, model = load_model()
|
|
|
|
| 30 |
return "Por favor, carregue um arquivo de áudio.", None, None
|
| 31 |
|
| 32 |
if processor is None or model is None:
|
| 33 |
+
return "Erro: Modelo não foi carregado corretamente. Verifique os logs.", None, None
|
| 34 |
|
| 35 |
try:
|
| 36 |
# Carregar áudio
|
| 37 |
audio, sr = librosa.load(audio_file, sr=16000)
|
| 38 |
|
| 39 |
+
# Limitar duração para evitar problemas de memória
|
| 40 |
+
max_duration = 30 # segundos
|
| 41 |
+
if len(audio) > max_duration * sr:
|
| 42 |
+
audio = audio[:max_duration * sr]
|
| 43 |
+
|
| 44 |
# Processar com o modelo
|
| 45 |
+
inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True)
|
| 46 |
|
| 47 |
with torch.no_grad():
|
| 48 |
+
outputs = model(inputs.input_values)
|
| 49 |
hidden_states = outputs.last_hidden_state
|
| 50 |
|
| 51 |
# Informações sobre o áudio
|
|
|
|
| 60 |
- Shape das features: {hidden_states.shape}
|
| 61 |
- Dimensões: {hidden_states.shape[1]} frames × {hidden_states.shape[2]} features
|
| 62 |
- Modelo: {MODEL_NAME}
|
| 63 |
+
|
| 64 |
+
✅ **Status:** Processamento concluído com sucesso!
|
| 65 |
"""
|
| 66 |
|
| 67 |
# Criar visualização das features
|
| 68 |
+
features = hidden_states.squeeze(0).cpu().numpy()
|
| 69 |
|
| 70 |
# Plot 1: Waveform
|
| 71 |
fig1, ax1 = plt.subplots(figsize=(12, 4))
|
| 72 |
time_axis = np.linspace(0, duration, len(audio))
|
| 73 |
+
ax1.plot(time_axis, audio, color='blue', linewidth=0.5)
|
| 74 |
+
ax1.set_title('Forma de Onda do Áudio', fontsize=14, fontweight='bold')
|
| 75 |
ax1.set_xlabel('Tempo (s)')
|
| 76 |
ax1.set_ylabel('Amplitude')
|
| 77 |
ax1.grid(True, alpha=0.3)
|
| 78 |
+
ax1.set_facecolor('#f8f9fa')
|
| 79 |
|
| 80 |
# Plot 2: Features heatmap (primeiras 50 features)
|
| 81 |
fig2, ax2 = plt.subplots(figsize=(12, 8))
|
| 82 |
features_subset = features[:, :50].T # Transpor para ter features nas linhas
|
| 83 |
sns.heatmap(features_subset, ax=ax2, cmap='viridis', cbar_kws={'label': 'Valor da Feature'})
|
| 84 |
+
ax2.set_title('Mapa de Calor das Features WavLM (primeiras 50 dimensões)', fontsize=14, fontweight='bold')
|
| 85 |
ax2.set_xlabel('Frame Temporal')
|
| 86 |
ax2.set_ylabel('Dimensão da Feature')
|
| 87 |
|
| 88 |
return audio_info, fig1, fig2
|
| 89 |
|
| 90 |
except Exception as e:
|
| 91 |
+
return f"❌ **Erro ao processar áudio:** {str(e)}\n\nVerifique se o arquivo é um áudio válido.", None, None
|
| 92 |
|
| 93 |
def create_demo():
|
| 94 |
"""Cria a interface do Gradio"""
|
|
|
|
| 97 |
gr.Markdown("""
|
| 98 |
# 🎵 WavLM-Large Demo
|
| 99 |
|
| 100 |
+
Este é uma demonstração do modelo **WavLM-Large** da Microsoft, disponibilizado por marcosremar2.
|
| 101 |
|
| 102 |
O WavLM é um modelo de aprendizado auto-supervisionado para processamento de fala que pode:
|
| 103 |
- Extrair representações ricas de áudio
|
|
|
|
| 120 |
)
|
| 121 |
process_btn = gr.Button(
|
| 122 |
"🎯 Processar Áudio",
|
| 123 |
+
variant="primary",
|
| 124 |
+
size="lg"
|
| 125 |
)
|
| 126 |
|
| 127 |
gr.Markdown("""
|
| 128 |
### 💡 Dicas:
|
| 129 |
+
- Arquivos de até 30 segundos (será cortado automaticamente)
|
| 130 |
+
- O modelo espera áudio em 16kHz (convertido automaticamente)
|
| 131 |
- Formatos suportados: WAV, MP3, FLAC, M4A
|
| 132 |
+
- Para melhores resultados, use áudio de fala limpo
|
| 133 |
""")
|
| 134 |
|
| 135 |
with gr.Column(scale=2):
|
|
|
|
| 154 |
- **Treinado em**: 94k horas de áudio (Libri-Light, GigaSpeech, VoxPopuli)
|
| 155 |
- **Paper**: [WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing](https://arxiv.org/abs/2110.13900)
|
| 156 |
- **Repositório**: [marcosremar2/wavlm-large-deploy](https://huggingface.co/marcosremar2/wavlm-large-deploy)
|
| 157 |
+
|
| 158 |
+
### ⚙️ Detalhes Técnicos:
|
| 159 |
+
- **Arquitetura**: Transformer de 24 camadas
|
| 160 |
+
- **Hidden Size**: 1024
|
| 161 |
+
- **Attention Heads**: 16
|
| 162 |
+
- **Taxa de Amostragem**: 16kHz
|
| 163 |
""")
|
| 164 |
|
| 165 |
return demo
|
requirements.txt
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
-
gradio>=4.
|
| 2 |
torch>=2.0.0
|
| 3 |
torchaudio>=2.0.0
|
| 4 |
-
transformers>=4.
|
| 5 |
librosa>=0.10.0
|
| 6 |
-
matplotlib>=3.
|
| 7 |
-
seaborn>=0.
|
| 8 |
-
numpy>=1.
|
| 9 |
soundfile>=0.12.0
|
|
|
|
| 1 |
+
gradio>=4.44.0
|
| 2 |
torch>=2.0.0
|
| 3 |
torchaudio>=2.0.0
|
| 4 |
+
transformers>=4.35.0
|
| 5 |
librosa>=0.10.0
|
| 6 |
+
matplotlib>=3.7.0
|
| 7 |
+
seaborn>=0.12.0
|
| 8 |
+
numpy>=1.24.0
|
| 9 |
soundfile>=0.12.0
|