File size: 7,277 Bytes
f4275b5
 
 
 
 
 
 
 
 
 
87071e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ac1c7b9
 
87071e6
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
---
title: SimulStreaming ASR
emoji: 🎙️
colorFrom: blue
colorTo: green
sdk: docker
app_file: app.py
pinned: false
---

# SimulStreaming ASR — Hugging Face Space

Interfaz de transcripción en tiempo real (Streaming ASR) basada en SimulWhisper, desplegada como Hugging Face Space.

## Características

- **Grabación en tiempo real**: Captura audio desde el navegador (micrófono).
- **Transcripción incremental**: Cada fragmento (chunk) se procesa y devuelve texto a medida que hablas.
- **Baja latencia**: Envío de chunks cada ~1 segundo mediante HTTP POST.
- **UI sencilla**: Interfaz Gradio con botones Start/Stop.

## Estructura de archivos

```
space/
├── app.py                 # FastAPI + Gradio UI
├── server_wrapper.py      # Wrapper para SimulWhisper + threading safety
├── requirements.txt       # Dependencias
└── README.md              # Este archivo
```

## Requisitos para despliegue en HF Spaces

1. **Cuenta en Hugging Face** con acceso a Spaces.
2. **Git LFS** para manejar modelos grandes (el archivo `large-v3.pt` es ~3GB).
3. **Credenciales HF** configuradas localmente.

## Pasos para desplegar

### 1. Crear un repositorio nuevo en Hugging Face Spaces

Accede a https://huggingface.co/spaces y crea un nuevo Space:

- **Nombre**: `simulstreaming-asr` (o el que prefieras)
- **Licencia**: Selecciona una (ej. `mit`)
- **Type**: Docker o Python (recomendamos **Docker** para control total)

### 2. Clonar el repositorio del Space localmente

```bash
huggingface-cli repo create simulstreaming-asr --type space --space-sdk docker
git clone https://huggingface.co/spaces/<tu-usuario>/simulstreaming-asr
cd simulstreaming-asr
```

Reemplaza `<tu-usuario>` con tu nombre de usuario en HF.

### 3. Preparar archivos

Copia los archivos del proyecto al repositorio del Space:

```bash
# Desde la raíz del repositorio HF Space
cp -r /gpfs/projects/bsc88/speech/TTS/repos/Streaming_Mamba/SimulStreaming/space/* .

# Si usas Docker, copia también estos archivos:
cp Dockerfile .
cp .dockerignore .
```

### 4. Descargar y versionar el modelo

El modelo `large-v3.pt` es muy grande (~3GB). Tienes dos opciones:

#### Opción A: Descargar el modelo en el Space (recomendado para iteración rápida)

Si el Space está en **Docker** o **Gradio Lite**, puedes usar un `startup_script`:

```bash
# Crea un archivo startup_script.sh en la raíz del Space
cat > startup_script.sh << 'EOF'
#!/bin/bash
# Descargar modelo si no existe
if [ ! -f "/app/large-v3.pt" ]; then
    echo "Descargando modelo Whisper large-v3..."
    cd /app
    python -c "
import torch
model = torch.hub.load('openai/whisper', 'large-v3')
# O descargar directamente:
# import urllib.request
# urllib.request.urlretrieve('https://openaipublic.blob.core.windows.net/main/models/gpt-2/python/models/model_117M.json', 'large-v3.pt')
"
fi
echo "Modelo listo."
EOF
chmod +x startup_script.sh
```

#### Opción B: Usar un modelo más pequeño

Si `large-v3.pt` es demasiado grande para el Space, usa `medium.pt` (~1.5GB) o `small.pt` (~461MB). Edita `server_wrapper.py`:

```python
model_path='./small.pt'  # o 'medium.pt'
```

### 5. Git LFS para archivos grandes (si es necesario)

```bash
# Instala Git LFS si aún no lo tienes
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs

# Dentro del repositorio del Space
git lfs install
git lfs track "*.pt"
echo "*.pt" >> .gitattributes

# Si tienes el modelo localmente
cp /ruta/al/large-v3.pt .
git add large-v3.pt .gitattributes
```

### 6. Configuración del Space (si es Docker)

