Ir al contenido

Índice de transmisión del habla (STI)

Normas aplicables: IEC 60268Referencias: Houtgast y Steeneken 1985

Un sistema de megafonía, un interfono, un aula reverberante: cada uno es un canal de transmisión entre la boca de quien habla y el oído de quien escucha, y cada uno degrada el habla a su manera. El índice de transmisión del habla (STI) de IEC 60268-16 califica ese canal con un único número en [0, 1] midiendo cuánta de la envolvente del habla sobrevive al trayecto. Esta página cubre la física de transferencia de modulación en la que se basa el índice, el método indirecto desde una respuesta al impulso medida en la sala y la medición STIPA directa con su señal de ensayo normalizada.

¿Cómo calculo el índice de transmisión del habla de IEC 60268-16 con Python?

Sección titulada «¿Cómo calculo el índice de transmisión del habla de IEC 60268-16 con Python?»

A partir de una respuesta al impulso medida en la sala, llama a hearing.sti_from_impulse_response(ir, fs, snr=25.0). El resultado da sti en la escala de 0 a 1, su letra de valoración rating del Anexo F y los siete índices de transferencia de modulación por banda de octava. Para la medición directa, reproduce hearing.stipa_signal(fs) en la sala y pasa la grabación a hearing.stipa(recording, fs).

1. La función de transferencia de modulación

Sección titulada «1. La función de transferencia de modulación»

La reverberación y el ruido no amortiguan el habla de manera uniforme; emborronan su envolvente: las modulaciones lentas de intensidad (0,63–12,5 Hz) que transportan las sílabas. El STI cuantifica cuánta de esa modulación sobrevive de la boca al oído, por banda de octava, como la función de transferencia de modulación (MTF) m(F). Un canal tipo delta mantiene m = 1 (STI = 1); la reverberación filtra paso-bajo la envolvente siguiendo la forma cerrada de Schroeder, y el ruido estacionario la escala:

La profundidad de modulación es lo que merece la pena medir porque la inteligibilidad viaja en la profundidad de los valles de la envolvente, no en la sonoridad de los picos. Quien habla alterna ráfagas de energía (vocales) con casi silencios (oclusiones, arranques de fricativas) al ritmo de las sílabas, y quien escucha segmenta el habla oyendo esos valles. Una cola reverberante rellena los valles por detrás, porque la energía tardía se esparce en los huecos; el ruido estacionario eleva su suelo. En ambos casos la profundidad de modulación recibida se encoge, y con ella el contraste entre sonidos del habla, aunque el nivel medio apenas cambie. El método completo sondea m(F) en 14 frecuencias de modulación (de 0,63 Hz a 12,5 Hz en pasos de tercio de octava) en cada una de las 7 bandas de octava de 125 Hz a 8 kHz, convierte cada m en una relación señal-ruido efectiva acotada a ±15 dB y combina los resultados, ponderados por banda, en el índice: el STI es una SNR efectiva de la envolvente, llevada a [0, 1].

STI frente al tiempo de reverberación con las bandas de calificación del Anexo F de IEC 60268-16 sombreadasSTI frente al tiempo de reverberación con las bandas de calificación del Anexo F de IEC 60268-16 sombreadas
Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import hearing
fs = 48000
# STI frente al tiempo de reverberación: barre hearing.sti_from_impulse_response sobre
# decaimientos exponenciales sintéticos (ruido blanco x exp(-6.9077 t / T60))
# en una rejilla de T60, exactamente la física de la curva de arriba:
rng = np.random.default_rng(0)
t60_grid = np.array([0.3, 0.5, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 5.0])
sti_values = []
for t60 in t60_grid:
t = np.arange(int(2 * t60 * fs)) / fs
ir = rng.standard_normal(t.size) * np.exp(-6.9077 * t / t60)
sti_values.append(hearing.sti_from_impulse_response(ir, fs).sti)
fig, ax = plt.subplots()
ax.semilogx(t60_grid, sti_values, "o-")
ax.set_xlabel("Tiempo de reverberación T60 [s]")
ax.set_ylabel("STI")
ax.set_ylim(0.0, 1.0)
ax.grid(True, which="both", alpha=0.3)
plt.show()
import numpy as np
from phonometry import hearing
fs = 48000
# Una respuesta al impulso medida en la sala (decaimiento sintetizado para que el ejemplo funcione)
ir = np.random.default_rng(0).standard_normal(fs) * np.exp(-6.9 * np.arange(fs) / fs / 0.5)
# Método indirecto: desde una respuesta al impulso medida en la sala
res = hearing.sti_from_impulse_response(ir, fs, snr=25.0)
print(f"STI = {res.sti:.2f} ({res.rating})") # p. ej. 0.62 (D)
# Medición STIPA directa: reproduce hearing.stipa_signal() en la sala y grábala
test = hearing.stipa_signal(fs, seconds=18.0, level_db=80.0)
recording = test # en la práctica, la señal del micrófono tras la reproducción
res = hearing.stipa(recording, fs)
res.plot() # barras del índice de transferencia de modulación (MTI) por banda; STI y valoración en el título

