File size: 7,314 Bytes
ccaafbc 2ad6a3c 0b303e8 6761537 935e70b acad861 2decea7 1b73455 ac679a1 8d5546e 1ed8ecd 3eecf76 4912c5a 3eecf76 4912c5a 3eecf76 f559c3a e521043 839c572 3769ca7 2643793 a677e1b 2643793 3769ca7 2643793 3769ca7 2643793 cbbdadf acad861 cbbdadf 2decea7 98491b9 404991d fbb0b2a 2decea7 404991d cbbdadf 2decea7 cbbdadf 2322097 663e0e0 2322097 fbb0b2a 2322097 2decea7 2322097 2decea7 fbb0b2a 98491b9 fbb0b2a 98491b9 cebef2c 2decea7 fbb0b2a 1fbfe0d 5034269 1fbfe0d 663e0e0 1fbfe0d 2decea7 |
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 |
import streamlit as st
import librosa
from speechbrain.inference.classifiers import EncoderClassifier
import tempfile
import streamlit as st
import io
import matplotlib.pyplot as plt
import streamlit as st
import tempfile
from speechbrain.inference.classifiers import EncoderClassifier
import numpy as np
from pydub import AudioSegment
# Convertir MP3 a WAV antes de pasar al modelo
def convertir_a_wav(uploaded_file):
audio = AudioSegment.from_file(uploaded_file)
tmp_wav = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
audio.export(tmp_wav.name, format="wav")
return tmp_wav.name
# Cargar el modelo de SpeechBrain
@st.cache_resource
def cargar_modelo_speechbrain():
return EncoderClassifier.from_hparams(
source="speechbrain/urbansound8k_ecapa",
savedir="pretrained_models/urbansound8k_ecapa"
)
st.title("Muestra de Implementación Reconocimiento de Audio Ambiental para la Detección de situaciones de Emergencia en Vehículos Inteligentes")
st.write("""
En la actualidad, los sistemas de asistencia al conductor han centrado sus esfuerzos principalmente en la percepción visual,
incorporando tecnologías como sensores de proximidad, cámaras y radares. No obstante, uno de los sentidos humanos menos explorados
dentro de los sistemas inteligentes de los automóviles es el sentido auditivo.
En entornos urbanos, donde los sonidos de emergencia tales como las sirenas de ambulancias, patrullas policiales o camiones de bomberos
desempeñan un papel fundamental en la seguridad vial, es preocupante que muchos conductores no respondan adecuadamente ante su presencia.
Factores como el volumen de la música, el aislamiento acústico del vehículo o la simple distracción contribuyen a esta falta de reacción oportuna.
""")
st.subheader("Objetivo del Proyecto")
st.write("""
El propósito de este proyecto es desarrollar un sistema auditivo inteligente para detectar sirenas en entornos urbanos desde el interior del vehículo.
""")
st.subheader(" ¿Cómo Funciona?")
st.write("""
1. Carga o graba un audio.
2. El sistema analiza el sonido con un modelo para procesamiento de audio.
3. Si detecta una sirena, genera una alerta.
""")
st.write("Sube un archivo de audio (.wav o .mp3) para escucharlo.")
# Subida de archivo
audio_file = st.file_uploader("Sube tu archivo de audio aquí", type=["wav", "mp3"])
# Reproducir audio si se ha subido
if audio_file is not None:
st.audio(audio_file, format='audio/wav')
st.success("✅ Archivo cargado exitosamente.")
# Function to record audio
def record_audio(filename="recorded.wav", duration=3, fs=22050):
st.info("Grabando")
#recording = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype=np.int16)
#sd.wait()
#wavio.write(filename, recording, fs, sampwidth=2)
#st.session_state["recorded_file"] = filename
st.info("Audio No detectado")
# Streamlit UI
st.title("Grabar Audio")
if "recorded_file" not in st.session_state:
st.session_state["recorded_file"] = None
if st.button("Grabando..."):
print("Subir Audio de prueba")
modelo_sb = cargar_modelo_speechbrain()
st.write("Tiempo estimado de procesamiento: 15 seg")
if audio_file is not None:
# Cargar audio con librosa
audio_bytes = audio_file.read()
y, sr = librosa.load(io.BytesIO(audio_bytes), sr=None)
st.audio(audio_bytes, format='audio/mp3')
# Mostrar información del audio
duration = librosa.get_duration(y=y, sr=sr)
st.markdown(f"**Duración:** {duration:.2f} segundos")
st.markdown(f"**Tasa de muestreo:** {sr} Hz")
# Forma de onda
st.subheader("Forma de Onda")
fig_wave, ax_wave = plt.subplots(figsize=(10, 3))
librosa.display.waveshow(y, sr=sr, ax=ax_wave)
ax_wave.set_title("Forma de Onda")
ax_wave.set_xlabel("Tiempo (s)")
ax_wave.set_ylabel("Amplitud")
st.pyplot(fig_wave)
# Espectrograma
st.subheader("Espectrograma")
fig_spec, ax_spec = plt.subplots(figsize=(10, 4))
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
img = librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log', ax=ax_spec)
ax_spec.set_title("Espectrograma Logarítmico")
fig_spec.colorbar(img, ax=ax_spec, format="%+2.f dB")
st.pyplot(fig_spec)
# Energía del audio
st.subheader("Energía a lo largo del tiempo")
hop_length = 512
frame_length = 1024
energy = np.array([
sum(abs(y[i:i+frame_length]**2))
for i in range(0, len(y), hop_length)
])
fig_energy, ax_energy = plt.subplots(figsize=(10, 2.5))
ax_energy.plot(energy, color='orange')
ax_energy.set_title("Energía del audio")
ax_energy.set_xlabel("Frames")
ax_energy.set_ylabel("Energía")
st.pyplot(fig_energy)
# Espectro promedio
st.subheader("Espectro Promedio (Frecuencia vs Magnitud)")
S = np.abs(librosa.stft(y))
spectral_avg = np.mean(S, axis=1)
freqs = librosa.fft_frequencies(sr=sr)
fig_spec_avg, ax_spec_avg = plt.subplots(figsize=(10, 3))
ax_spec_avg.semilogy(freqs, spectral_avg)
ax_spec_avg.set_xlabel("Frecuencia (Hz)")
ax_spec_avg.set_ylabel("Magnitud promedio")
ax_spec_avg.set_title("Espectro Promedio")
st.pyplot(fig_spec_avg)
# Spectral Roll-off
st.subheader("Punto de Roll-off Espectral")
rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)[0]
fig_roll, ax_roll = plt.subplots(figsize=(10, 2.5))
ax_roll.plot(rolloff, color='purple')
ax_roll.set_ylabel('Hz')
ax_roll.set_xlabel('Frames')
ax_roll.set_title('Spectral Roll-off (frecuencia donde se concentra la energía)')
st.pyplot(fig_roll)
from speechbrain.inference.classifiers import EncoderClassifier
st.audio(audio_file, format='audio/mp3')
# Convertir a WAV
wav_path = convertir_a_wav(audio_file)
# Clasificar con SpeechBrain
prediccion = modelo_sb.classify_file(wav_path)
clase_predicha = prediccion[3][0]
st.markdown(f"**Predicción del modelo:** {clase_predicha}")
if clase_predicha.lower() == "siren":
st.warning("Sirena detectada en el audio.!!!!!")
else:
st.info("No se detectó sirena en el audio.")
st.subheader("Conclusión y Aplicaciones del Modelo")
with st.expander("Ver Conclusión"):
st.markdown("""
**Este proyecto demuestra la viabilidad de utilizar modelos de reconocimiento acústico para detectar sonidos críticos como las sirenas de ambulancia en entornos urbanos.** A través de un sistema auditivo pasivo, se pueden generar alertas en tiempo real dentro del vehículo sin necesidad de intervención del conductor.
---
### Aplicaciones en vehículos inteligentes
- **Asistencia al conductor en tiempo real: Al detectar sirenas, el vehículo puede alertar al conductor para que tome decisiones seguras, como ceder el paso a vehículos de emergencia, asi ser complemento a sensores visuales**: Este sistema actúa como un canal sensorial adicional que no depende de la visibilidad, mejorando la percepción del entorno.
---
### Conclusión final
Este sistema demuestra cómo los modelos de audio de procesamiento pueden implementarse para **mejorar la seguridad vial** y **la capacidad de respuesta del conductor ** ante situaciones de emergencia.
""")
|