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.
    """)