Venga de donde venga, conviene leer el resultado banda a banda antes de citar el número único: el STI es una combinación ponderada de siete índices de transferencia de modulación por banda de octava, y una sala suele fallar en una parte concreta del espectro, no de forma uniforme.

Índice de transferencia de modulación por banda de octava de 125 Hz a 8 kHz para una sala con tiempo de reverberación de 0,9 s y relación señal-ruido de habla de 15 dB: las siete barras quedan juntas entre 0,54 y 0,60 aproximadamente, con STI = 0,58 y valoración E del Anexo FÍndice de transferencia de modulación por banda de octava de 125 Hz a 8 kHz para una sala con tiempo de reverberación de 0,9 s y relación señal-ruido de habla de 15 dB: las siete barras quedan juntas entre 0,54 y 0,60 aproximadamente, con STI = 0,58 y valoración E del Anexo F
Mostrar el código de esta figura
import numpy as np
import matplotlib.pyplot as plt
from phonometry import hearing
# Una sala reverberante (T60 = 0,9 s) medida con una relación señal-ruido de
# habla de 15 dB: una caída exponencial sintetizada hace de RI medida.
fs = 48000
rng = np.random.default_rng(0)
n = np.arange(fs)
ir = rng.standard_normal(fs) * np.exp(-6.9078 * n / fs / 0.9)
res = hearing.sti_from_impulse_response(ir, fs, snr=15.0)
print(round(res.sti, 3), res.rating) # 0.583 E
# En una línea: las barras de MTI por banda con el STI y su valoración.
res.plot(language="es")
plt.show()
# A mano, reproduciendo lo que dibuja STIResult.plot():
bandas = [125, 250, 500, 1000, 2000, 4000, 8000]
fig, ax = plt.subplots()
ax.bar(np.arange(len(bandas)), res.mti)
ax.set_xticks(np.arange(len(bandas)))
ax.set_xticklabels([f"{b}" for b in bandas])
ax.set_xlabel("Frecuencia [Hz]")
ax.set_ylabel("Índice de transferencia de modulación MTI")
ax.set_ylim(0.0, 1.0)
ax.set_title(f"STI = {res.sti:.2f} (valoración {res.rating})")
plt.show()

En esta sala los siete índices quedan dentro de 0,06 entre sí, la firma de una caída uniforme en todo el espectro más un suelo de ruido de banda ancha. Un perfil que se hunde en 125 Hz y 250 Hz apunta a reverberación en graves (poca absorción a baja frecuencia), mientras que uno que cae solo en 4 kHz y 8 kHz suele significar que el altavoz no cubre con sonido directo la posición del oyente, porque el aire y la directividad se llevan primero las bandas agudas. Son remedios distintos, y solo la vista por bandas los distingue.

La medición directa envía la señal STIPA por toda la cadena dibujada abajo, desde la fuente a través de la sala hasta el micrófono y hasta el análisis de modulación por banda que produce el índice.

Cadena de medición del STI: señal de la fuente STIPA a través de la sala hasta el micrófono y el análisis de la MTFCadena de medición del STI: señal de la fuente STIPA a través de la sala hasta el micrófono y el análisis de la MTF

stipa emite un UserWarning cuando la grabación es más corta que los 15 s recomendados (práctica STIPA de IEC 60268-16, de 15 s a 25 s): por debajo de eso las componentes de modulación lentas se promedian sobre muy pocos periodos y el STI queda sesgado a la baja (un lazo ideal da STI ≈ 0,956 a 5 s frente a ≈ 0,998 a 18 s).