Crea un `Dockerfile`:

```dockerfile
FROM python:3.10-slim

WORKDIR /app

# Instala dependencias del sistema
RUN apt-get update && apt-get install -y \
    libsndfile1 \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

# Copia archivos
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# Descarga modelo Whisper (opcional, comentar si está en git-lfs)
# RUN python -c "import torch; torch.hub.load('openai/whisper', 'large-v3')"

EXPOSE 7860

CMD ["python", "app.py"]
```

Crea un `.dockerignore`:

```
.git
.gitignore
__pycache__
*.pyc
.pytest_cache
.env
```

### 7. Push al Space

```bash
git add .
git commit -m "Initial commit: SimulStreaming ASR with Gradio UI"
git push
```

HF Spaces compilará el Docker (o instalará dependencias si es Gradio) y desplegará la app.

### 8. Monitorear el despliegue

- Ve a https://huggingface.co/spaces/<tu-usuario>/simulstreaming-asr
- Verifica que el Space esté en estado "Running" (espera ~5-10 min).
- Si hay errores, revisa los **Logs** en la UI del Space.

## Prueba del Space

1. Una vez que el Space esté corriendo, abre la URL en tu navegador.
2. Pulsa **"Start Recording"**.
3. Habla en el micrófono.
4. Verás la transcripción aparecer en tiempo real.
5. Pulsa **"Stop Recording"** para finalizar.

## Troubleshooting

### El modelo tarda mucho en cargar

- **Causa**: El modelo se descarga / compila la primera vez.
- **Solución**: Espera. Si es muy lenta, usa un modelo más pequeño (`small.pt` o `medium.pt`).

### "No se puede acceder al micrófono"

- **Causa**: HTTPS requerido en navegador.
- **Solución**: Hugging Face Spaces sirve HTTPS por defecto. Si usas local, accede a `https://localhost:7860`.

### Transcripción lenta o truncada

- **Causa**: Latencia de red o procesamiento.
- **Solución**: Aumenta `audio_min_len` y `audio_max_len` en `server_wrapper.py`, o reduce `min_chunk_size`.

### "Model not initialized"

- **Causa**: La startup no completó.
- **Solución**: Mira los logs del Space, aumenta el timeout o revisa `requirements.txt`.

## Desarrollo local

Para probar antes de subir a HF Spaces:

```bash
cd /gpfs/projects/bsc88/speech/TTS/repos/Streaming_Mamba/SimulStreaming/space

# Instalar dependencias
pip install -r requirements.txt

# Ejecutar app localmente
python app.py
```

Abre `http://localhost:7860` (o `https://localhost:7860` si HTTPS).

## Configuración personalizada

Edita `server_wrapper.py` para cambiar:

- `model_path`: Ruta al modelo Whisper.
- `lan`: Idioma (e.g., `'es'` para español).
- `task`: `'transcribe'` o `'translate'`.
- `min_chunk_size`: Duración mínima del chunk (segundos).

## Límites y consideraciones

- **GPU**: HF Spaces proporciona GPU limitada (si la seleccionas). Verifica espacio en disco.
- **Almacenamiento**: Modelos grandes requieren >5GB. Asegúrate de usar Git LFS.
- **Tiempo de ejecución**: HF Spaces tiene límites de tiempo; si el modelo es muy grande, podría timeout.

## API HTTP

Si prefieres un cliente diferente (no el JS de Gradio), puedes llamar los endpoints directamente:

```bash
# Reset
curl -X POST http://localhost:7860/api/reset

# Enviar chunk (archivo WAV 16kHz)
curl -X POST -F "file=@chunk.wav" http://localhost:7860/api/chunk

# Finalizar transcripción
curl -X POST http://localhost:7860/api/finish
```

## Referencias

- [Hugging Face Spaces Docs](https://huggingface.co/docs/hub/spaces-overview)
- [Gradio Docs](https://www.gradio.app)
- [SimulWhisper GitHub](https://github.com/backspacetg/simul_whisper)
- [Whisper Streaming GitHub](https://github.com/ufal/whisper_streaming)

---

¿Preguntas? Abre un issue o contacta con el equipo de desarrollo.