La implementación sigue la Edición 5 (2020): el PDF normativo de la Edición 4 es la base y cada cambio de la Ed. 5 está atribuido a su fuente en el código; el único delta numérico es el espectro de habla masculina revisado del apartado A.6.1. CI comprueba los vectores de verificación de la propia norma: los seis pares de bandas de los factores de ponderación a ±0,001 STI, la tabla de correspondencia m ↔ STI, los puntos de control del enmascaramiento dependiente del nivel y decaimientos con la forma de Schroeder a cuatro valores de T₆₀.

El analizador también se verifica de extremo a extremo con las señales del banco de verificación de IEC 60268-16 rev 5 de stipa.info (Embedded Acoustics BV): la escalera de profundidad de modulación del método directo (Anexo C.3.2), los decaimientos exponenciales del método indirecto frente a la MTF de Schroeder en forma cerrada (C.3.3), la prueba de pendiente del banco de filtros con un tono adyacente sin modular a +41 dB (C.4.2, m ≥ 0,5), los pares de bandas de los factores de ponderación (A.2.2) y la prueba de distorsión de fase del banco de filtros con portadoras en los bordes de media octava (A.3.1.2, |sesgo de STI| < 0,01 en TI = 0,1–0,9). Las cinco series pasan con las funciones dependientes del nivel desactivadas, como prescribe el banco. Los 49 WAV certificados permanecen en local (datos de terceros, no versionados); CI reconstruye las mismas señales de forma sintética en la serie de conformidad.

Cada vía tiene modos de fallo que la norma hace explícitos:

  • Canales no lineales o variantes en el tiempo. El método indirecto asume un canal lineal e invariante en el tiempo: una respuesta al impulso no puede representar el recorte, los compresores, el control automático de ganancia ni un vocoder. Para un sistema de sonido con procesado no lineal en la cadena, mide en directo: la señal STIPA al menos atraviesa la cadena real, y la señal del STI completo es la opción fiable cuando la distorsión es severa (IEC 60268-16, apartado 6.3 y Tabla 3).
  • Efectos dependientes del nivel. El STI no es invariante con el nivel: el enmascaramiento auditivo y el umbral de recepción actúan sobre los niveles de banda absolutos en el oyente. Reproduce la señal de ensayo al nivel de operación del sistema (la práctica del Anexo J de la norma la fija 3 dB por encima del L_Aeq del habla continua en la posición) y pasa level= y ambient= para que el análisis los incluya; una respuesta al impulso medida a nivel alto y reescalada después pierde estos efectos por completo.
  • Ruido de fondo impulsivo y fluctuante. Una herramienta que cae o un murmullo durante una medición directa corrompe las profundidades de modulación medidas (apartado 7.13). El remedio de la norma es la vía indirecta: promedia la respuesta al impulso con MLS o barridos para obtener una MTF sin ruido y añade después la degradación por ruido mediante snr= o level=/ambient=. Una comprobación rápida es ejecutar el analizador con la fuente apagada; el STI residual debería quedar por debajo de 0,20.
  • Dispersión estadística. La señal STIPA es ruido pseudoaleatorio, así que mediciones directas repetidas se dispersan hasta alrededor de 0,03 STI incluso en condiciones estacionarias (y más en ruido fluctuante); repite y compara en lugar de fiarte de una sola pasada, y respeta la duración mínima que señala el UserWarning de arriba.

Parámetros de sti_from_impulse_response() / stipa()

Sección titulada «Parámetros de sti_from_impulse_response() / stipa()»
ParámetroTipoUnidadesRango / valor por defectoNotas
ir / xarray 1Dcualquiera / Pano vacíoRespuesta al impulso (indirecto) o grabación STIPA (directo)
fsintHz> 0
snrfloat o vector de 7, opcionaldBpor defecto NoneAñade la degradación por ruido estacionario
levelvector de 7, opcionaldB SPLpor defecto NoneActiva el enmascaramiento auditivo + umbral de recepción (Tablas A.2/A.3)
ambientvector de 7, opcionaldB SPLrequiere levelNiveles de banda del ruido ambiente
referencearray 1D, opcional (stipa)por defecto NoneSeñal de la fuente medida en lugar del m = 0,55 nominal

Ambas devuelven STIResult: sti, mti (7 bandas), mtf (7×14 o 7×2), band_levels, rating (letra del Anexo F, A+U).

STIResult.report(path) genera una ficha PDF de una página dispuesta como un informe de verificación de inteligibilidad de un sistema de megafonía o de alarma por voz: una línea de norma base que indica el método de medición (el método indirecto de STI completo a partir de una respuesta al impulso, o el método directo STIPA sobre una señal grabada), un bloque de metadatos opcional, una tabla del índice de transferencia de modulación MTI por bandas de octava junto a las barras de MTI por banda (el .plot() del propio resultado), el número único enmarcado STI = X con la banda de calificación del Anexo F, una fila de veredicto opcional y un pie con el descargo fijo. Usa el mismo contenedor ReportMetadata y el mismo motor que la ficha de aislamiento de ISO 717; un requirement indicado se interpreta como el STI mínimo exigido (un STI mayor cumple). La generación necesita reportlab (pip install phonometry[report]); solo se admite engine="reportlab". Pasa language="es" para la ficha en español.

from phonometry import hearing, ReportMetadata
res = hearing.sti_from_impulse_response(ir, fs)
res.report(
"sti_fiche.pdf",
metadata=ReportMetadata(
specimen="Línea de altavoces de alarma por voz en vestíbulo",
measurement_standard="IEC 60268-16",
laboratory="Laboratorio de referencia Phonometry",
requirement=0.5, # STI mínimo exigido (un STI mayor cumple)
),
language="es",
)

La ficha de ejemplo se regenera con make reports y se mantiene renderizada en el repositorio; pulsa la vista previa para abrir el PDF.

Informe de ejemplo STI IEC 60268-16 (PDF)

Ficha de índice de transmisión del habla de una página: cabecera de metadatos, tabla del índice de transferencia de modulación por bandas de octava, barras de MTI por banda, el número único enmarcado STI = 0,64 con la banda de calificación del Anexo F y un veredicto CUMPLE frente a un mínimo de 0,5.

Descargar el informe (PDF)

Ficha de índice de transmisión del habla (STIResult.report), STI con la banda del Anexo F.

Cubierto. La IEC 60268-16:2020 (Edición 5) para la opción de habla masculina, la única que conserva la Edición 5: la función de transferencia de modulación y la correspondencia m a STI (apartados A.5.2 a A.5.6), el método indirecto de STI completo desde una respuesta al impulso medida mediante hearing.sti_from_impulse_response(), el método directo STIPA del Anexo B mediante hearing.stipa_signal() y hearing.stipa(), el espectro de la señal de ensayo masculina de la Ed. 5 del apartado A.6.1, las correcciones de enmascaramiento auditivo dependiente del nivel y de umbral de recepción de las Tablas A.2 y A.3 (level= y ambient=), y las letras de valoración del Anexo F devueltas como STIResult.rating.

No cubierto. La medición directa de STI completo (la señal de ensayo de 14 frecuencias de modulación reproducida y grabada a través de la cadena real, según el apartado 6.3 y la Tabla 3, recomendada arriba cuando la distorsión es severa) no está implementada: solo están disponibles la señal directa STIPA (stipa_signal/stipa) y el cálculo indirecto de STI completo desde una respuesta al impulso. La opción de habla femenina no falta en la biblioteca: la propia Edición 5 la eliminó (preámbulo, punto d), así que no queda nada por implementar.

  • Houtgast, T. y Steeneken, H. J. M. (1985). A review of the MTF concept in room acoustics and its use for estimating speech intelligibility in auditoria. The Journal of the Acoustical Society of America, 77(3), 1069-1077. https://doi.org/10.1121/1.392224El marco de transferencia de modulación de la sección 1 y la correspondencia m ↔ STI sobre la que se construye el índice.
  • International Electrotechnical Commission. (2020). Sound system equipment — Part 16: Objective rating of speech intelligibility by speech transmission index (IEC 60268-16:2020 (Edición 5)). La función de transferencia de modulación y la correspondencia m ↔ STI, la señal de ensayo STIPA y el método directo, el método indirecto desde la respuesta al impulso, el enmascaramiento auditivo y el umbral de recepción (Tablas A.2/A.3), el espectro de habla masculina revisado (apartado A.6.1) y las letras de valoración del Anexo F. El PDF normativo de la Edición 4 es la base y cada cambio de la Ed. 5 está atribuido a su fuente, siendo el único delta numérico el espectro de habla masculina revisado del apartado A.6.1.